diff --git a/activity/activity-compose/build.gradle b/activity/activity-compose/build.gradle
index 14265b5..0594971 100644
--- a/activity/activity-compose/build.gradle
+++ b/activity/activity-compose/build.gradle
@@ -36,7 +36,7 @@
     implementation(libs.kotlinCoroutinesCore)
     api("androidx.compose.runtime:runtime:1.7.0")
     api("androidx.compose.runtime:runtime-saveable:1.7.0")
-    api(project(":activity:activity"))
+    api(project(":activity:activity-ktx"))
     api("androidx.compose.ui:ui:1.0.1")
     api("androidx.core:core-ktx:1.13.0")
     api("androidx.lifecycle:lifecycle-viewmodel:2.6.1")
@@ -79,6 +79,6 @@
 }
 
 android {
-    compileSdk = 36
+    compileSdk = 35
     namespace = "androidx.activity.compose"
 }
diff --git a/activity/activity-compose/samples/build.gradle b/activity/activity-compose/samples/build.gradle
index caa1365..d31203f 100644
--- a/activity/activity-compose/samples/build.gradle
+++ b/activity/activity-compose/samples/build.gradle
@@ -61,6 +61,6 @@
 }
 
 android {
-    compileSdk = 36
+    compileSdk = 35
     namespace = "androidx.activity.compose.samples"
 }
diff --git a/activity/activity-ktx/build.gradle b/activity/activity-ktx/build.gradle
index 76caa25..7cfaace 100644
--- a/activity/activity-ktx/build.gradle
+++ b/activity/activity-ktx/build.gradle
@@ -49,6 +49,6 @@
 }
 
 android {
-    compileSdk = 36
+    compileSdk = 35
     namespace = "androidx.activity.ktx"
 }
diff --git a/activity/activity/api/current.txt b/activity/activity/api/current.txt
index c0a3b5c..ff930ce 100644
--- a/activity/activity/api/current.txt
+++ b/activity/activity/api/current.txt
@@ -9,27 +9,22 @@
   public final class BackEventCompat {
     ctor @RequiresApi(34) public BackEventCompat(android.window.BackEvent backEvent);
     ctor @VisibleForTesting public BackEventCompat(float touchX, float touchY, @FloatRange(from=0.0, to=1.0) float progress, int swipeEdge);
-    ctor @VisibleForTesting public BackEventCompat(float touchX, float touchY, @FloatRange(from=0.0, to=1.0) float progress, int swipeEdge, optional long frameTimeMillis);
-    method public long getFrameTimeMillis();
     method public float getProgress();
     method public int getSwipeEdge();
     method public float getTouchX();
     method public float getTouchY();
     method @RequiresApi(34) public android.window.BackEvent toBackEvent();
-    property public long frameTimeMillis;
     property @FloatRange(from=0.0, to=1.0) public float progress;
     property public int swipeEdge;
     property public float touchX;
     property public float touchY;
     field public static final androidx.activity.BackEventCompat.Companion Companion;
     field public static final int EDGE_LEFT = 0; // 0x0
-    field public static final int EDGE_NONE = 2; // 0x2
     field public static final int EDGE_RIGHT = 1; // 0x1
   }
 
   public static final class BackEventCompat.Companion {
     property public static int EDGE_LEFT;
-    property public static int EDGE_NONE;
     property public static int EDGE_RIGHT;
   }
 
diff --git a/activity/activity/api/restricted_current.txt b/activity/activity/api/restricted_current.txt
index 4621b69..360ecd8 100644
--- a/activity/activity/api/restricted_current.txt
+++ b/activity/activity/api/restricted_current.txt
@@ -9,27 +9,22 @@
   public final class BackEventCompat {
     ctor @RequiresApi(34) public BackEventCompat(android.window.BackEvent backEvent);
     ctor @VisibleForTesting public BackEventCompat(float touchX, float touchY, @FloatRange(from=0.0, to=1.0) float progress, int swipeEdge);
-    ctor @VisibleForTesting public BackEventCompat(float touchX, float touchY, @FloatRange(from=0.0, to=1.0) float progress, int swipeEdge, optional long frameTimeMillis);
-    method public long getFrameTimeMillis();
     method public float getProgress();
     method public int getSwipeEdge();
     method public float getTouchX();
     method public float getTouchY();
     method @RequiresApi(34) public android.window.BackEvent toBackEvent();
-    property public long frameTimeMillis;
     property @FloatRange(from=0.0, to=1.0) public float progress;
     property public int swipeEdge;
     property public float touchX;
     property public float touchY;
     field public static final androidx.activity.BackEventCompat.Companion Companion;
     field public static final int EDGE_LEFT = 0; // 0x0
-    field public static final int EDGE_NONE = 2; // 0x2
     field public static final int EDGE_RIGHT = 1; // 0x1
   }
 
   public static final class BackEventCompat.Companion {
     property public static int EDGE_LEFT;
-    property public static int EDGE_NONE;
     property public static int EDGE_RIGHT;
   }
 
diff --git a/activity/activity/build.gradle b/activity/activity/build.gradle
index 768e7b6..305ff9d 100644
--- a/activity/activity/build.gradle
+++ b/activity/activity/build.gradle
@@ -15,7 +15,7 @@
 }
 
 android {
-    compileSdk = 36
+    compileSdk = 35
     namespace = "androidx.activity"
 }
 
diff --git a/activity/activity/src/androidTest/java/androidx/activity/BackEventCompatTest.kt b/activity/activity/src/androidTest/java/androidx/activity/BackEventCompatTest.kt
index 9fa87b4..21fe6c9 100644
--- a/activity/activity/src/androidTest/java/androidx/activity/BackEventCompatTest.kt
+++ b/activity/activity/src/androidTest/java/androidx/activity/BackEventCompatTest.kt
@@ -32,12 +32,11 @@
 
     @Test
     fun testCreateBackEventCompat() {
-        val event = BackEventCompat(1f, 2f, 3f, BackEventCompat.EDGE_LEFT, 2)
+        val event = BackEventCompat(1f, 2f, 3f, BackEventCompat.EDGE_LEFT)
         assertThat(event.touchX).isEqualTo(1f)
         assertThat(event.touchY).isEqualTo(2f)
         assertThat(event.progress).isEqualTo(3f)
         assertThat(event.swipeEdge).isEqualTo(BackEventCompat.EDGE_LEFT)
-        assertThat(event.frameTimeMillis).isEqualTo(2)
     }
 
     @RequiresApi(34)
@@ -61,28 +60,4 @@
         assertThat(event.progress).isEqualTo(3f)
         assertThat(event.swipeEdge).isEqualTo(BackEventCompat.EDGE_LEFT)
     }
-
-    @RequiresApi(36)
-    @SdkSuppress(minSdkVersion = 36)
-    @Test
-    fun testCreateBackEventCompatFromBackEventWithFrameTimeMillis() {
-        val event = BackEventCompat(BackEvent(1f, 2f, 3f, EDGE_LEFT, 5))
-        assertThat(event.touchX).isEqualTo(1f)
-        assertThat(event.touchY).isEqualTo(2f)
-        assertThat(event.progress).isEqualTo(3f)
-        assertThat(event.swipeEdge).isEqualTo(BackEventCompat.EDGE_LEFT)
-        assertThat(event.frameTimeMillis).isEqualTo(5)
-    }
-
-    @RequiresApi(36)
-    @SdkSuppress(minSdkVersion = 36)
-    @Test
-    fun testToBackEventFromBackEventCompatWithFrameTimeMillis() {
-        val event = BackEventCompat(1f, 2f, 3f, BackEventCompat.EDGE_LEFT, 5).toBackEvent()
-        assertThat(event.touchX).isEqualTo(1f)
-        assertThat(event.touchY).isEqualTo(2f)
-        assertThat(event.progress).isEqualTo(3f)
-        assertThat(event.swipeEdge).isEqualTo(BackEventCompat.EDGE_LEFT)
-        assertThat(event.frameTimeMillis).isEqualTo(5)
-    }
 }
diff --git a/activity/activity/src/main/java/androidx/activity/BackEventCompat.kt b/activity/activity/src/main/java/androidx/activity/BackEventCompat.kt
index db1563a..5b73368 100644
--- a/activity/activity/src/main/java/androidx/activity/BackEventCompat.kt
+++ b/activity/activity/src/main/java/androidx/activity/BackEventCompat.kt
@@ -27,7 +27,6 @@
 /** Compat around the [BackEvent] class */
 class BackEventCompat
 @VisibleForTesting
-@JvmOverloads
 constructor(
     /**
      * Absolute X location of the touch point of this event in the coordinate space of the view that
@@ -42,9 +41,7 @@
     /** Value between 0 and 1 on how far along the back gesture is. */
     @FloatRange(from = 0.0, to = 1.0) val progress: Float,
     /** Indicates which edge the swipe starts from. */
-    val swipeEdge: @SwipeEdge Int,
-    /** Frame time of the back event. */
-    val frameTimeMillis: Long = 0
+    val swipeEdge: @SwipeEdge Int
 ) {
 
     @RequiresApi(34)
@@ -54,19 +51,14 @@
         Api34Impl.touchX(backEvent),
         Api34Impl.touchY(backEvent),
         Api34Impl.progress(backEvent),
-        Api34Impl.swipeEdge(backEvent),
-        if (Build.VERSION.SDK_INT >= 36) {
-            Api36Impl.frameTimeMillis(backEvent)
-        } else {
-            0
-        }
+        Api34Impl.swipeEdge(backEvent)
     )
 
     /**  */
     @Target(AnnotationTarget.TYPE)
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     @Retention(AnnotationRetention.SOURCE)
-    @IntDef(EDGE_LEFT, EDGE_RIGHT, EDGE_NONE)
+    @IntDef(EDGE_LEFT, EDGE_RIGHT)
     annotation class SwipeEdge
 
     /**
@@ -77,16 +69,16 @@
      */
     @RequiresApi(34)
     fun toBackEvent(): BackEvent {
-        return if (Build.VERSION.SDK_INT >= 36) {
-            Api36Impl.createOnBackEvent(touchX, touchY, progress, swipeEdge, frameTimeMillis)
+        if (Build.VERSION.SDK_INT >= 34) {
+            return Api34Impl.createOnBackEvent(touchX, touchY, progress, swipeEdge)
         } else {
-            Api34Impl.createOnBackEvent(touchX, touchY, progress, swipeEdge)
+            throw UnsupportedOperationException("This method is only supported on API level 34+")
         }
     }
 
     override fun toString(): String {
         return "BackEventCompat{touchX=$touchX, touchY=$touchY, progress=$progress, " +
-            "swipeEdge=$swipeEdge, frameTimeMillis=$frameTimeMillis}"
+            "swipeEdge=$swipeEdge}"
     }
 
     companion object {
@@ -95,13 +87,6 @@
 
         /** Indicates that the edge swipe starts from the right edge of the screen */
         const val EDGE_RIGHT = 1
-
-        /**
-         * Indicates that the back event was not triggered by an edge swipe back gesture. This
-         * applies to cases like using the back button in 3-button navigation or pressing a hardware
-         * back button.
-         */
-        const val EDGE_NONE = 2
     }
 }
 
@@ -118,16 +103,3 @@
 
     fun swipeEdge(backEvent: BackEvent) = backEvent.swipeEdge
 }
-
-@RequiresApi(36)
-internal object Api36Impl {
-    fun createOnBackEvent(
-        touchX: Float,
-        touchY: Float,
-        progress: Float,
-        swipeEdge: Int,
-        frameTimeMillis: Long
-    ) = BackEvent(touchX, touchY, progress, swipeEdge, frameTimeMillis)
-
-    fun frameTimeMillis(backEvent: BackEvent) = backEvent.frameTimeMillis
-}
diff --git a/activity/activity/src/main/java/androidx/activity/result/PickVisualMediaRequest.kt b/activity/activity/src/main/java/androidx/activity/result/PickVisualMediaRequest.kt
index 8fc8416..7b88312 100644
--- a/activity/activity/src/main/java/androidx/activity/result/PickVisualMediaRequest.kt
+++ b/activity/activity/src/main/java/androidx/activity/result/PickVisualMediaRequest.kt
@@ -68,10 +68,7 @@
  * @param maxItems limit the number of selectable items when using [PickMultipleVisualMedia]
  * @param isOrderedSelection whether the user can control the order of selected media when using
  *   [PickMultipleVisualMedia] (defaults to false)
- * @param defaultTab the tab to initially open the picker in (defaults to [DefaultTab.PhotosTab]).
- *   Note that the support for this parameter was added in API level 35 / R ext 12 and applies the
- *   default behavior for older versions. Also see
- *   [android.provider.MediaStore.EXTRA_PICK_IMAGES_LAUNCH_TAB]
+ * @param defaultTab the tab to initially open in the picker (defaults to [DefaultTab.PhotosTab])
  * @return a PickVisualMediaRequest that contains the given input
  */
 @Suppress("MissingJvmstatic")
@@ -93,17 +90,12 @@
  * [androidx.activity.result.contract.ActivityResultContracts.PickMultipleVisualMedia] or
  * [androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia] Activity Contract.
  *
- * @param accentColor color long to customize picker accent color. Note that the support for this
- *   parameter was added in API level 35 / R ext 12 and applies the default behavior for older
- *   versions. Also see [android.provider.MediaStore.EXTRA_PICK_IMAGES_ACCENT_COLOR]
+ * @param accentColor color long to customize picker accent color
  * @param mediaType type to go into the PickVisualMediaRequest
  * @param maxItems limit the number of selectable items when using [PickMultipleVisualMedia]
  * @param isOrderedSelection whether the user can control the order of selected media when using
  *   [PickMultipleVisualMedia] (defaults to false)
- * @param defaultTab the tab to initially open the picker in (defaults to [DefaultTab.PhotosTab]).
- *   Note that the support for this parameter was added in API level 35 / R ext 12 and applies the
- *   default behavior for older versions. Also see
- *   [android.provider.MediaStore.EXTRA_PICK_IMAGES_LAUNCH_TAB]
+ * @param defaultTab the tab to initially open in the picker (defaults to [DefaultTab.PhotosTab])
  * @return a PickVisualMediaRequest that contains the given input
  */
 @Suppress("MissingJvmstatic")
@@ -268,12 +260,11 @@
          * Set the default tab for the [PickVisualMediaRequest].
          *
          * The default tab is used to open the preferred view inside the photo picker at first such
-         * as, e.g. [DefaultTab.PhotosTab], [DefaultTab.AlbumsTab]. This feature was added in API
-         * level 35 / R ext 12 and applies the default behavior for older versions.
+         * as, e.g. [DefaultTab.PhotosTab], [DefaultTab.AlbumsTab]. This parameter might be not
+         * supported by the underlying photo picker implementation.
          *
-         * @param defaultTab the tab to launch the picker in (defaults to [DefaultTab.PhotosTab])
+         * @param defaultTab the tab to launch the picker in
          * @return This builder.
-         * @see android.provider.MediaStore.EXTRA_PICK_IMAGES_LAUNCH_TAB
          */
         fun setDefaultTab(defaultTab: DefaultTab): Builder {
             this.defaultTab = defaultTab
@@ -283,12 +274,11 @@
         /**
          * Set the accent color for the [PickVisualMediaRequest].
          *
-         * The accent color is used to change the main color in the photo picker. This feature was
-         * added in API level 35 / R ext 12 and applies the default behavior for older versions.
+         * The accent color is used to change the main color in the photo picker. This parameter
+         * might be not supported by the underlying photo picker implementation.
          *
          * @param accentColor color long to apply as accent to the main color in the picker
          * @return This builder.
-         * @see android.provider.MediaStore.EXTRA_PICK_IMAGES_ACCENT_COLOR
          */
         fun setAccentColor(accentColor: Long): Builder {
             this.accentColor = accentColor
diff --git a/activity/integration-tests/macrobenchmark-target/build.gradle b/activity/integration-tests/macrobenchmark-target/build.gradle
index 3c1ce7a..95bcb77 100644
--- a/activity/integration-tests/macrobenchmark-target/build.gradle
+++ b/activity/integration-tests/macrobenchmark-target/build.gradle
@@ -12,7 +12,7 @@
 }
 
 android {
-   compileSdk = 36
+   compileSdk = 35
    namespace = "androidx.activity.integration.macrobenchmark.target"
 }
 
diff --git a/activity/integration-tests/testapp/build.gradle b/activity/integration-tests/testapp/build.gradle
index 8eaa40a..2b4075c 100644
--- a/activity/integration-tests/testapp/build.gradle
+++ b/activity/integration-tests/testapp/build.gradle
@@ -22,7 +22,7 @@
 }
 
 android {
-    compileSdk = 36
+    compileSdk = 35
     defaultConfig {
         applicationId = "androidx.activity.integration.testapp"
     }
diff --git a/appfunctions/appfunctions-common/src/main/java/androidx/appfunctions/AppFunctionSerializableInterface.kt b/appfunctions/appfunctions-common/src/main/java/androidx/appfunctions/AppFunctionSerializableInterface.kt
deleted file mode 100644
index 2e19d2f..0000000
--- a/appfunctions/appfunctions-common/src/main/java/androidx/appfunctions/AppFunctionSerializableInterface.kt
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.appfunctions
-
-import androidx.annotation.RestrictTo
-
-// TODO(b/403525399): Defines all compatible overrides
-/**
- * Annotates an interface class to be used as a base for [AppFunctionSerializable] implementations.
- *
- * The AppFunction compiler plugin enforces property compatibility between this interface/class and
- * any [AppFunctionSerializable] class that implements or extends it.
- *
- * Take a base interface like Note as example:
- * ```
- * @AppFunctionSerializableInterface
- * public interface Note {
- *   public val title: String
- *   public val content: String
- *
- *   public val attachments: List<Attachment>
- *       get() = emptyList()
- * }
- * ```
- *
- * If an app attempts to implement this base interface, it must respect the original property status
- *
- * ```
- * @AppFunctionSerializable
- * public class MyNote(
- *   override val title: String,
- *   override val content: String,
- *   // attachments is optional in base schema, therefore, must stay as optional
- *   override val attachments: List<Attachment> = emptyList()
- * ): Note
- * ```
- *
- * Attempting to have an incompatible override would result in a compiler error:
- * ```
- * @AppFunctionSerializable
- * public class MyNote(
- *   override val title: String,
- *   override val content: String,
- *   // This would cause a compiler error because it is not required instead of optional
- *   override val attachments: List<Attachment>
- * ): Note
- * ```
- *
- * @see [AppFunctionSerializable]
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-@Retention(AnnotationRetention.BINARY)
-@Target(AnnotationTarget.CLASS)
-public annotation class AppFunctionSerializableInterface
diff --git a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AnnotatedAppFunctionSerializable.kt b/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AnnotatedAppFunctionSerializable.kt
index e5b1340..086e194 100644
--- a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AnnotatedAppFunctionSerializable.kt
+++ b/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AnnotatedAppFunctionSerializable.kt
@@ -18,13 +18,20 @@
 
 import androidx.appfunctions.compiler.core.AppFunctionTypeReference.AppFunctionSupportedTypeCategory.SERIALIZABLE_LIST
 import androidx.appfunctions.compiler.core.AppFunctionTypeReference.AppFunctionSupportedTypeCategory.SERIALIZABLE_SINGULAR
+import androidx.appfunctions.compiler.core.AppFunctionTypeReference.Companion.SUPPORTED_TYPES_STRING
+import androidx.appfunctions.compiler.core.AppFunctionTypeReference.Companion.isSupportedType
+import com.google.devtools.ksp.getDeclaredProperties
+import com.google.devtools.ksp.getVisibility
 import com.google.devtools.ksp.symbol.KSClassDeclaration
 import com.google.devtools.ksp.symbol.KSFile
+import com.google.devtools.ksp.symbol.KSFunctionDeclaration
 import com.google.devtools.ksp.symbol.KSTypeReference
+import com.google.devtools.ksp.symbol.KSValueParameter
+import com.google.devtools.ksp.symbol.Visibility
 import com.squareup.kotlinpoet.ClassName
 
 /** Represents a class annotated with [androidx.appfunctions.AppFunctionSerializable]. */
-open class AnnotatedAppFunctionSerializable(
+data class AnnotatedAppFunctionSerializable(
     private val appFunctionSerializableClass: KSClassDeclaration
 ) {
     /** The qualified name of the class being annotated with AppFunctionSerializable. */
@@ -33,44 +40,229 @@
     /** The super type of the class being annotated with AppFunctionSerializable */
     val superTypes: Sequence<KSTypeReference> by lazy { appFunctionSerializableClass.superTypes }
 
-    /**
-     * The validator that can be used to validate the class annotated with AppFunctionSerializable.
-     */
-    private val validator: SerializableValidator by lazy {
-        SerializableValidator(classToValidate = appFunctionSerializableClass)
-    }
-
     // TODO(b/392587953): throw an error if a property has the same name as one of the factory
     //  method parameters
     /**
      * Validates that the class annotated with AppFunctionSerializable follows app function's spec.
      *
+     * The annotated class must adhere to the following requirements:
+     * 1. **Primary Constructor:** The class must have a public primary constructor.
+     * 2. **Property Parameters:** Only properties (declared with `val`) can be passed as parameters
+     *    to the primary constructor.
+     * 3. **Supported Types:** All properties must be of one of the supported types.
+     * 4. **Super Type Parameters:** All parameters in the primary constructor of a super type must
+     *    be present in the primary constructor of the subtype.
+     *
      * @throws ProcessingException if the class does not adhere to the requirements
      */
-    open fun validate(): AnnotatedAppFunctionSerializable {
-        validator.validate()
+    fun validate(): AnnotatedAppFunctionSerializable {
+        val validatedPrimaryConstructor =
+            appFunctionSerializableClass.validateSerializablePrimaryConstructor()
+        val superTypesWithSerializableAnnotation =
+            appFunctionSerializableClass.superTypes
+                .map { it.resolve().declaration as KSClassDeclaration }
+                .filter {
+                    it.annotations.findAnnotation(
+                        IntrospectionHelper.AppFunctionSerializableAnnotation.CLASS_NAME
+                    ) != null
+                }
+                .toSet()
+        val superTypesWithCapabilityAnnotation = findSuperTypesWithCapabilityAnnotation()
+        val parametersToValidate =
+            validatedPrimaryConstructor.parameters
+                .associateBy { checkNotNull(it.name).toString() }
+                .toMutableMap()
+
+        validateParameters(
+            parametersToValidate,
+            superTypesWithSerializableAnnotation,
+            superTypesWithCapabilityAnnotation
+        )
+
         return this
     }
 
     /**
-     * Returns the set of super types of [appFunctionSerializableClass] that are annotated with
-     * [androidx.appfunctions.AppFunctionSchemaCapability].
+     * Finds all super types of an [appFunctionSerializableClass] that are annotated with the
+     * [androidx.appfunctions.AppFunctionSchemaCapability] annotation.
+     *
+     * For example, consider the following classes:
+     * ```
+     * @AppFunctionSchemaCapability
+     * public interface AppFunctionOpenable {
+     *     public val intentToOpen: PendingIntent
+     * }
+     *
+     * public interface OpenableResponse : AppFunctionOpenable {
+     *     override val intentToOpen: PendingIntent
+     * }
+     *
+     * @AppFunctionSerializable
+     * class MySerializableClass(
+     *   override val intentToOpen: PendingIntent
+     * ) : OpenableResponse
+     * ```
+     *
+     * This method will return the [KSClassDeclaration] of `AppFunctionOpenable` since it is a super
+     * type of `MySerializableClass` and is annotated with the
+     * [androidx.appfunctions.AppFunctionSchemaCapability] annotation.
+     *
+     * @param appFunctionSerializableClass the [KSClassDeclaration] of the
+     *   [appFunctionSerializableClass] being processed.
+     * @return a set of [KSClassDeclaration] for all super types of the
+     *   [appFunctionSerializableClass] that are annotated with
+     *   [androidx.appfunctions.AppFunctionSchemaCapability].
      */
     fun findSuperTypesWithCapabilityAnnotation(): Set<KSClassDeclaration> {
-        return validator.findSuperTypesWithCapabilityAnnotation()
+        return buildSet {
+            val unvisitedSuperTypes: MutableList<KSTypeReference> =
+                appFunctionSerializableClass.superTypes.toMutableList()
+
+            while (!unvisitedSuperTypes.isEmpty()) {
+                val superTypeClassDeclaration =
+                    unvisitedSuperTypes.removeLast().resolve().declaration as KSClassDeclaration
+                if (
+                    superTypeClassDeclaration.annotations.findAnnotation(
+                        IntrospectionHelper.AppFunctionSchemaCapability.CLASS_NAME
+                    ) != null
+                ) {
+                    add(superTypeClassDeclaration)
+                }
+                if (
+                    superTypeClassDeclaration.annotations.findAnnotation(
+                        IntrospectionHelper.AppFunctionSerializableAnnotation.CLASS_NAME
+                    ) == null
+                ) {
+                    // Only consider non serializable super types since serializable super types
+                    // are already handled separately
+                    unvisitedSuperTypes.addAll(superTypeClassDeclaration.superTypes)
+                }
+            }
+        }
+    }
+
+    private fun validateParameters(
+        parametersToValidate: MutableMap<String, KSValueParameter>,
+        superTypesWithSerializableAnnotation: Set<KSClassDeclaration>,
+        superTypesWithCapabilityAnnotation: Set<KSClassDeclaration>,
+    ) {
+        for (superType in superTypesWithSerializableAnnotation) {
+            if (
+                superType.annotations.findAnnotation(
+                    IntrospectionHelper.AppFunctionSerializableAnnotation.CLASS_NAME
+                ) == null
+            ) {
+                throw ProcessingException(
+                    "Expected supertype with @AppFunctionSerializable annotation.",
+                    superType
+                )
+            }
+            val superTypePrimaryConstructor = superType.validateSerializablePrimaryConstructor()
+
+            for (superTypeParameter in superTypePrimaryConstructor.parameters) {
+                // Parameter has now been visited
+                val parameterInSuperType =
+                    parametersToValidate.remove(superTypeParameter.name.toString())
+                if (parameterInSuperType == null) {
+                    throw ProcessingException(
+                        "All parameters in @AppFunctionSerializable " +
+                            "supertypes must be present in subtype",
+                        superTypeParameter
+                    )
+                }
+                validateSerializableParameter(parameterInSuperType)
+            }
+        }
+
+        for (superType in superTypesWithCapabilityAnnotation) {
+            if (
+                superType.annotations.findAnnotation(
+                    IntrospectionHelper.AppFunctionSchemaCapability.CLASS_NAME
+                ) == null
+            ) {
+                throw ProcessingException(
+                    "Expected supertype with @AppFunctionSchemaCapability annotation.",
+                    superType
+                )
+            }
+            val capabilityProperties = superType.getDeclaredProperties()
+
+            for (superTypeProperty in capabilityProperties) {
+                // Parameter has now been visited
+                val parameterInSuperType =
+                    parametersToValidate.remove(superTypeProperty.simpleName.toString())
+                if (parameterInSuperType == null) {
+                    throw ProcessingException(
+                        "All Properties in @AppFunctionSchemaCapability " +
+                            "supertypes must be present in subtype",
+                        superTypeProperty
+                    )
+                }
+                validateSerializableParameter(parameterInSuperType)
+            }
+        }
+
+        // Validate the remaining parameters
+        if (parametersToValidate.isNotEmpty()) {
+            for ((_, parameterToValidate) in parametersToValidate) {
+                validateSerializableParameter(parameterToValidate)
+            }
+        }
+    }
+
+    private fun KSClassDeclaration.validateSerializablePrimaryConstructor(): KSFunctionDeclaration {
+        if (primaryConstructor == null) {
+            throw ProcessingException(
+                "Classes annotated with AppFunctionSerializable must have a primary constructor.",
+                this
+            )
+        }
+        val primaryConstructorDeclaration = checkNotNull(primaryConstructor)
+        if (primaryConstructorDeclaration.parameters.isEmpty()) {
+            throw ProcessingException(
+                "Classes annotated with AppFunctionSerializable must not have an empty " +
+                    "primary constructor.",
+                this
+            )
+        }
+
+        if (primaryConstructorDeclaration.getVisibility() != Visibility.PUBLIC) {
+            throw ProcessingException(
+                "The primary constructor of @AppFunctionSerializable must be public.",
+                appFunctionSerializableClass
+            )
+        }
+        return primaryConstructorDeclaration
+    }
+
+    private fun validateSerializableParameter(ksValueParameter: KSValueParameter) {
+        if (!ksValueParameter.isVal) {
+            throw ProcessingException(
+                "All parameters in @AppFunctionSerializable primary constructor must have getters",
+                ksValueParameter
+            )
+        }
+
+        if (!isSupportedType(ksValueParameter.type)) {
+            throw ProcessingException(
+                "AppFunctionSerializable properties must be one of the following types:\n" +
+                    SUPPORTED_TYPES_STRING +
+                    ", an @AppFunctionSerializable or a list of @AppFunctionSerializable\nbut found " +
+                    ksValueParameter.type.toTypeName(),
+                ksValueParameter
+            )
+        }
     }
 
     /** Returns the annotated class's properties as defined in its primary constructor. */
-    fun getProperties(): List<AppFunctionPropertyDeclaration> {
-        return checkNotNull(appFunctionSerializableClass.primaryConstructor).parameters.map {
-            AppFunctionPropertyDeclaration(it)
-        }
+    fun getProperties(): List<KSValueParameter> {
+        return checkNotNull(appFunctionSerializableClass.primaryConstructor).parameters
     }
 
     /** Returns the properties that have @AppFunctionSerializable class types. */
     fun getSerializablePropertyTypeReferences(): Set<AppFunctionTypeReference> {
         return getProperties()
-            .map { property -> AppFunctionTypeReference(property.type) }
+            .map { param -> AppFunctionTypeReference(param.type) }
             .filter { afType ->
                 afType.isOfTypeCategory(SERIALIZABLE_SINGULAR) ||
                     afType.isOfTypeCategory(SERIALIZABLE_LIST)
diff --git a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AnnotatedAppFunctionSerializableProxy.kt b/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AnnotatedAppFunctionSerializableProxy.kt
deleted file mode 100644
index 4e9f9b5..0000000
--- a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AnnotatedAppFunctionSerializableProxy.kt
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.appfunctions.compiler.core
-
-import com.google.devtools.ksp.symbol.KSClassDeclaration
-import com.google.devtools.ksp.symbol.KSFunctionDeclaration
-import com.google.devtools.ksp.symbol.KSType
-
-/**
- * A class that represents a class annotated with @AppFunctionSerializableProxy.
- *
- * @param appFunctionSerializableProxyClass The class annotated with @AppFunctionSerializableProxy.
- */
-data class AnnotatedAppFunctionSerializableProxy(
-    private val appFunctionSerializableProxyClass: KSClassDeclaration
-) : AnnotatedAppFunctionSerializable(appFunctionSerializableProxyClass) {
-
-    /** The type of the class that the proxy class is proxying. */
-    val targetClassDeclaration: KSClassDeclaration by lazy {
-        (appFunctionSerializableProxyClass.annotations.findAnnotation(
-                IntrospectionHelper.AppFunctionSerializableProxyAnnotation.CLASS_NAME
-            )
-                ?: throw ProcessingException(
-                    "Class Must have @AppFunctionSerializableProxy annotation",
-                    appFunctionSerializableProxyClass
-                ))
-            .requirePropertyValueOfType(
-                IntrospectionHelper.AppFunctionSerializableProxyAnnotation.PROPERTY_TARGET_CLASS,
-                KSType::class
-            )
-            .declaration as KSClassDeclaration
-    }
-
-    /** The name of the method that returns an instance of the target class. */
-    val toTargetClassMethodName: String by lazy {
-        "to${targetClassDeclaration.simpleName.asString()}"
-    }
-
-    /** The name of the companion method that returns an instance of the proxy class. */
-    val fromTargetClassMethodName: String by lazy {
-        "from${targetClassDeclaration.simpleName.asString()}"
-    }
-
-    /**
-     * Validates the class annotated with @AppFunctionSerializableProxy.
-     *
-     * @return The validated class.
-     */
-    override fun validate(): AnnotatedAppFunctionSerializableProxy {
-        super.validate()
-        validateProxyHasToTargetClassMethod()
-        validateProxyHasFromTargetClassMethod()
-        return this
-    }
-
-    /** Validates that the proxy class has a method that returns an instance of the target class. */
-    private fun validateProxyHasToTargetClassMethod() {
-        val toTargetClassNameFunctionList: List<KSFunctionDeclaration> =
-            appFunctionSerializableProxyClass
-                .getAllFunctions()
-                .filter { it.simpleName.asString() == toTargetClassMethodName }
-                .toList()
-        if (toTargetClassNameFunctionList.size != 1) {
-            throw ProcessingException(
-                "Class must have exactly one member function: $toTargetClassMethodName",
-                appFunctionSerializableProxyClass
-            )
-        }
-        val toTargetClassNameFunction = toTargetClassNameFunctionList.first()
-        if (
-            checkNotNull(
-                    checkNotNull(toTargetClassNameFunction.returnType)
-                        .resolve()
-                        .declaration
-                        .qualifiedName
-                )
-                .asString() != checkNotNull(targetClassDeclaration.qualifiedName).asString()
-        ) {
-            throw ProcessingException(
-                "Function $toTargetClassMethodName should return an instance of target class",
-                appFunctionSerializableProxyClass
-            )
-        }
-    }
-
-    /** Validates that the proxy class has a method that returns an instance of the target class. */
-    private fun validateProxyHasFromTargetClassMethod() {
-        val targetClassName = checkNotNull(targetClassDeclaration.simpleName).asString()
-        val targetCompanionClass =
-            appFunctionSerializableProxyClass.declarations
-                .filterIsInstance<KSClassDeclaration>()
-                .filter { it.isCompanionObject }
-                .single()
-
-        val fromTargetClassNameFunctionList =
-            targetCompanionClass
-                .getAllFunctions()
-                .filter { it.simpleName.asString() == fromTargetClassMethodName }
-                .toList()
-        if (fromTargetClassNameFunctionList.size != 1) {
-            throw ProcessingException(
-                "Companion Class must have exactly one member function: " +
-                    fromTargetClassMethodName,
-                appFunctionSerializableProxyClass
-            )
-        }
-        val fromTargetClassNameFunction = fromTargetClassNameFunctionList.first()
-        if (
-            fromTargetClassNameFunction.parameters.size != 1 ||
-                fromTargetClassNameFunction.parameters.first().type.toTypeName().toString() !=
-                    checkNotNull(targetClassDeclaration.qualifiedName).asString()
-        ) {
-            throw ProcessingException(
-                "Function $fromTargetClassMethodName should have one parameter of type " +
-                    targetClassName,
-                appFunctionSerializableProxyClass
-            )
-        }
-        if (
-            checkNotNull(fromTargetClassNameFunction.returnType).toTypeName().toString() !=
-                checkNotNull(appFunctionSerializableProxyClass.qualifiedName).asString()
-        ) {
-            throw ProcessingException(
-                "Function $fromTargetClassMethodName should return an instance of " +
-                    "this serializable class",
-                appFunctionSerializableProxyClass
-            )
-        }
-    }
-}
diff --git a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AnnotatedAppFunctions.kt b/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AnnotatedAppFunctions.kt
index 3ee7bc9..4c9500e 100644
--- a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AnnotatedAppFunctions.kt
+++ b/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AnnotatedAppFunctions.kt
@@ -43,7 +43,9 @@
 import com.google.devtools.ksp.symbol.KSClassDeclaration
 import com.google.devtools.ksp.symbol.KSFile
 import com.google.devtools.ksp.symbol.KSFunctionDeclaration
+import com.google.devtools.ksp.symbol.KSPropertyDeclaration
 import com.google.devtools.ksp.symbol.KSTypeReference
+import com.google.devtools.ksp.symbol.KSValueParameter
 import com.google.devtools.ksp.validate
 import com.squareup.kotlinpoet.ClassName
 
@@ -364,7 +366,7 @@
     // TODO: Document traversal rules.
     private fun addSerializableTypeMetadataToSharedDataTypeMap(
         appFunctionSerializableType: AnnotatedAppFunctionSerializable,
-        unvisitedSerializableProperties: MutableMap<String, AppFunctionPropertyDeclaration>,
+        unvisitedSerializableProperties: MutableMap<String, KSValueParameter>,
         sharedDataTypeMap: MutableMap<String, AppFunctionDataTypeMetadata>,
         seenDataTypeQualifiers: MutableSet<String>,
     ) {
@@ -393,7 +395,7 @@
             // If there is no super type, then this is a base serializable object.
             sharedDataTypeMap.put(
                 serializableTypeQualifiedName,
-                buildObjectTypeMetadataForObjectParameters(
+                buildObjectTypeMetadataForSerializableParameters(
                     serializableTypeQualifiedName,
                     appFunctionSerializableType.getProperties(),
                     unvisitedSerializableProperties,
@@ -426,12 +428,9 @@
 
                 for (capabilitySuperType in superTypesWithCapabilityAnnotation) {
                     add(
-                        buildObjectTypeMetadataForObjectParameters(
+                        buildObjectTypeMetadataForCapabilityProperties(
                             checkNotNull(capabilitySuperType.toClassName().canonicalName),
-                            capabilitySuperType
-                                .getDeclaredProperties()
-                                .map { AppFunctionPropertyDeclaration(it) }
-                                .toList(),
+                            capabilitySuperType.getDeclaredProperties().toList(),
                             unvisitedSerializableProperties,
                             sharedDataTypeMap,
                             seenDataTypeQualifiers
@@ -443,7 +442,7 @@
                     // Since all superTypes have been visited, then the remaining parameters in the
                     // unvisitedSerializableParameters map belong to the subclass directly.
                     add(
-                        buildObjectTypeMetadataForObjectParameters(
+                        buildObjectTypeMetadataForSerializableParameters(
                             serializableTypeQualifiedName,
                             unvisitedSerializableProperties.values.toList(),
                             unvisitedSerializableProperties,
@@ -471,19 +470,18 @@
     }
 
     /**
-     * Builds an [AppFunctionObjectTypeMetadata] for a serializable/capability type.
+     * Builds an [AppFunctionObjectTypeMetadata] for a serializable type.
      *
-     * @param typeQualifiedName the qualified name of the serializable/capability type being
+     * @param serializableTypeQualifiedName the qualified name of the serializable type being
      *   processed. This is the qualified name of the class that is annotated with
-     *   [androidx.appfunctions.AppFunctionSerializable] or
-     *   [androidx.appfunctions.AppFunctionSchemaCapability].
-     * @param currentPropertiesList the list of properties from the serializable/capability class
+     *   [androidx.appfunctions.AppFunctionSerializable].
+     * @param currentSerializableParametersList the list of properties from the serializable class
      *   that is being processed.
      * @param unvisitedSerializableProperties a map of unvisited serializable properties. This map
      *   is used to track the properties that have not yet been visited. The map is updated as the
-     *   properties are visited. The map should be a superset of the [currentPropertiesList] as it
-     *   can contain other properties belonging to a subclass of the current [typeQualifiedName]
-     *   class being processed.
+     *   properties are visited. The map should be a superset of the
+     *   [currentSerializableParametersList] as it can contain other properties belonging to a
+     *   subclass of the current [serializableTypeQualifiedName] class being processed.
      * @param sharedDataTypeMap a map of shared data types. This map is used to store the
      *   [AppFunctionDataTypeMetadata] for all serializable types that are used in an app function.
      *   This map is used to avoid duplicating the metadata for the same serializable type.
@@ -491,50 +489,111 @@
      *   processing the same serializable type multiple times.
      * @return an [AppFunctionObjectTypeMetadata] for the serializable type.
      */
-    private fun buildObjectTypeMetadataForObjectParameters(
-        typeQualifiedName: String,
-        currentPropertiesList: List<AppFunctionPropertyDeclaration>,
-        unvisitedSerializableProperties: MutableMap<String, AppFunctionPropertyDeclaration>,
+    private fun buildObjectTypeMetadataForSerializableParameters(
+        serializableTypeQualifiedName: String,
+        currentSerializableParametersList: List<KSValueParameter>,
+        unvisitedSerializableProperties: MutableMap<String, KSValueParameter>,
         sharedDataTypeMap: MutableMap<String, AppFunctionDataTypeMetadata>,
         seenDataTypeQualifiers: MutableSet<String>,
     ): AppFunctionObjectTypeMetadata {
-        val currentSerializableProperties: List<AppFunctionPropertyDeclaration> = buildList {
-            for (property in currentPropertiesList) {
+        val currentSerializableProperties: List<KSValueParameter> = buildList {
+            for (parameter in currentSerializableParametersList) {
                 // This property has now been visited. Remove it from the
                 // unvisitedSerializableProperties map so that we don't visit it again when
                 // processing the rest of a sub-class that implements this superclass.
                 // This is because before processing a subclass we process its superclass first
                 // so the unvisitedSerializableProperties could still contain properties not
                 // directly included in the current class being processed.
-                add(checkNotNull(unvisitedSerializableProperties.remove(property.name)))
+                add(
+                    checkNotNull(
+                        unvisitedSerializableProperties.remove(
+                            checkNotNull(parameter.name.toString())
+                        )
+                    )
+                )
             }
         }
-        return buildObjectTypeMetadataForObjectProperty(
-            typeQualifiedName,
+        return buildObjectTypeMetadataForCapabilityProperty(
+            serializableTypeQualifiedName,
             currentSerializableProperties,
             sharedDataTypeMap,
             seenDataTypeQualifiers
         )
     }
 
-    private fun buildObjectTypeMetadataForObjectProperty(
+    /**
+     * Builds an [AppFunctionObjectTypeMetadata] for a capability type.
+     *
+     * @param capabilityTypeQualifiedName the qualified name of the capability type being processed.
+     *   This is the qualified name of the class that is annotated with
+     *   [androidx.appfunctions.AppFunctionSchemaCapability].
+     * @param currentCapabilityPropertiesList the list of properties from the capability class that
+     *   is being processed.
+     * @param unvisitedSerializableProperties a map of unvisited serializable properties. This map
+     *   is used to track the properties that have not yet been visited. The map is updated as the
+     *   properties are visited. The map should be a superset of the
+     *   [currentCapabilityPropertiesList] as it can contain other properties belonging to a
+     *   subclass of the current [capabilityTypeQualifiedName] class being processed.
+     * @param sharedDataTypeMap a map of shared data types. This map is used to store the
+     *   [AppFunctionDataTypeMetadata] for all serializable types that are used in an app function.
+     *   This map is used to avoid duplicating the metadata for the same serializable type.
+     * @param seenDataTypeQualifiers a set of seen data type qualifiers. This set is used to avoid
+     *   processing the same serializable type multiple times.
+     * @return an [AppFunctionObjectTypeMetadata] for the serializable type.
+     */
+    private fun buildObjectTypeMetadataForCapabilityProperties(
+        capabilityTypeQualifiedName: String,
+        currentCapabilityPropertiesList: List<KSPropertyDeclaration>,
+        unvisitedSerializableProperties: MutableMap<String, KSValueParameter>,
+        sharedDataTypeMap: MutableMap<String, AppFunctionDataTypeMetadata>,
+        seenDataTypeQualifiers: MutableSet<String>,
+    ): AppFunctionObjectTypeMetadata {
+        val currentSerializableProperties: List<KSValueParameter> = buildList {
+            for (property in currentCapabilityPropertiesList) {
+                // This property has now been visited. Remove it from the
+                // unvisitedSerializableProperties map so that we don't visit it again when
+                // processing the rest of a sub-class that implements this superclass.
+                // This is because before processing a subclass we process its superclass first
+                // so the unvisitedSerializableProperties could still contain properties not
+                // directly included in the current class being processed.
+                add(
+                    checkNotNull(
+                        unvisitedSerializableProperties.remove(
+                            checkNotNull(property.simpleName.toString())
+                        )
+                    )
+                )
+            }
+        }
+        return buildObjectTypeMetadataForCapabilityProperty(
+            capabilityTypeQualifiedName,
+            currentSerializableProperties,
+            sharedDataTypeMap,
+            seenDataTypeQualifiers
+        )
+    }
+
+    private fun buildObjectTypeMetadataForCapabilityProperty(
         serializableTypeQualifiedName: String,
-        currentSerializableProperties: List<AppFunctionPropertyDeclaration>,
+        currentSerializableProperties: List<KSValueParameter>,
         sharedDataTypeMap: MutableMap<String, AppFunctionDataTypeMetadata>,
         seenDataTypeQualifiers: MutableSet<String>,
     ): AppFunctionObjectTypeMetadata {
         val requiredPropertiesList: MutableList<String> = mutableListOf()
         val appFunctionSerializablePropertiesMap: Map<String, AppFunctionDataTypeMetadata> =
             buildMap {
-                for (property in currentSerializableProperties) {
+                for (parameterInSuperType in currentSerializableProperties) {
                     val innerAppFunctionDataTypeMetadata =
-                        property.type.toAppFunctionDataTypeMetadata(
+                        parameterInSuperType.type.toAppFunctionDataTypeMetadata(
                             sharedDataTypeMap,
                             seenDataTypeQualifiers,
                         )
-                    put(property.name, innerAppFunctionDataTypeMetadata)
+                    put(
+                        checkNotNull(parameterInSuperType.name).asString(),
+                        innerAppFunctionDataTypeMetadata
+                    )
                     // TODO(b/394553462): Parse required state from annotation.
-                    requiredPropertiesList.add(property.name)
+                    requiredPropertiesList.add(checkNotNull(parameterInSuperType.name).asString())
                 }
             }
         return AppFunctionObjectTypeMetadata(
diff --git a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AppFunctionPropertyDeclaration.kt b/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AppFunctionPropertyDeclaration.kt
deleted file mode 100644
index a1d9e89..0000000
--- a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AppFunctionPropertyDeclaration.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.appfunctions.compiler.core
-
-import com.google.devtools.ksp.symbol.KSPropertyDeclaration
-import com.google.devtools.ksp.symbol.KSTypeReference
-import com.google.devtools.ksp.symbol.KSValueParameter
-
-// TODO(b/403525399): Add support for checking optional property.
-/** A wrapper class to store the property declaration in a class. */
-data class AppFunctionPropertyDeclaration(val name: String, val type: KSTypeReference) {
-    /** Creates an [AppFunctionPropertyDeclaration] from [KSPropertyDeclaration]. */
-    constructor(
-        property: KSPropertyDeclaration
-    ) : this(checkNotNull(property.simpleName).asString(), property.type)
-
-    /** Creates an [AppFunctionPropertyDeclaration] from [KSValueParameter]. */
-    constructor(
-        valueParameter: KSValueParameter
-    ) : this(checkNotNull(valueParameter.name).asString(), valueParameter.type)
-}
diff --git a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AppFunctionSymbolResolver.kt b/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AppFunctionSymbolResolver.kt
index 48524c4..f20afe4 100644
--- a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AppFunctionSymbolResolver.kt
+++ b/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/AppFunctionSymbolResolver.kt
@@ -19,12 +19,13 @@
 import androidx.appfunctions.compiler.core.IntrospectionHelper.APP_FUNCTIONS_AGGREGATED_DEPS_PACKAGE_NAME
 import androidx.appfunctions.compiler.core.IntrospectionHelper.AppFunctionAnnotation
 import androidx.appfunctions.compiler.core.IntrospectionHelper.AppFunctionComponentRegistryAnnotation
-import androidx.appfunctions.compiler.core.IntrospectionHelper.AppFunctionSerializableAnnotation
-import androidx.appfunctions.compiler.core.IntrospectionHelper.AppFunctionSerializableProxyAnnotation
 import com.google.devtools.ksp.KspExperimental
 import com.google.devtools.ksp.processing.Resolver
 import com.google.devtools.ksp.symbol.KSClassDeclaration
 import com.google.devtools.ksp.symbol.KSFunctionDeclaration
+import kotlin.collections.component1
+import kotlin.collections.component2
+import kotlin.collections.map
 
 /** The helper class to resolve AppFunction related symbols. */
 class AppFunctionSymbolResolver(private val resolver: Resolver) {
@@ -55,49 +56,6 @@
     }
 
     /**
-     * Resolves all classes annotated with @AppFunctionSerializable
-     *
-     * @return a list of AnnotatedAppFunctionSerializable
-     */
-    fun resolveAnnotatedAppFunctionSerializables(): List<AnnotatedAppFunctionSerializable> {
-        return resolver
-            .getSymbolsWithAnnotation(AppFunctionSerializableAnnotation.CLASS_NAME.canonicalName)
-            .map { declaration ->
-                if (declaration !is KSClassDeclaration) {
-                    throw ProcessingException(
-                        "Only classes can be annotated with @AppFunctionSerializable",
-                        declaration
-                    )
-                }
-                AnnotatedAppFunctionSerializable(declaration).validate()
-            }
-            .toList()
-    }
-
-    /**
-     * Resolves all classes annotated with @AppFunctionSerializableProxy
-     *
-     * @return a list of AnnotatedAppFunctionSerializableProxy
-     */
-    fun resolveAnnotatedAppFunctionSerializableProxies():
-        List<AnnotatedAppFunctionSerializableProxy> {
-        return resolver
-            .getSymbolsWithAnnotation(
-                AppFunctionSerializableProxyAnnotation.CLASS_NAME.canonicalName
-            )
-            .map { declaration ->
-                if (declaration !is KSClassDeclaration) {
-                    throw ProcessingException(
-                        "Only classes can be annotated with @AppFunctionSerializableProxy",
-                        declaration
-                    )
-                }
-                AnnotatedAppFunctionSerializableProxy(declaration).validate()
-            }
-            .toList()
-    }
-
-    /**
      * Gets all [AnnotatedAppFunctions] from all processed modules.
      *
      * Unlike [resolveAnnotatedAppFunctions] that resolves symbols from annotation within the same
diff --git a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/IntrospectionHelper.kt b/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/IntrospectionHelper.kt
index efe5721..4656c687 100644
--- a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/IntrospectionHelper.kt
+++ b/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/IntrospectionHelper.kt
@@ -43,11 +43,6 @@
         val CLASS_NAME = ClassName(APP_FUNCTIONS_PACKAGE_NAME, "AppFunctionSerializable")
     }
 
-    object AppFunctionSerializableProxyAnnotation {
-        val CLASS_NAME = ClassName(APP_FUNCTIONS_PACKAGE_NAME, "AppFunctionSerializableProxy")
-        const val PROPERTY_TARGET_CLASS = "targetClass"
-    }
-
     object AppFunctionSchemaCapability {
         val CLASS_NAME = ClassName(APP_FUNCTIONS_PACKAGE_NAME, "AppFunctionSchemaCapability")
     }
diff --git a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/SerializableValidator.kt b/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/SerializableValidator.kt
deleted file mode 100644
index 8dd4062..0000000
--- a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/core/SerializableValidator.kt
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.appfunctions.compiler.core
-
-import androidx.appfunctions.compiler.core.AppFunctionTypeReference.Companion.SUPPORTED_TYPES_STRING
-import androidx.appfunctions.compiler.core.AppFunctionTypeReference.Companion.isSupportedType
-import com.google.devtools.ksp.getDeclaredProperties
-import com.google.devtools.ksp.getVisibility
-import com.google.devtools.ksp.symbol.KSClassDeclaration
-import com.google.devtools.ksp.symbol.KSFunctionDeclaration
-import com.google.devtools.ksp.symbol.KSTypeReference
-import com.google.devtools.ksp.symbol.KSValueParameter
-import com.google.devtools.ksp.symbol.Visibility
-
-/**
- * Validates if the provided [classToValidate] conforms to the AppFunctions SDK's serializable
- * specification.
- */
-class SerializableValidator(private val classToValidate: KSClassDeclaration) {
-
-    /**
-     * Validates if the provided [classToValidate] conforms to the AppFunctions SDK's serializable
-     * specification.
-     *
-     * A valid serializable class must:
-     * 1. Have a public primary constructor with at least one parameter.
-     * 2. All primary constructor parameters must be `val` properties.
-     * 3. Parameters must be one of the following types:
-     * - Primitive singles: `String`, `Int`, `Long`, `Float`, `Double`, `Boolean`, `PendingIntent`
-     * - Primitive arrays: `IntArray`, `LongArray`, `ShortArray`, `FloatArray`, `DoubleArray`,
-     *   `BooleanArray`
-     * - `List<String>`
-     * - `List<@AppFunctionSerializable>` (other serializable classes)
-     * 4. If the class implements `@AppFunctionSerializable` or `AppFunctionSchemaCapability`, all
-     *    properties defined in those interfaces/classes must be present as constructor parameters.
-     */
-    fun validate() {
-        val validatedPrimaryConstructor = classToValidate.validateSerializablePrimaryConstructor()
-        validateParameters(
-            validatedPrimaryConstructor.parameters
-                .associateBy { checkNotNull(it.name).toString() }
-                .toMutableMap()
-        )
-    }
-
-    /**
-     * Finds all super types of the serializable [classToValidate] that are annotated with the
-     * [androidx.appfunctions.AppFunctionSchemaCapability] annotation.
-     *
-     * For example, consider the following classes:
-     * ```
-     * @AppFunctionSchemaCapability
-     * public interface AppFunctionOpenable {
-     *     public val intentToOpen: PendingIntent
-     * }
-     *
-     * public interface OpenableResponse : AppFunctionOpenable {
-     *     override val intentToOpen: PendingIntent
-     * }
-     *
-     * @AppFunctionSerializable
-     * class MySerializableClass(
-     *   override val intentToOpen: PendingIntent
-     * ) : OpenableResponse
-     * ```
-     *
-     * This method will return the [KSClassDeclaration] of `AppFunctionOpenable` since it is a super
-     * type of `MySerializableClass` and is annotated with the
-     * [androidx.appfunctions.AppFunctionSchemaCapability] annotation.
-     *
-     * @return a set of [KSClassDeclaration] for all super types of the [classToValidate] that are
-     *   annotated with [androidx.appfunctions.AppFunctionSchemaCapability].
-     */
-    fun findSuperTypesWithCapabilityAnnotation(): Set<KSClassDeclaration> {
-        return buildSet {
-            val unvisitedSuperTypes: MutableList<KSTypeReference> =
-                classToValidate.superTypes.toMutableList()
-
-            while (!unvisitedSuperTypes.isEmpty()) {
-                val superTypeClassDeclaration =
-                    unvisitedSuperTypes.removeLast().resolve().declaration as KSClassDeclaration
-                if (
-                    superTypeClassDeclaration.annotations.findAnnotation(
-                        IntrospectionHelper.AppFunctionSchemaCapability.CLASS_NAME
-                    ) != null
-                ) {
-                    add(superTypeClassDeclaration)
-                }
-                if (
-                    superTypeClassDeclaration.annotations.findAnnotation(
-                        IntrospectionHelper.AppFunctionSerializableAnnotation.CLASS_NAME
-                    ) == null
-                ) {
-                    // Only consider non serializable super types since serializable super types
-                    // are already handled separately
-                    unvisitedSuperTypes.addAll(superTypeClassDeclaration.superTypes)
-                }
-            }
-        }
-    }
-
-    /**
-     * Finds all super types of the serializable [classToValidate] that are annotated with the
-     * [androidx.appfunctions.AppFunctionSerializable] annotation.
-     *
-     * For example, consider the following classes:
-     * ```
-     * @AppFunctionSerializable
-     * open class Address (
-     *     open val street: String,
-     *     open val city: String,
-     *     open val state: String,
-     *     open val zipCode: String,
-     * )
-     *
-     * @AppFunctionSerializable
-     * class MySerializableClass(
-     *     override val street: String,
-     *     override val city: String,
-     *     override val state: String,
-     *     override val zipCode: String,
-     * ) : Address
-     * ```
-     *
-     * This method will return the [KSClassDeclaration] of `Address` since it is a super type of
-     * `MySerializableClass` and is annotated with the
-     * [androidx.appfunctions.AppFunctionSerializable] annotation.
-     *
-     * @return a set of [KSClassDeclaration] for all super types of the [classToValidate] that are
-     *   annotated with [androidx.appfunctions.AppFunctionSerializable].
-     */
-    fun findSuperTypesWithSerializableAnnotation(): Set<KSClassDeclaration> {
-        return classToValidate.superTypes
-            .map { it.resolve().declaration as KSClassDeclaration }
-            .filter {
-                it.annotations.findAnnotation(
-                    IntrospectionHelper.AppFunctionSerializableAnnotation.CLASS_NAME
-                ) != null
-            }
-            .toSet()
-    }
-
-    /**
-     * Validates that the super types of the serializable [classToValidate] are valid.
-     *
-     * A super type of a serializable class must be annotated with either
-     * [androidx.appfunctions.AppFunctionSchemaCapability] or
-     * [androidx.appfunctions.AppFunctionSerializable]. A class cannot be annotated with both
-     * annotations.
-     *
-     * @param superTypesWithSerializableAnnotation a set of [KSClassDeclaration] for all super types
-     *   of the [classToValidate] that are annotated with
-     *   [androidx.appfunctions.AppFunctionSerializable].
-     * @param superTypesWithCapabilityAnnotation a set of [KSClassDeclaration] for all super types
-     *   of the [classToValidate] that are annotated with
-     *   [androidx.appfunctions.AppFunctionSchemaCapability].
-     */
-    private fun validateSuperTypes(
-        superTypesWithSerializableAnnotation: Set<KSClassDeclaration>,
-        superTypesWithCapabilityAnnotation: Set<KSClassDeclaration>
-    ) {
-        if (
-            superTypesWithSerializableAnnotation
-                .intersect(superTypesWithCapabilityAnnotation)
-                .isNotEmpty()
-        ) {
-            throw ProcessingException(
-                "A class cannot be annotated with both @AppFunctionSerializable and " +
-                    "@AppFunctionSchemaCapability.",
-                classToValidate
-            )
-        }
-    }
-
-    private fun validateParameters(
-        parametersToValidate: MutableMap<String, KSValueParameter>,
-    ) {
-        val superTypesWithSerializableAnnotation = findSuperTypesWithSerializableAnnotation()
-        val superTypesWithCapabilityAnnotation = findSuperTypesWithCapabilityAnnotation()
-        validateSuperTypes(superTypesWithSerializableAnnotation, superTypesWithCapabilityAnnotation)
-        for (superType in superTypesWithSerializableAnnotation) {
-            if (
-                superType.annotations.findAnnotation(
-                    IntrospectionHelper.AppFunctionSerializableAnnotation.CLASS_NAME
-                ) == null
-            ) {
-                throw ProcessingException(
-                    "Expected supertype with @AppFunctionSerializable annotation.",
-                    superType
-                )
-            }
-            val superTypePrimaryConstructor = superType.validateSerializablePrimaryConstructor()
-
-            for (superTypeParameter in superTypePrimaryConstructor.parameters) {
-                // Parameter has now been visited
-                val parameterInSuperType =
-                    parametersToValidate.remove(superTypeParameter.name.toString())
-                if (parameterInSuperType == null) {
-                    throw ProcessingException(
-                        "All parameters in @AppFunctionSerializable " +
-                            "supertypes must be present in subtype",
-                        superTypeParameter
-                    )
-                }
-                validateSerializableParameter(parameterInSuperType)
-            }
-        }
-
-        for (superType in superTypesWithCapabilityAnnotation) {
-            if (
-                superType.annotations.findAnnotation(
-                    IntrospectionHelper.AppFunctionSchemaCapability.CLASS_NAME
-                ) == null
-            ) {
-                throw ProcessingException(
-                    "Expected supertype with @AppFunctionSchemaCapability annotation.",
-                    superType
-                )
-            }
-            val capabilityProperties = superType.getDeclaredProperties()
-
-            for (superTypeProperty in capabilityProperties) {
-                // Parameter has now been visited
-                val parameterInSuperType =
-                    parametersToValidate.remove(superTypeProperty.simpleName.toString())
-                if (parameterInSuperType == null) {
-                    throw ProcessingException(
-                        "All Properties in @AppFunctionSchemaCapability " +
-                            "supertypes must be present in subtype",
-                        superTypeProperty
-                    )
-                }
-                validateSerializableParameter(parameterInSuperType)
-            }
-        }
-
-        // Validate the remaining parameters
-        if (parametersToValidate.isNotEmpty()) {
-            for ((_, parameterToValidate) in parametersToValidate) {
-                validateSerializableParameter(parameterToValidate)
-            }
-        }
-    }
-
-    private fun KSClassDeclaration.validateSerializablePrimaryConstructor(): KSFunctionDeclaration {
-        if (primaryConstructor == null) {
-            throw ProcessingException(
-                "A valid AppFunctionSerializable must have a primary constructor.",
-                this
-            )
-        }
-        val primaryConstructorDeclaration = checkNotNull(primaryConstructor)
-        if (primaryConstructorDeclaration.parameters.isEmpty()) {
-            throw ProcessingException(
-                "A valid AppFunctionSerializable must have a non-empty primary constructor.",
-                this
-            )
-        }
-
-        if (primaryConstructorDeclaration.getVisibility() != Visibility.PUBLIC) {
-            throw ProcessingException(
-                "A valid AppFunctionSerializable must have  a public primary constructor.",
-                this
-            )
-        }
-        return primaryConstructorDeclaration
-    }
-
-    private fun validateSerializableParameter(ksValueParameter: KSValueParameter) {
-        if (!ksValueParameter.isVal) {
-            throw ProcessingException(
-                "All parameters in @AppFunctionSerializable primary constructor must have getters",
-                ksValueParameter
-            )
-        }
-
-        if (!isSupportedType(ksValueParameter.type)) {
-            throw ProcessingException(
-                "AppFunctionSerializable properties must be one of the following types:\n" +
-                    SUPPORTED_TYPES_STRING +
-                    ", an @AppFunctionSerializable or a list of @AppFunctionSerializable\nbut found " +
-                    ksValueParameter.type.toTypeName(),
-                ksValueParameter
-            )
-        }
-    }
-}
diff --git a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/processors/AppFunctionSerializableFactoryCodeBuilder.kt b/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/processors/AppFunctionSerializableFactoryCodeBuilder.kt
index 13a6266..90226af 100644
--- a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/processors/AppFunctionSerializableFactoryCodeBuilder.kt
+++ b/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/processors/AppFunctionSerializableFactoryCodeBuilder.kt
@@ -18,8 +18,6 @@
 
 import androidx.appfunctions.AppFunctionData
 import androidx.appfunctions.compiler.core.AnnotatedAppFunctionSerializable
-import androidx.appfunctions.compiler.core.AnnotatedAppFunctionSerializableProxy
-import androidx.appfunctions.compiler.core.AppFunctionPropertyDeclaration
 import androidx.appfunctions.compiler.core.AppFunctionTypeReference
 import androidx.appfunctions.compiler.core.AppFunctionTypeReference.AppFunctionSupportedTypeCategory.PRIMITIVE_ARRAY
 import androidx.appfunctions.compiler.core.AppFunctionTypeReference.AppFunctionSupportedTypeCategory.PRIMITIVE_LIST
@@ -29,11 +27,11 @@
 import androidx.appfunctions.compiler.core.IntrospectionHelper.AppFunctionSerializableFactoryClass.FromAppFunctionDataMethod
 import androidx.appfunctions.compiler.core.IntrospectionHelper.AppFunctionSerializableFactoryClass.FromAppFunctionDataMethod.APP_FUNCTION_DATA_PARAM_NAME
 import androidx.appfunctions.compiler.core.IntrospectionHelper.AppFunctionSerializableFactoryClass.ToAppFunctionDataMethod.APP_FUNCTION_SERIALIZABLE_PARAM_NAME
-import androidx.appfunctions.compiler.core.ProcessingException
 import androidx.appfunctions.compiler.core.ensureQualifiedTypeName
 import androidx.appfunctions.compiler.core.isOfType
 import androidx.appfunctions.compiler.core.toTypeName
 import com.google.devtools.ksp.symbol.KSTypeReference
+import com.google.devtools.ksp.symbol.KSValueParameter
 import com.squareup.kotlinpoet.ClassName
 import com.squareup.kotlinpoet.CodeBlock
 import com.squareup.kotlinpoet.STRING
@@ -50,52 +48,14 @@
     /** Builds and appends the method body of fromAppFunctionData to the given code block. */
     fun appendFromAppFunctionDataMethodBody(): CodeBlock {
         return buildCodeBlock {
-            val getterResultName = "result${annotatedClass.originalClassName.simpleName}"
-            add(appendCommonFromAppFunctionDataMethodBody(getterResultName))
-            addStatement(
-                """
-                return %L
-                """
-                    .trimIndent(),
-                getterResultName
-            )
-        }
-    }
-
-    fun appendFromAppFunctionDataMethodBodyForProxy(): CodeBlock {
-        if (annotatedClass !is AnnotatedAppFunctionSerializableProxy) {
-            throw ProcessingException(
-                "Attempting to generate proxy getter for non proxy serializable.",
-                // TODO(b/403199251): provide KSNode to improve error message
-                null
-            )
-        }
-        return buildCodeBlock {
-            val getterResultName = "result${annotatedClass.originalClassName.simpleName}"
-            add(appendCommonFromAppFunctionDataMethodBody(getterResultName))
-            addStatement(
-                """
-                return %L.%L()
-                """
-                    .trimIndent(),
-                getterResultName,
-                annotatedClass.toTargetClassMethodName
-            )
-        }
-    }
-
-    private fun appendCommonFromAppFunctionDataMethodBody(getterResultName: String): CodeBlock {
-        return buildCodeBlock {
             add(factoryInitStatements)
-            for ((paramName, paramType) in annotatedClass.getProperties()) {
-                appendGetterStatement(paramName, paramType)
+            for (property in annotatedClass.getProperties()) {
+                appendGetterStatement(property)
             }
-            appendGetterResultConstructorCallStatement(
+            appendGetterReturnStatement(
                 annotatedClass.originalClassName,
-                annotatedClass.getProperties(),
-                getterResultName
+                annotatedClass.getProperties()
             )
-            add("\n")
         }
     }
 
@@ -109,7 +69,7 @@
                 val afType = AppFunctionTypeReference(property.type)
                 val formatStringMap =
                     mapOf<String, Any>(
-                        "param_name" to property.name,
+                        "param_name" to checkNotNull(property.name).asString(),
                         "annotated_class_instance" to APP_FUNCTION_SERIALIZABLE_PARAM_NAME
                     )
                 addNamed(
@@ -117,9 +77,9 @@
                     formatStringMap
                 )
                 if (afType.isNullable) {
-                    appendNullableSetterStatement(property.name, afType)
+                    appendNullableSetterStatement(property, afType)
                 } else {
-                    appendSetterStatement(property.name, afType)
+                    appendSetterStatement(property, afType)
                 }
             }
             add("\nreturn builder.build()")
@@ -127,26 +87,25 @@
     }
 
     private fun CodeBlock.Builder.appendGetterStatement(
-        paramName: String,
-        paramType: KSTypeReference
+        param: KSValueParameter
     ): CodeBlock.Builder {
-        val afType = AppFunctionTypeReference(paramType)
+        val afType = AppFunctionTypeReference(param.type)
         return when (afType.typeCategory) {
             PRIMITIVE_SINGULAR,
             PRIMITIVE_ARRAY,
-            PRIMITIVE_LIST -> appendPrimitiveGetterStatement(paramName, afType)
-            SERIALIZABLE_SINGULAR -> appendSerializableGetterStatement(paramName, afType)
-            SERIALIZABLE_LIST -> appendSerializableListGetterStatement(paramName, afType)
+            PRIMITIVE_LIST -> appendPrimitiveGetterStatement(param, afType)
+            SERIALIZABLE_SINGULAR -> appendSerializableGetterStatement(param, afType)
+            SERIALIZABLE_LIST -> appendSerializableListGetterStatement(param, afType)
         }
     }
 
     private fun CodeBlock.Builder.appendPrimitiveGetterStatement(
-        paramName: String,
+        param: KSValueParameter,
         afType: AppFunctionTypeReference
     ): CodeBlock.Builder {
         val formatStringMap =
             mapOf<String, Any>(
-                "param_name" to paramName,
+                "param_name" to checkNotNull(param.name).asString(),
                 "app_function_data_param_name" to APP_FUNCTION_DATA_PARAM_NAME,
                 "getter_name" to getAppFunctionDataGetterName(afType),
                 "default_value_postfix" to getGetterDefaultValuePostfix(afType)
@@ -166,14 +125,15 @@
     }
 
     private fun CodeBlock.Builder.appendSerializableGetterStatement(
-        paramName: String,
+        param: KSValueParameter,
         afType: AppFunctionTypeReference
     ): CodeBlock.Builder {
+        val paramName = checkNotNull(param.name).asString()
         val typeName = afType.selfTypeReference.getTypeShortName()
         val formatStringMap =
             mapOf<String, Any>(
                 "param_name" to paramName,
-                "param_type" to afType.selfTypeReference.toTypeName(),
+                "param_type" to param.type.toTypeName(),
                 "factory_name" to "${typeName}Factory".lowerFirstChar(),
                 "app_function_data_param_name" to APP_FUNCTION_DATA_PARAM_NAME,
                 "getter_name" to getAppFunctionDataGetterName(afType),
@@ -209,7 +169,7 @@
     }
 
     private fun CodeBlock.Builder.appendSerializableListGetterStatement(
-        paramName: String,
+        param: KSValueParameter,
         afType: AppFunctionTypeReference
     ): CodeBlock.Builder {
         val parametrizedTypeName = afType.itemTypeReference.getTypeShortName()
@@ -217,8 +177,8 @@
         val factoryInstanceName = factoryName.lowerFirstChar()
         val formatStringMap =
             mapOf<String, Any>(
-                "param_name" to paramName,
-                "temp_list_name" to "${paramName}Data",
+                "param_name" to checkNotNull(param.name).asString(),
+                "temp_list_name" to checkNotNull(param.name).asString() + "Data",
                 "app_function_data_param_name" to APP_FUNCTION_DATA_PARAM_NAME,
                 "factory_instance_name" to factoryInstanceName,
                 "getter_name" to getAppFunctionDataGetterName(afType),
@@ -241,61 +201,57 @@
         return this
     }
 
-    private fun CodeBlock.Builder.appendGetterResultConstructorCallStatement(
+    private fun CodeBlock.Builder.appendGetterReturnStatement(
         originalClassName: ClassName,
-        properties: List<AppFunctionPropertyDeclaration>,
-        getterResultName: String
+        params: List<KSValueParameter>
     ): CodeBlock.Builder {
         val formatStringMap =
             mapOf<String, Any>(
                 "original_class_name" to originalClassName,
-                "params_list" to properties.joinToString(", ") { it.name },
-                "getter_result_name" to getterResultName
+                "params_list" to
+                    params.joinToString(", ") { param -> checkNotNull(param.name).asString() }
             )
 
-        addNamed(
-            "\nval %getter_result_name:L = %original_class_name:T(%params_list:L)",
-            formatStringMap
-        )
+        addNamed("\nreturn %original_class_name:T(%params_list:L)", formatStringMap)
         return this
     }
 
     private fun CodeBlock.Builder.appendNullableSetterStatement(
-        paramName: String,
-        afType: AppFunctionTypeReference
+        param: KSValueParameter,
+        type: AppFunctionTypeReference
     ): CodeBlock.Builder {
         val formatStringMap =
             mapOf<String, Any>(
-                "param_name" to paramName,
+                "param_name" to checkNotNull(param.name).asString(),
             )
 
         return addNamed("if (%param_name:L != null) {\n", formatStringMap)
             .indent()
-            .appendSetterStatement(paramName, afType)
+            .appendSetterStatement(param, type)
             .unindent()
             .addStatement("}")
     }
 
     private fun CodeBlock.Builder.appendSetterStatement(
-        paramName: String,
+        param: KSValueParameter,
         afType: AppFunctionTypeReference
     ): CodeBlock.Builder {
         return when (afType.typeCategory) {
             PRIMITIVE_SINGULAR,
             PRIMITIVE_ARRAY,
-            PRIMITIVE_LIST -> appendPrimitiveSetterStatement(paramName, afType)
-            SERIALIZABLE_SINGULAR -> appendSerializableSetterStatement(paramName, afType)
-            SERIALIZABLE_LIST -> appendSerializableListSetterStatement(paramName, afType)
+            PRIMITIVE_LIST -> appendPrimitiveSetterStatement(param, afType)
+            SERIALIZABLE_SINGULAR -> appendSerializableSetterStatement(param, afType)
+            SERIALIZABLE_LIST -> appendSerializableListSetterStatement(param, afType)
         }
     }
 
     private fun CodeBlock.Builder.appendPrimitiveSetterStatement(
-        paramName: String,
+        param: KSValueParameter,
         afType: AppFunctionTypeReference
     ): CodeBlock.Builder {
         val formatStringMap =
             mapOf<String, Any>(
-                "param_name" to paramName,
+                "param_name" to checkNotNull(param.name).asString(),
                 "setter_name" to getAppFunctionDataSetterName(afType),
             )
         addNamed("builder.%setter_name:L(\"%param_name:L\", %param_name:L)\n", formatStringMap)
@@ -303,13 +259,13 @@
     }
 
     private fun CodeBlock.Builder.appendSerializableSetterStatement(
-        paramName: String,
+        param: KSValueParameter,
         afType: AppFunctionTypeReference
     ): CodeBlock.Builder {
         val typeName = afType.selfTypeReference.getTypeShortName()
         val formatStringMap =
             mapOf<String, Any>(
-                "param_name" to paramName,
+                "param_name" to checkNotNull(param.name).asString(),
                 "factory_name" to "${typeName}Factory".lowerFirstChar(),
                 "setter_name" to getAppFunctionDataSetterName(afType),
             )
@@ -322,14 +278,14 @@
     }
 
     private fun CodeBlock.Builder.appendSerializableListSetterStatement(
-        paramName: String,
+        param: KSValueParameter,
         afType: AppFunctionTypeReference
     ): CodeBlock.Builder {
         val parametrizedTypeName = afType.selfOrItemTypeReference.getTypeShortName()
 
         val formatStringMap =
             mapOf<String, Any>(
-                "param_name" to paramName,
+                "param_name" to checkNotNull(param.name).asString(),
                 "factory_name" to "${parametrizedTypeName}Factory".lowerFirstChar(),
                 "setter_name" to getAppFunctionDataSetterName(afType),
                 "lambda_param_name" to parametrizedTypeName.lowerFirstChar()
diff --git a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/processors/AppFunctionSerializableProcessor.kt b/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/processors/AppFunctionSerializableProcessor.kt
index 75f0653..1e8b294 100644
--- a/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/processors/AppFunctionSerializableProcessor.kt
+++ b/appfunctions/appfunctions-compiler/src/main/java/androidx/appfunctions/compiler/processors/AppFunctionSerializableProcessor.kt
@@ -20,14 +20,12 @@
 import androidx.appfunctions.AppFunctionData
 import androidx.appfunctions.compiler.AppFunctionCompiler
 import androidx.appfunctions.compiler.core.AnnotatedAppFunctionSerializable
-import androidx.appfunctions.compiler.core.AnnotatedAppFunctionSerializableProxy
-import androidx.appfunctions.compiler.core.AppFunctionSymbolResolver
+import androidx.appfunctions.compiler.core.IntrospectionHelper.AppFunctionSerializableAnnotation
 import androidx.appfunctions.compiler.core.IntrospectionHelper.AppFunctionSerializableFactoryClass
 import androidx.appfunctions.compiler.core.IntrospectionHelper.AppFunctionSerializableFactoryClass.FromAppFunctionDataMethod.APP_FUNCTION_DATA_PARAM_NAME
 import androidx.appfunctions.compiler.core.IntrospectionHelper.AppFunctionSerializableFactoryClass.ToAppFunctionDataMethod.APP_FUNCTION_SERIALIZABLE_PARAM_NAME
 import androidx.appfunctions.compiler.core.ProcessingException
 import androidx.appfunctions.compiler.core.logException
-import androidx.appfunctions.compiler.core.toClassName
 import com.google.devtools.ksp.processing.CodeGenerator
 import com.google.devtools.ksp.processing.Dependencies
 import com.google.devtools.ksp.processing.KSPLogger
@@ -36,6 +34,7 @@
 import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
 import com.google.devtools.ksp.processing.SymbolProcessorProvider
 import com.google.devtools.ksp.symbol.KSAnnotated
+import com.google.devtools.ksp.symbol.KSClassDeclaration
 import com.squareup.kotlinpoet.FileSpec
 import com.squareup.kotlinpoet.FunSpec
 import com.squareup.kotlinpoet.KModifier
@@ -43,13 +42,11 @@
 import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
 import com.squareup.kotlinpoet.TypeSpec
 import com.squareup.kotlinpoet.asTypeName
-import com.squareup.kotlinpoet.buildCodeBlock
 
 /**
  * Generates a factory class with methods to convert classes annotated with
- * [androidx.appfunctions.AppFunctionSerializable] or
- * [androidx.appfunctions.AppFunctionSerializableProxy] to [androidx.appfunctions.AppFunctionData],
- * and vice-versa.
+ * [androidx.appfunctions.AppFunctionSerializable] to [androidx.appfunctions.AppFunctionData], and
+ * vice-versa.
  *
  * **Example:**
  *
@@ -84,29 +81,38 @@
     private val codeGenerator: CodeGenerator,
     private val logger: KSPLogger,
 ) : SymbolProcessor {
-    private var hasProcessed = false
-
     override fun process(resolver: Resolver): List<KSAnnotated> {
-        if (hasProcessed) return emptyList()
-        hasProcessed = true
-
         try {
-            val entitySymbolResolver = AppFunctionSymbolResolver(resolver)
-            val entityClasses = entitySymbolResolver.resolveAnnotatedAppFunctionSerializables()
-            val entityProxyClasses =
-                entitySymbolResolver.resolveAnnotatedAppFunctionSerializableProxies()
+            val entityClasses = resolveAppFunctionSerializables(resolver)
             for (entity in entityClasses) {
                 buildAppFunctionSerializableFactoryClass(entity)
             }
-            for (entityProxy in entityProxyClasses) {
-                buildAppFunctionSerializableProxyFactoryClass(entityProxy)
-            }
         } catch (e: ProcessingException) {
             logger.logException(e)
         }
         return emptyList()
     }
 
+    fun resolveAppFunctionSerializables(
+        resolver: Resolver
+    ): List<AnnotatedAppFunctionSerializable> {
+        val annotatedAppFunctionSerializables =
+            resolver.getSymbolsWithAnnotation(
+                AppFunctionSerializableAnnotation.CLASS_NAME.canonicalName
+            )
+        return annotatedAppFunctionSerializables
+            .map {
+                if (it !is KSClassDeclaration) {
+                    throw ProcessingException(
+                        "Only classes can be annotated with @AppFunctionSerializable",
+                        it
+                    )
+                }
+                AnnotatedAppFunctionSerializable(it).validate()
+            }
+            .toList()
+    }
+
     private fun buildAppFunctionSerializableFactoryClass(
         annotatedClass: AnnotatedAppFunctionSerializable
     ) {
@@ -148,47 +154,6 @@
             .use { fileSpec.writeTo(it) }
     }
 
-    private fun buildAppFunctionSerializableProxyFactoryClass(
-        annotatedProxyClass: AnnotatedAppFunctionSerializableProxy
-    ) {
-        val proxySuperInterfaceClass =
-            AppFunctionSerializableFactoryClass.CLASS_NAME.parameterizedBy(
-                annotatedProxyClass.targetClassDeclaration.toClassName()
-            )
-        val generatedSerializableProxyFactoryClassName =
-            "\$${checkNotNull(
-                annotatedProxyClass.targetClassDeclaration.simpleName).asString()}Factory"
-        val serializableProxyClassBuilder =
-            TypeSpec.classBuilder(generatedSerializableProxyFactoryClassName)
-        val factoryCodeBuilder = AppFunctionSerializableFactoryCodeBuilder(annotatedProxyClass)
-        serializableProxyClassBuilder.addAnnotation(AppFunctionCompiler.GENERATED_ANNOTATION)
-        serializableProxyClassBuilder.addSuperinterface(proxySuperInterfaceClass)
-        serializableProxyClassBuilder.addFunction(
-            buildProxyFromAppFunctionDataFunction(annotatedProxyClass, factoryCodeBuilder)
-        )
-        serializableProxyClassBuilder.addFunction(
-            buildProxyToAppFunctionDataFunction(annotatedProxyClass)
-        )
-        val fileSpec =
-            FileSpec.builder(
-                    annotatedProxyClass.originalClassName.packageName,
-                    generatedSerializableProxyFactoryClassName
-                )
-                .addType(serializableProxyClassBuilder.build())
-                .build()
-        codeGenerator
-            .createNewFile(
-                Dependencies(
-                    aggregating = true,
-                    *annotatedProxyClass.getSerializableSourceFiles().toTypedArray()
-                ),
-                annotatedProxyClass.originalClassName.packageName,
-                generatedSerializableProxyFactoryClassName
-            )
-            .bufferedWriter()
-            .use { fileSpec.writeTo(it) }
-    }
-
     private fun buildFromAppFunctionDataFunction(
         annotatedClass: AnnotatedAppFunctionSerializable,
         factoryCodeBuilder: AppFunctionSerializableFactoryCodeBuilder,
@@ -205,23 +170,6 @@
             .build()
     }
 
-    // Todo(b/403199251): Remove temp method
-    private fun buildProxyFromAppFunctionDataFunction(
-        annotatedProxyClass: AnnotatedAppFunctionSerializableProxy,
-        factoryCodeBuilder: AppFunctionSerializableFactoryCodeBuilder,
-    ): FunSpec {
-        return FunSpec.builder(
-                AppFunctionSerializableFactoryClass.FromAppFunctionDataMethod.METHOD_NAME
-            )
-            .addModifiers(KModifier.OVERRIDE)
-            .addParameter(
-                ParameterSpec.builder(APP_FUNCTION_DATA_PARAM_NAME, AppFunctionData::class).build()
-            )
-            .addCode(factoryCodeBuilder.appendFromAppFunctionDataMethodBodyForProxy())
-            .returns(annotatedProxyClass.targetClassDeclaration.toClassName())
-            .build()
-    }
-
     private fun buildToAppFunctionDataFunction(
         annotatedClass: AnnotatedAppFunctionSerializable,
         factoryCodeBuilder: AppFunctionSerializableFactoryCodeBuilder
@@ -242,36 +190,6 @@
             .build()
     }
 
-    // Todo(b/403199251): Remove temp method
-    private fun buildProxyToAppFunctionDataFunction(
-        annotatedProxyClass: AnnotatedAppFunctionSerializableProxy,
-    ): FunSpec {
-        return FunSpec.builder(
-                AppFunctionSerializableFactoryClass.ToAppFunctionDataMethod.METHOD_NAME
-            )
-            .addModifiers(KModifier.OVERRIDE)
-            .addParameter(
-                ParameterSpec.builder(
-                        APP_FUNCTION_SERIALIZABLE_PARAM_NAME,
-                        annotatedProxyClass.targetClassDeclaration.toClassName()
-                    )
-                    .build()
-            )
-            .addCode(
-                buildCodeBlock {
-                    addStatement(
-                        """
-                        return %T.Builder("").build()
-                        """
-                            .trimIndent(),
-                        AppFunctionData::class.asTypeName()
-                    )
-                }
-            )
-            .returns(AppFunctionData::class.asTypeName())
-            .build()
-    }
-
     @VisibleForTesting
     class Provider : SymbolProcessorProvider {
         override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
diff --git a/appfunctions/appfunctions-compiler/src/test/java/androidx/appfunctions/compiler/processors/AppFunctionSerializableProcessorTest.kt b/appfunctions/appfunctions-compiler/src/test/java/androidx/appfunctions/compiler/processors/AppFunctionSerializableProcessorTest.kt
index 3bfc423..d0424d3 100644
--- a/appfunctions/appfunctions-compiler/src/test/java/androidx/appfunctions/compiler/processors/AppFunctionSerializableProcessorTest.kt
+++ b/appfunctions/appfunctions-compiler/src/test/java/androidx/appfunctions/compiler/processors/AppFunctionSerializableProcessorTest.kt
@@ -203,41 +203,4 @@
             "AppFunctionSerializable properties must be one of the following types:\n"
         )
     }
-
-    @Test
-    fun testProcessor_validAppFunctionSerializableFactory_succeeds() {
-        val report =
-            compilationTestHelper.compileAll(
-                sourceFileNames = listOf("AppFunctionLocalDateTime.KT")
-            )
-        compilationTestHelper.assertSuccessWithSourceContent(
-            report = report,
-            expectGeneratedSourceFileName = "\$LocalDateTimeFactory.kt",
-            goldenFileName = "\$LocalDateTimeFactory.KT"
-        )
-    }
-
-    @Test
-    fun testProcessor_serializableProxyMissingToMethod_fails() {
-        val report =
-            compilationTestHelper.compileAll(
-                sourceFileNames = listOf("SerializableProxyMissingToMethod.KT")
-            )
-        compilationTestHelper.assertErrorWithMessage(
-            report,
-            "Class must have exactly one member function: toLocalDateTime"
-        )
-    }
-
-    @Test
-    fun testProcessor_serializableProxyMissingFromMethod_fails() {
-        val report =
-            compilationTestHelper.compileAll(
-                sourceFileNames = listOf("SerializableProxyMissingFromMethod.KT")
-            )
-        compilationTestHelper.assertErrorWithMessage(
-            report,
-            "Companion Class must have exactly one member function: fromLocalDateTime"
-        )
-    }
 }
diff --git a/appfunctions/appfunctions-compiler/src/test/test-data/input/AppFunctionLocalDateTime.KT b/appfunctions/appfunctions-compiler/src/test/test-data/input/AppFunctionLocalDateTime.KT
deleted file mode 100644
index 2f6e6289..0000000
--- a/appfunctions/appfunctions-compiler/src/test/test-data/input/AppFunctionLocalDateTime.KT
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.testdata
-
-import android.os.Build
-import androidx.annotation.RequiresApi
-import androidx.annotation.RestrictTo
-import androidx.annotation.RestrictTo.Scope
-import androidx.appfunctions.AppFunctionSerializableProxy
-import java.time.LocalDateTime
-
-/**
- * A proxy class for [LocalDateTime] that can be used to serialize and deserialize [LocalDateTime]
- * objects across the App Functions boundary.
- */
-@RestrictTo(Scope.LIBRARY_GROUP)
-@AppFunctionSerializableProxy(
-    targetClass = LocalDateTime::class)
-public data class AppFunctionLocalDateTime(
-    val year: Int,
-    val month: Int,
-    val dayOfMonth: Int,
-    val hour: Int,
-    val minute: Int,
-    val second: Int,
-    val nanoOfSecond: Int
-) {
-    @RequiresApi(Build.VERSION_CODES.O)
-    public fun toLocalDateTime(): LocalDateTime {
-        return LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond)
-    }
-
-    public companion object {
-        @RequiresApi(Build.VERSION_CODES.O)
-        public fun fromLocalDateTime(localDateTime: LocalDateTime): AppFunctionLocalDateTime {
-            return AppFunctionLocalDateTime(
-                localDateTime.year,
-                localDateTime.monthValue,
-                localDateTime.dayOfMonth,
-                localDateTime.hour,
-                localDateTime.minute,
-                localDateTime.second,
-                localDateTime.nano
-            )
-        }
-    }
-}
diff --git a/appfunctions/appfunctions-compiler/src/test/test-data/input/SerializableProxyMissingFromMethod.KT b/appfunctions/appfunctions-compiler/src/test/test-data/input/SerializableProxyMissingFromMethod.KT
deleted file mode 100644
index 690d8bf..0000000
--- a/appfunctions/appfunctions-compiler/src/test/test-data/input/SerializableProxyMissingFromMethod.KT
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.testdata
-
-import android.os.Build
-import androidx.annotation.RequiresApi
-import androidx.annotation.RestrictTo
-import androidx.annotation.RestrictTo.Scope
-import androidx.appfunctions.AppFunctionSerializableProxy
-import java.time.LocalDateTime
-
-/**
- * A proxy class for [LocalDateTime] that can be used to serialize and deserialize [LocalDateTime]
- * objects across the App Functions boundary.
- */
-@RestrictTo(Scope.LIBRARY_GROUP)
-@AppFunctionSerializableProxy(targetClass = LocalDateTime::class)
-public data class AppFunctionLocalDateTime(
-    val year: Int,
-    val month: Int,
-    val dayOfMonth: Int,
-    val hour: Int,
-    val minute: Int,
-    val second: Int,
-    val nanoOfSecond: Int
-) {
-    @RequiresApi(Build.VERSION_CODES.O)
-    public fun toLocalDateTime(): LocalDateTime {
-        return LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond)
-    }
-
-    public companion object {}
-}
diff --git a/appfunctions/appfunctions-compiler/src/test/test-data/input/SerializableProxyMissingToMethod.KT b/appfunctions/appfunctions-compiler/src/test/test-data/input/SerializableProxyMissingToMethod.KT
deleted file mode 100644
index 60c1800..0000000
--- a/appfunctions/appfunctions-compiler/src/test/test-data/input/SerializableProxyMissingToMethod.KT
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.testdata
-
-import android.os.Build
-import androidx.annotation.RequiresApi
-import androidx.annotation.RestrictTo
-import androidx.annotation.RestrictTo.Scope
-import androidx.appfunctions.AppFunctionSerializableProxy
-import java.time.LocalDateTime
-
-/**
- * A proxy class for [LocalDateTime] that can be used to serialize and deserialize [LocalDateTime]
- * objects across the App Functions boundary.
- */
-@RestrictTo(Scope.LIBRARY_GROUP)
-@AppFunctionSerializableProxy(targetClass = LocalDateTime::class)
-public data class AppFunctionLocalDateTime(
-    val year: Int,
-    val month: Int,
-    val dayOfMonth: Int,
-    val hour: Int,
-    val minute: Int,
-    val second: Int,
-    val nanoOfSecond: Int
-) {
-
-    public companion object {
-        @RequiresApi(Build.VERSION_CODES.O)
-        public fun fromLocalDateTime(localDateTime: LocalDateTime): AppFunctionLocalDateTime {
-            return AppFunctionLocalDateTime(
-                localDateTime.year,
-                localDateTime.monthValue,
-                localDateTime.dayOfMonth,
-                localDateTime.hour,
-                localDateTime.minute,
-                localDateTime.second,
-                localDateTime.nano
-            )
-        }
-    }
-}
diff --git a/appfunctions/appfunctions-compiler/src/test/test-data/output/$DerivedSerializableFactory.KT b/appfunctions/appfunctions-compiler/src/test/test-data/output/$DerivedSerializableFactory.KT
index 798ccb2..2adee34 100644
--- a/appfunctions/appfunctions-compiler/src/test/test-data/output/$DerivedSerializableFactory.KT
+++ b/appfunctions/appfunctions-compiler/src/test/test-data/output/$DerivedSerializableFactory.KT
@@ -11,8 +11,7 @@
     val stringToOpen = checkNotNull(appFunctionData.getString("stringToOpen"))
     val age = checkNotNull(appFunctionData.getLongOrNull("age"))
 
-    val resultDerivedSerializable = DerivedSerializable(stringToOpen, age)
-    return resultDerivedSerializable
+    return DerivedSerializable(stringToOpen, age)
   }
 
   override fun toAppFunctionData(appFunctionSerializable: DerivedSerializable): AppFunctionData {
diff --git a/appfunctions/appfunctions-compiler/src/test/test-data/output/$EntityWithDiffPackageSerializablePropertyFactory.KT b/appfunctions/appfunctions-compiler/src/test/test-data/output/$EntityWithDiffPackageSerializablePropertyFactory.KT
index 620ed9d..0283ed2 100644
--- a/appfunctions/appfunctions-compiler/src/test/test-data/output/$EntityWithDiffPackageSerializablePropertyFactory.KT
+++ b/appfunctions/appfunctions-compiler/src/test/test-data/output/$EntityWithDiffPackageSerializablePropertyFactory.KT
@@ -17,8 +17,7 @@
       diffPackageSerializableFactory.fromAppFunctionData(data)
     }
 
-    val resultEntityWithDiffPackageSerializableProperty = EntityWithDiffPackageSerializableProperty(inputSerializable, serializableList)
-    return resultEntityWithDiffPackageSerializableProperty
+    return EntityWithDiffPackageSerializableProperty(inputSerializable, serializableList)
   }
 
   override fun toAppFunctionData(appFunctionSerializable: EntityWithDiffPackageSerializableProperty): AppFunctionData {
diff --git a/appfunctions/appfunctions-compiler/src/test/test-data/output/$EntityWithValidNullablePropertiesFactory.KT b/appfunctions/appfunctions-compiler/src/test/test-data/output/$EntityWithValidNullablePropertiesFactory.KT
index f1b2316..1697592 100644
--- a/appfunctions/appfunctions-compiler/src/test/test-data/output/$EntityWithValidNullablePropertiesFactory.KT
+++ b/appfunctions/appfunctions-compiler/src/test/test-data/output/$EntityWithValidNullablePropertiesFactory.KT
@@ -27,8 +27,7 @@
       inputSerializableFactory.fromAppFunctionData(data)
     }
 
-    val resultEntityWithValidNullableProperties = EntityWithValidNullableProperties(longParam, doubleParam, boolParam, stringParam, longArray, doubleArray, boolArray, stringList, inputSerializable, serializableList)
-    return resultEntityWithValidNullableProperties
+    return EntityWithValidNullableProperties(longParam, doubleParam, boolParam, stringParam, longArray, doubleArray, boolArray, stringList, inputSerializable, serializableList)
   }
 
   override fun toAppFunctionData(appFunctionSerializable: EntityWithValidNullableProperties): AppFunctionData {
diff --git a/appfunctions/appfunctions-compiler/src/test/test-data/output/$EntityWithValidPropertiesFactory.KT b/appfunctions/appfunctions-compiler/src/test/test-data/output/$EntityWithValidPropertiesFactory.KT
index c8a18ad..2037aa5 100644
--- a/appfunctions/appfunctions-compiler/src/test/test-data/output/$EntityWithValidPropertiesFactory.KT
+++ b/appfunctions/appfunctions-compiler/src/test/test-data/output/$EntityWithValidPropertiesFactory.KT
@@ -24,8 +24,7 @@
       inputSerializableFactory.fromAppFunctionData(data)
     }
 
-    val resultEntityWithValidProperties = EntityWithValidProperties(longParam, doubleParam, boolParam, stringParam, longArray, doubleArray, boolArray, stringList, inputSerializable, serializableList)
-    return resultEntityWithValidProperties
+    return EntityWithValidProperties(longParam, doubleParam, boolParam, stringParam, longArray, doubleArray, boolArray, stringList, inputSerializable, serializableList)
   }
 
   override fun toAppFunctionData(appFunctionSerializable: EntityWithValidProperties): AppFunctionData {
diff --git a/appfunctions/appfunctions-compiler/src/test/test-data/output/$LocalDateTimeFactory.KT b/appfunctions/appfunctions-compiler/src/test/test-data/output/$LocalDateTimeFactory.KT
deleted file mode 100644
index d12ad80..0000000
--- a/appfunctions/appfunctions-compiler/src/test/test-data/output/$LocalDateTimeFactory.KT
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.testdata
-
-import androidx.appfunctions.AppFunctionData
-import androidx.appfunctions.`internal`.AppFunctionSerializableFactory
-import java.time.LocalDateTime
-import javax.`annotation`.processing.Generated
-
-@Generated("androidx.appfunctions.compiler.AppFunctionCompiler")
-public class `$LocalDateTimeFactory` : AppFunctionSerializableFactory<LocalDateTime> {
-  override fun fromAppFunctionData(appFunctionData: AppFunctionData): LocalDateTime {
-
-    val year = checkNotNull(appFunctionData.getIntOrNull("year"))
-    val month = checkNotNull(appFunctionData.getIntOrNull("month"))
-    val dayOfMonth = checkNotNull(appFunctionData.getIntOrNull("dayOfMonth"))
-    val hour = checkNotNull(appFunctionData.getIntOrNull("hour"))
-    val minute = checkNotNull(appFunctionData.getIntOrNull("minute"))
-    val second = checkNotNull(appFunctionData.getIntOrNull("second"))
-    val nanoOfSecond = checkNotNull(appFunctionData.getIntOrNull("nanoOfSecond"))
-
-    val resultAppFunctionLocalDateTime = AppFunctionLocalDateTime(year, month, dayOfMonth, hour, minute, second, nanoOfSecond)
-    return resultAppFunctionLocalDateTime.toLocalDateTime()
-  }
-
-  override fun toAppFunctionData(appFunctionSerializable: LocalDateTime): AppFunctionData = AppFunctionData.Builder("").build()
-}
diff --git a/appfunctions/appfunctions-compiler/src/test/test-data/output/$LongBaseSerializableFactory.KT b/appfunctions/appfunctions-compiler/src/test/test-data/output/$LongBaseSerializableFactory.KT
index b627453..892e503 100644
--- a/appfunctions/appfunctions-compiler/src/test/test-data/output/$LongBaseSerializableFactory.KT
+++ b/appfunctions/appfunctions-compiler/src/test/test-data/output/$LongBaseSerializableFactory.KT
@@ -11,8 +11,7 @@
     val age = checkNotNull(appFunctionData.getLongOrNull("age"))
     val stringToOpen = checkNotNull(appFunctionData.getString("stringToOpen"))
 
-    val resultLongBaseSerializable = LongBaseSerializable(age, stringToOpen)
-    return resultLongBaseSerializable
+    return LongBaseSerializable(age, stringToOpen)
   }
 
   override fun toAppFunctionData(appFunctionSerializable: LongBaseSerializable): AppFunctionData {
diff --git a/appfunctions/appfunctions-compiler/src/test/test-data/output/$NestedBaseSerializableFactory.KT b/appfunctions/appfunctions-compiler/src/test/test-data/output/$NestedBaseSerializableFactory.KT
index 0026f83..452458a 100644
--- a/appfunctions/appfunctions-compiler/src/test/test-data/output/$NestedBaseSerializableFactory.KT
+++ b/appfunctions/appfunctions-compiler/src/test/test-data/output/$NestedBaseSerializableFactory.KT
@@ -16,8 +16,7 @@
       nestedBase = nestedBaseSerializableFactory.fromAppFunctionData(nestedBaseData)
     }
 
-    val resultNestedBaseSerializable = NestedBaseSerializable(stringBaseName, nestedBase)
-    return resultNestedBaseSerializable
+    return NestedBaseSerializable(stringBaseName, nestedBase)
   }
 
   override fun toAppFunctionData(appFunctionSerializable: NestedBaseSerializable): AppFunctionData {
diff --git a/appfunctions/appfunctions-compiler/src/test/test-data/output/$NestedDerivedSerializableFactory.KT b/appfunctions/appfunctions-compiler/src/test/test-data/output/$NestedDerivedSerializableFactory.KT
index 006536a..73862c9 100644
--- a/appfunctions/appfunctions-compiler/src/test/test-data/output/$NestedDerivedSerializableFactory.KT
+++ b/appfunctions/appfunctions-compiler/src/test/test-data/output/$NestedDerivedSerializableFactory.KT
@@ -23,8 +23,7 @@
       nestedDerived = nestedDerivedSerializableFactory.fromAppFunctionData(nestedDerivedData)
     }
 
-    val resultNestedDerivedSerializable = NestedDerivedSerializable(stringBaseName, nestedBase, longBaseValue, nestedDerived)
-    return resultNestedDerivedSerializable
+    return NestedDerivedSerializable(stringBaseName, nestedBase, longBaseValue, nestedDerived)
   }
 
   override fun toAppFunctionData(appFunctionSerializable: NestedDerivedSerializable): AppFunctionData {
diff --git a/appfunctions/appfunctions-compiler/src/test/test-data/output/$NonNestedChildSerializableFactory.KT b/appfunctions/appfunctions-compiler/src/test/test-data/output/$NonNestedChildSerializableFactory.KT
index 572d6d1..25003f6 100644
--- a/appfunctions/appfunctions-compiler/src/test/test-data/output/$NonNestedChildSerializableFactory.KT
+++ b/appfunctions/appfunctions-compiler/src/test/test-data/output/$NonNestedChildSerializableFactory.KT
@@ -17,8 +17,7 @@
     }
     val longBaseValue = checkNotNull(appFunctionData.getLongOrNull("longBaseValue"))
 
-    val resultNonNestedChildSerializable = NonNestedChildSerializable(stringBaseName, nestedBase, longBaseValue)
-    return resultNonNestedChildSerializable
+    return NonNestedChildSerializable(stringBaseName, nestedBase, longBaseValue)
   }
 
   override fun toAppFunctionData(appFunctionSerializable: NonNestedChildSerializable): AppFunctionData {
diff --git a/appfunctions/appfunctions-compiler/src/test/test-data/output/$RecursiveSerializableFactory.KT b/appfunctions/appfunctions-compiler/src/test/test-data/output/$RecursiveSerializableFactory.KT
index 45de37d..5568833 100644
--- a/appfunctions/appfunctions-compiler/src/test/test-data/output/$RecursiveSerializableFactory.KT
+++ b/appfunctions/appfunctions-compiler/src/test/test-data/output/$RecursiveSerializableFactory.KT
@@ -15,8 +15,7 @@
       nested = recursiveSerializableFactory.fromAppFunctionData(nestedData)
     }
 
-    val resultRecursiveSerializable = RecursiveSerializable(nested)
-    return resultRecursiveSerializable
+    return RecursiveSerializable(nested)
   }
 
   override fun toAppFunctionData(appFunctionSerializable: RecursiveSerializable): AppFunctionData {
diff --git a/appfunctions/appfunctions-runtime/api/current.txt b/appfunctions/appfunctions-runtime/api/current.txt
index 5a9bd68..de190e7 100644
--- a/appfunctions/appfunctions-runtime/api/current.txt
+++ b/appfunctions/appfunctions-runtime/api/current.txt
@@ -28,7 +28,6 @@
     method @RequiresPermission(value="android.permission.EXECUTE_APP_FUNCTIONS", conditional=true) public suspend Object? isAppFunctionEnabled(String packageName, String functionId, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
     method public suspend Object? isAppFunctionEnabled(String functionId, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
     method public boolean isSupported();
-    method @RequiresPermission(value="android.permission.EXECUTE_APP_FUNCTIONS", conditional=true) public kotlinx.coroutines.flow.Flow<java.util.List<androidx.appfunctions.metadata.AppFunctionMetadata>> observeAppFunctions(androidx.appfunctions.AppFunctionSearchSpec searchSpec);
     method @RequiresPermission(value="android.permission.EXECUTE_APP_FUNCTIONS", conditional=true) public suspend Object? setAppFunctionEnabled(String functionId, int newEnabledState, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     field public static final int APP_FUNCTION_STATE_DEFAULT = 0; // 0x0
     field public static final int APP_FUNCTION_STATE_DISABLED = 2; // 0x2
diff --git a/appfunctions/appfunctions-runtime/api/restricted_current.txt b/appfunctions/appfunctions-runtime/api/restricted_current.txt
index 5a9bd68..de190e7 100644
--- a/appfunctions/appfunctions-runtime/api/restricted_current.txt
+++ b/appfunctions/appfunctions-runtime/api/restricted_current.txt
@@ -28,7 +28,6 @@
     method @RequiresPermission(value="android.permission.EXECUTE_APP_FUNCTIONS", conditional=true) public suspend Object? isAppFunctionEnabled(String packageName, String functionId, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
     method public suspend Object? isAppFunctionEnabled(String functionId, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
     method public boolean isSupported();
-    method @RequiresPermission(value="android.permission.EXECUTE_APP_FUNCTIONS", conditional=true) public kotlinx.coroutines.flow.Flow<java.util.List<androidx.appfunctions.metadata.AppFunctionMetadata>> observeAppFunctions(androidx.appfunctions.AppFunctionSearchSpec searchSpec);
     method @RequiresPermission(value="android.permission.EXECUTE_APP_FUNCTIONS", conditional=true) public suspend Object? setAppFunctionEnabled(String functionId, int newEnabledState, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     field public static final int APP_FUNCTION_STATE_DEFAULT = 0; // 0x0
     field public static final int APP_FUNCTION_STATE_DISABLED = 2; // 0x2
diff --git a/appfunctions/appfunctions-runtime/dependencyAnalysis-baseline.json b/appfunctions/appfunctions-runtime/dependencyAnalysis-baseline.json
index 525c7b2..90741ef 100644
--- a/appfunctions/appfunctions-runtime/dependencyAnalysis-baseline.json
+++ b/appfunctions/appfunctions-runtime/dependencyAnalysis-baseline.json
@@ -70,6 +70,15 @@
     {
       "coordinates": {
         "type": "module",
+        "identifier": "org.jetbrains.kotlinx:kotlinx-coroutines-android",
+        "resolvedVersion": "1.7.3"
+      },
+      "fromConfiguration": "implementation",
+      "toConfiguration": "runtimeOnly"
+    },
+    {
+      "coordinates": {
+        "type": "module",
         "identifier": "org.jetbrains.kotlinx:kotlinx-coroutines-core",
         "resolvedVersion": "1.7.3"
       },
diff --git a/appfunctions/appfunctions-runtime/src/androidTest/java/androidx/appfunctions/AppFunctionManagerCompatTest.kt b/appfunctions/appfunctions-runtime/src/androidTest/java/androidx/appfunctions/AppFunctionManagerCompatTest.kt
index 2efd636..58ec448 100644
--- a/appfunctions/appfunctions-runtime/src/androidTest/java/androidx/appfunctions/AppFunctionManagerCompatTest.kt
+++ b/appfunctions/appfunctions-runtime/src/androidTest/java/androidx/appfunctions/AppFunctionManagerCompatTest.kt
@@ -23,12 +23,6 @@
 import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.flow.SharingStarted
-import kotlinx.coroutines.flow.first
-import kotlinx.coroutines.flow.shareIn
-import kotlinx.coroutines.flow.take
 import kotlinx.coroutines.runBlocking
 import org.junit.Assume.assumeTrue
 import org.junit.Before
@@ -242,306 +236,4 @@
         assertThat((response as ExecuteAppFunctionResponse.Error).error)
             .isInstanceOf(AppFunctionInvalidArgumentException::class.java)
     }
-
-    @Test
-    fun observeAppFunctions_emptyPackagesListInSearchSpec_noResults() =
-        runBlocking<Unit> {
-            val searchFunctionSpec = AppFunctionSearchSpec(packageNames = emptySet())
-
-            assertThat(appFunctionManagerCompat.observeAppFunctions(searchFunctionSpec).first())
-                .isEmpty()
-        }
-
-    @Test
-    fun observeAppFunctions_emptySchemaNameInSearchSpec_noResults() =
-        runBlocking<Unit> {
-            val searchFunctionSpec = AppFunctionSearchSpec(schemaName = "")
-
-            assertThat(appFunctionManagerCompat.observeAppFunctions(searchFunctionSpec).first())
-                .isEmpty()
-        }
-
-    @Test
-    fun observeAppFunctions_emptySchemaCategoryInSearchSpec_noResults() =
-        runBlocking<Unit> {
-            val searchFunctionSpec = AppFunctionSearchSpec(schemaCategory = "")
-
-            assertThat(appFunctionManagerCompat.observeAppFunctions(searchFunctionSpec).first())
-                .isEmpty()
-        }
-
-    @Test
-    fun observeAppFunctions_packageListNotSetInSpec_returnsAllAppFunctions() =
-        runBlocking<Unit> {
-            val searchFunctionSpec = AppFunctionSearchSpec()
-
-            val appFunctions =
-                appFunctionManagerCompat.observeAppFunctions(searchFunctionSpec).first()
-
-            // TODO: Populate other fields for legacy indexer.
-            assertThat(appFunctions.map { it.id })
-                .containsExactly(
-                    AppFunctionMetadataTestHelper.FunctionIds.NO_SCHEMA_ENABLED_BY_DEFAULT,
-                    AppFunctionMetadataTestHelper.FunctionIds.NO_SCHEMA_DISABLED_BY_DEFAULT,
-                    AppFunctionMetadataTestHelper.FunctionIds.MEDIA_SCHEMA_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionIds.MEDIA_SCHEMA2_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionIds.NOTES_SCHEMA_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionIds.NO_SCHEMA_EXECUTION_FAIL,
-                    AppFunctionMetadataTestHelper.FunctionIds.NO_SCHEMA_EXECUTION_SUCCEED,
-                )
-            // Only check for all fields when dynamic indexer is enabled.
-            assumeTrue(metadataTestHelper.isDynamicIndexerAvailable())
-            assertThat(appFunctions)
-                .containsExactly(
-                    AppFunctionMetadataTestHelper.FunctionMetadata.NO_SCHEMA_ENABLED_BY_DEFAULT,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.NO_SCHEMA_DISABLED_BY_DEFAULT,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.MEDIA_SCHEMA_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.MEDIA_SCHEMA2_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.NOTES_SCHEMA_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.NO_SCHEMA_EXECUTION_FAIL,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.NO_SCHEMA_EXECUTION_SUCCEED,
-                )
-        }
-
-    // TODO(b/397396289) - Test package filter with multiple app installs.
-    @Test
-    fun observeAppFunctions_packageListSetInSpec_returnsAppFunctionsInPackage() =
-        runBlocking<Unit> {
-            val searchFunctionSpec =
-                AppFunctionSearchSpec(packageNames = setOf(context.packageName))
-
-            val appFunctions =
-                appFunctionManagerCompat.observeAppFunctions(searchFunctionSpec).first()
-
-            // TODO: Populate other fields for legacy indexer.
-            assertThat(appFunctions.map { it.id })
-                .containsExactly(
-                    AppFunctionMetadataTestHelper.FunctionIds.NO_SCHEMA_ENABLED_BY_DEFAULT,
-                    AppFunctionMetadataTestHelper.FunctionIds.NO_SCHEMA_DISABLED_BY_DEFAULT,
-                    AppFunctionMetadataTestHelper.FunctionIds.MEDIA_SCHEMA_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionIds.MEDIA_SCHEMA2_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionIds.NOTES_SCHEMA_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionIds.NO_SCHEMA_EXECUTION_FAIL,
-                    AppFunctionMetadataTestHelper.FunctionIds.NO_SCHEMA_EXECUTION_SUCCEED,
-                )
-            // Only check for all fields when dynamic indexer is enabled.
-            assumeTrue(metadataTestHelper.isDynamicIndexerAvailable())
-            assertThat(appFunctions)
-                .containsExactly(
-                    AppFunctionMetadataTestHelper.FunctionMetadata.NO_SCHEMA_ENABLED_BY_DEFAULT,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.NO_SCHEMA_DISABLED_BY_DEFAULT,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.MEDIA_SCHEMA_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.MEDIA_SCHEMA2_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.NOTES_SCHEMA_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.NO_SCHEMA_EXECUTION_FAIL,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.NO_SCHEMA_EXECUTION_SUCCEED,
-                )
-        }
-
-    @Test
-    fun observeAppFunctions_schemaNameInSpec_returnsMatchingAppFunctions() =
-        runBlocking<Unit> {
-            val searchFunctionSpec = AppFunctionSearchSpec(schemaName = "print")
-
-            val appFunctions =
-                appFunctionManagerCompat.observeAppFunctions(searchFunctionSpec).first()
-
-            // TODO: Populate other fields for legacy indexer.
-            assertThat(appFunctions.map { it.id })
-                .containsExactly(
-                    AppFunctionMetadataTestHelper.FunctionIds.MEDIA_SCHEMA_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionIds.NOTES_SCHEMA_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionIds.MEDIA_SCHEMA2_PRINT
-                )
-            assertThat(appFunctions.map { it.schema })
-                .containsExactly(
-                    AppFunctionMetadataTestHelper.FunctionMetadata.MEDIA_SCHEMA_PRINT.schema,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.NOTES_SCHEMA_PRINT.schema,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.MEDIA_SCHEMA2_PRINT.schema,
-                )
-            // Only check for all fields when dynamic indexer is enabled.
-            assumeTrue(metadataTestHelper.isDynamicIndexerAvailable())
-            assertThat(appFunctions)
-                .containsExactly(
-                    AppFunctionMetadataTestHelper.FunctionMetadata.MEDIA_SCHEMA_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.NOTES_SCHEMA_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.MEDIA_SCHEMA2_PRINT,
-                )
-        }
-
-    @Test
-    fun observeAppFunctions_schemaCategoryInSpec_returnsMatchingAppFunctions() =
-        runBlocking<Unit> {
-            val searchFunctionSpec = AppFunctionSearchSpec(schemaCategory = "media")
-
-            val appFunctions =
-                appFunctionManagerCompat.observeAppFunctions(searchFunctionSpec).first()
-
-            // TODO: Populate other fields for legacy indexer.
-            assertThat(appFunctions.map { it.id })
-                .containsExactly(
-                    AppFunctionMetadataTestHelper.FunctionIds.MEDIA_SCHEMA_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionIds.MEDIA_SCHEMA2_PRINT
-                )
-            assertThat(appFunctions.map { it.schema })
-                .containsExactly(
-                    AppFunctionMetadataTestHelper.FunctionMetadata.MEDIA_SCHEMA_PRINT.schema,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.MEDIA_SCHEMA2_PRINT.schema,
-                )
-            // Only check for all fields when dynamic indexer is enabled.
-            assumeTrue(metadataTestHelper.isDynamicIndexerAvailable())
-            assertThat(appFunctions)
-                .containsExactly(
-                    AppFunctionMetadataTestHelper.FunctionMetadata.MEDIA_SCHEMA_PRINT,
-                    AppFunctionMetadataTestHelper.FunctionMetadata.MEDIA_SCHEMA2_PRINT
-                )
-        }
-
-    @Test
-    fun observeAppFunctions_minSchemaVersionInSpec_returnsAppFunctionsWithSchemaVersionGreaterThanMin() =
-        runBlocking<Unit> {
-            val searchFunctionSpec = AppFunctionSearchSpec(minSchemaVersion = 2)
-
-            val appFunctions =
-                appFunctionManagerCompat.observeAppFunctions(searchFunctionSpec).first()
-
-            // TODO: Populate other fields for legacy indexer.
-            assertThat(appFunctions.map { it.id })
-                .containsExactly(AppFunctionMetadataTestHelper.FunctionIds.MEDIA_SCHEMA2_PRINT)
-            assertThat(appFunctions.map { it.schema })
-                .containsExactly(
-                    AppFunctionMetadataTestHelper.FunctionMetadata.MEDIA_SCHEMA2_PRINT.schema
-                )
-            // Only check for all fields when dynamic indexer is enabled.
-            assumeTrue(metadataTestHelper.isDynamicIndexerAvailable())
-            assertThat(appFunctions)
-                .containsExactly(AppFunctionMetadataTestHelper.FunctionMetadata.MEDIA_SCHEMA2_PRINT)
-        }
-
-    @Test
-    fun observeAppFunctions_isDisabledInRuntime_returnsIsEnabledFalse() =
-        runBlocking<Unit> {
-            val functionIdToTest =
-                AppFunctionMetadataTestHelper.FunctionIds.NO_SCHEMA_ENABLED_BY_DEFAULT
-            val searchFunctionSpec = AppFunctionSearchSpec()
-            appFunctionManagerCompat.setAppFunctionEnabled(
-                functionIdToTest,
-                AppFunctionManagerCompat.APP_FUNCTION_STATE_DISABLED
-            )
-
-            val appFunctionMetadata =
-                appFunctionManagerCompat.observeAppFunctions(searchFunctionSpec).first().single {
-                    it.id == functionIdToTest
-                }
-
-            assertThat(appFunctionMetadata.isEnabled).isFalse()
-        }
-
-    @Test
-    fun observeAppFunctions_isEnabledInRuntime_returnsIsEnabledTrue() =
-        runBlocking<Unit> {
-            val functionIdToTest =
-                AppFunctionMetadataTestHelper.FunctionIds.NO_SCHEMA_DISABLED_BY_DEFAULT
-            val searchFunctionSpec = AppFunctionSearchSpec()
-            appFunctionManagerCompat.setAppFunctionEnabled(
-                functionIdToTest,
-                AppFunctionManagerCompat.APP_FUNCTION_STATE_ENABLED
-            )
-
-            val appFunctionMetadata =
-                appFunctionManagerCompat.observeAppFunctions(searchFunctionSpec).first().single {
-                    it.id == functionIdToTest
-                }
-
-            assertThat(appFunctionMetadata.isEnabled).isTrue()
-        }
-
-    // TODO(b/397396289): Add test to check we don't trigger updates for unrelated changes.
-    @Test
-    fun observeAppFunctions_observeDocumentChanges_returnsListWithUpdatedValue() =
-        runBlocking<Unit> {
-            val functionIdToTest =
-                AppFunctionMetadataTestHelper.FunctionIds.NO_SCHEMA_ENABLED_BY_DEFAULT
-            val searchFunctionSpec =
-                AppFunctionSearchSpec(packageNames = setOf(context.packageName))
-            val appFunctionSearchFlow =
-                appFunctionManagerCompat.observeAppFunctions(searchFunctionSpec)
-            val emittedValues =
-                appFunctionSearchFlow.shareIn(
-                    scope = CoroutineScope(Dispatchers.Default),
-                    started = SharingStarted.Eagerly,
-                    replay = 10,
-                )
-            emittedValues.first() // Allow emitting initial value and registering callback.
-
-            // Modify the runtime document.
-            appFunctionManagerCompat.setAppFunctionEnabled(
-                functionIdToTest,
-                AppFunctionManagerCompat.APP_FUNCTION_STATE_DISABLED
-            )
-
-            // Collect in a separate scope to avoid deadlock within the testcase.
-            runBlocking(Dispatchers.Default) { emittedValues.take(2).collect {} }
-            assertThat(emittedValues.replayCache).hasSize(2)
-            // Assert first result to be default value.
-            assertThat(
-                    emittedValues.replayCache[0]
-                        .single {
-                            it.id ==
-                                AppFunctionMetadataTestHelper.FunctionIds
-                                    .NO_SCHEMA_ENABLED_BY_DEFAULT
-                        }
-                        .isEnabled
-                )
-                .isEqualTo(
-                    AppFunctionMetadataTestHelper.FunctionMetadata.NO_SCHEMA_ENABLED_BY_DEFAULT
-                        .isEnabled
-                )
-            // Assert next update has updated value.
-            assertThat(
-                    emittedValues.replayCache[1]
-                        .single {
-                            it.id ==
-                                AppFunctionMetadataTestHelper.FunctionIds
-                                    .NO_SCHEMA_ENABLED_BY_DEFAULT
-                        }
-                        .isEnabled
-                )
-                .isFalse()
-        }
-
-    @Test
-    fun observeAppFunctions_multipleUpdates_returnsUpdatesAfterDebouncing() =
-        runBlocking<Unit> {
-            val functionIdToTest =
-                AppFunctionMetadataTestHelper.FunctionIds.NO_SCHEMA_ENABLED_BY_DEFAULT
-            val searchFunctionSpec =
-                AppFunctionSearchSpec(packageNames = setOf(context.packageName))
-            val appFunctionSearchFlow =
-                appFunctionManagerCompat.observeAppFunctions(searchFunctionSpec)
-            val emittedValues =
-                appFunctionSearchFlow.shareIn(
-                    scope = CoroutineScope(Dispatchers.Default),
-                    started = SharingStarted.Eagerly,
-                    replay = 10,
-                )
-            emittedValues.first() // Allow emitting initial value and registering callback.
-
-            // Modify the runtime document twice.
-            appFunctionManagerCompat.setAppFunctionEnabled(
-                functionIdToTest,
-                AppFunctionManagerCompat.APP_FUNCTION_STATE_DISABLED
-            )
-            appFunctionManagerCompat.setAppFunctionEnabled(
-                functionIdToTest,
-                AppFunctionManagerCompat.APP_FUNCTION_STATE_ENABLED
-            )
-
-            // Collect in a separate scope to avoid deadlock within the testcase.
-            runBlocking(Dispatchers.Default) { emittedValues.take(2).collect {} }
-            // Only 2 updates are emitted.
-            assertThat(emittedValues.replayCache).hasSize(2)
-            assertThat(emittedValues.replayCache[1].single { it.id == functionIdToTest }.isEnabled)
-                .isTrue()
-        }
 }
diff --git a/appfunctions/appfunctions-runtime/src/androidTest/java/androidx/appfunctions/core/AppFunctionMetadataTestHelper.kt b/appfunctions/appfunctions-runtime/src/androidTest/java/androidx/appfunctions/core/AppFunctionMetadataTestHelper.kt
index bd1caac..041f246 100644
--- a/appfunctions/appfunctions-runtime/src/androidTest/java/androidx/appfunctions/core/AppFunctionMetadataTestHelper.kt
+++ b/appfunctions/appfunctions-runtime/src/androidTest/java/androidx/appfunctions/core/AppFunctionMetadataTestHelper.kt
@@ -19,14 +19,8 @@
 import android.content.Context
 import android.os.Build
 import androidx.`annotation`.RequiresApi
-import androidx.appfunctions.core.AppFunctionMetadataTestHelper.FunctionIds.NOTES_SCHEMA_PRINT
 import androidx.appfunctions.`internal`.readAll
-import androidx.appfunctions.metadata.AppFunctionComponentsMetadata
-import androidx.appfunctions.metadata.AppFunctionMetadata
 import androidx.appfunctions.metadata.AppFunctionMetadataDocument
-import androidx.appfunctions.metadata.AppFunctionPrimitiveTypeMetadata
-import androidx.appfunctions.metadata.AppFunctionResponseMetadata
-import androidx.appfunctions.metadata.AppFunctionSchemaMetadata
 import androidx.appsearch.app.Features
 import androidx.appsearch.app.GlobalSearchSession
 import androidx.appsearch.app.SearchSpec
@@ -134,134 +128,6 @@
         const val MEDIA_SCHEMA2_PRINT = "androidx.appfunctions.test#mediaSchema2_print"
     }
 
-    object FunctionMetadata {
-        val NO_SCHEMA_EXECUTION_SUCCEED =
-            AppFunctionMetadata(
-                id = FunctionIds.NO_SCHEMA_EXECUTION_SUCCEED,
-                packageName = "androidx.appfunctions.runtime.test",
-                isEnabled = true,
-                schema = null,
-                parameters = emptyList(),
-                response =
-                    AppFunctionResponseMetadata(
-                        valueType =
-                            AppFunctionPrimitiveTypeMetadata(
-                                type = AppFunctionPrimitiveTypeMetadata.TYPE_STRING,
-                                isNullable = false
-                            )
-                    ),
-                components = AppFunctionComponentsMetadata()
-            )
-
-        val NO_SCHEMA_ENABLED_BY_DEFAULT =
-            AppFunctionMetadata(
-                id = FunctionIds.NO_SCHEMA_ENABLED_BY_DEFAULT,
-                packageName = "androidx.appfunctions.runtime.test",
-                isEnabled = true,
-                schema = null,
-                parameters = emptyList(),
-                response =
-                    AppFunctionResponseMetadata(
-                        valueType =
-                            AppFunctionPrimitiveTypeMetadata(
-                                type = AppFunctionPrimitiveTypeMetadata.TYPE_UNIT,
-                                isNullable = false
-                            )
-                    ),
-                components = AppFunctionComponentsMetadata()
-            )
-
-        val NO_SCHEMA_DISABLED_BY_DEFAULT =
-            AppFunctionMetadata(
-                id = FunctionIds.NO_SCHEMA_DISABLED_BY_DEFAULT,
-                packageName = "androidx.appfunctions.runtime.test",
-                isEnabled = false,
-                schema = null,
-                parameters = emptyList(),
-                response =
-                    AppFunctionResponseMetadata(
-                        valueType =
-                            AppFunctionPrimitiveTypeMetadata(
-                                type = AppFunctionPrimitiveTypeMetadata.TYPE_UNIT,
-                                isNullable = false
-                            )
-                    ),
-                components = AppFunctionComponentsMetadata()
-            )
-
-        val MEDIA_SCHEMA2_PRINT =
-            AppFunctionMetadata(
-                id = FunctionIds.MEDIA_SCHEMA2_PRINT,
-                packageName = "androidx.appfunctions.runtime.test",
-                isEnabled = true,
-                schema = AppFunctionSchemaMetadata(category = "media", name = "print", version = 2),
-                parameters = emptyList(),
-                response =
-                    AppFunctionResponseMetadata(
-                        valueType =
-                            AppFunctionPrimitiveTypeMetadata(
-                                type = AppFunctionPrimitiveTypeMetadata.TYPE_UNIT,
-                                isNullable = false
-                            )
-                    ),
-                components = AppFunctionComponentsMetadata()
-            )
-
-        val MEDIA_SCHEMA_PRINT =
-            AppFunctionMetadata(
-                id = FunctionIds.MEDIA_SCHEMA_PRINT,
-                packageName = "androidx.appfunctions.runtime.test",
-                isEnabled = true,
-                schema = AppFunctionSchemaMetadata(category = "media", name = "print", version = 1),
-                parameters = emptyList(),
-                response =
-                    AppFunctionResponseMetadata(
-                        valueType =
-                            AppFunctionPrimitiveTypeMetadata(
-                                type = AppFunctionPrimitiveTypeMetadata.TYPE_UNIT,
-                                isNullable = false
-                            )
-                    ),
-                components = AppFunctionComponentsMetadata()
-            )
-
-        val NOTES_SCHEMA_PRINT =
-            AppFunctionMetadata(
-                id = FunctionIds.NOTES_SCHEMA_PRINT,
-                packageName = "androidx.appfunctions.runtime.test",
-                isEnabled = true,
-                schema = AppFunctionSchemaMetadata(category = "notes", name = "print", version = 1),
-                parameters = emptyList(),
-                response =
-                    AppFunctionResponseMetadata(
-                        valueType =
-                            AppFunctionPrimitiveTypeMetadata(
-                                type = AppFunctionPrimitiveTypeMetadata.TYPE_UNIT,
-                                isNullable = false
-                            )
-                    ),
-                components = AppFunctionComponentsMetadata()
-            )
-
-        val NO_SCHEMA_EXECUTION_FAIL =
-            AppFunctionMetadata(
-                id = FunctionIds.NO_SCHEMA_EXECUTION_FAIL,
-                packageName = "androidx.appfunctions.runtime.test",
-                isEnabled = true,
-                schema = null,
-                parameters = emptyList(),
-                response =
-                    AppFunctionResponseMetadata(
-                        valueType =
-                            AppFunctionPrimitiveTypeMetadata(
-                                type = AppFunctionPrimitiveTypeMetadata.TYPE_UNIT,
-                                isNullable = false
-                            )
-                    ),
-                components = AppFunctionComponentsMetadata()
-            )
-    }
-
     companion object {
         private const val RETRY_LIMIT = 5
         private const val RETRY_DELAY_MS = 500L
diff --git a/appfunctions/appfunctions-runtime/src/androidTest/java/androidx/appfunctions/internal/AppSearchAppFunctionReaderTest.kt b/appfunctions/appfunctions-runtime/src/androidTest/java/androidx/appfunctions/internal/AppSearchAppFunctionReaderTest.kt
new file mode 100644
index 0000000..d9a6297
--- /dev/null
+++ b/appfunctions/appfunctions-runtime/src/androidTest/java/androidx/appfunctions/internal/AppSearchAppFunctionReaderTest.kt
@@ -0,0 +1,490 @@
+/*
+ * Copyright 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.appfunctions.internal
+
+import android.os.Build
+import androidx.appfunctions.AppFunctionFunctionNotFoundException
+import androidx.appfunctions.AppFunctionManagerCompat
+import androidx.appfunctions.AppFunctionSearchSpec
+import androidx.appfunctions.core.AppFunctionMetadataTestHelper
+import androidx.appfunctions.core.AppFunctionMetadataTestHelper.FunctionIds
+import androidx.appfunctions.metadata.AppFunctionComponentsMetadata
+import androidx.appfunctions.metadata.AppFunctionMetadata
+import androidx.appfunctions.metadata.AppFunctionPrimitiveTypeMetadata
+import androidx.appfunctions.metadata.AppFunctionResponseMetadata
+import androidx.appfunctions.metadata.AppFunctionSchemaMetadata
+import androidx.test.filters.SdkSuppress
+import androidx.test.platform.app.InstrumentationRegistry
+import com.google.common.truth.Truth.assertThat
+import com.google.testing.junit.testparameterinjector.TestParameter
+import com.google.testing.junit.testparameterinjector.TestParameterInjector
+import kotlin.test.assertFailsWith
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.flow.single
+import kotlinx.coroutines.flow.take
+import kotlinx.coroutines.flow.toList
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import org.junit.Assume.assumeTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
+@RunWith(TestParameterInjector::class)
+class AppSearchAppFunctionReaderTest {
+    private val context = InstrumentationRegistry.getInstrumentation().targetContext
+    private val appFunctionReader = AppSearchAppFunctionReader(context)
+    private val appFunctionMetadataTestHelper = AppFunctionMetadataTestHelper(context)
+    private val appFunctionManagerCompat = AppFunctionManagerCompat(context)
+
+    @Before
+    fun setup() =
+        runBlocking<Unit> {
+            assumeTrue(appFunctionMetadataTestHelper.isLegacyAppFunctionIndexerAvailable())
+            appFunctionMetadataTestHelper.awaitAppFunctionIndexed(
+                setOf(FunctionIds.NO_SCHEMA_EXECUTION_SUCCEED)
+            )
+
+            // Reset enabled state for all test ids
+            for (functionIds in getTestFunctionIdToMetadataMap(context.packageName).keys) {
+                appFunctionManagerCompat.setAppFunctionEnabled(
+                    functionIds,
+                    AppFunctionManagerCompat.APP_FUNCTION_STATE_DEFAULT
+                )
+            }
+        }
+
+    @Test
+    fun searchAppFunctions_emptyPackagesListInSearchSpec_noResults() =
+        runBlocking<Unit> {
+            val searchFunctionSpec = AppFunctionSearchSpec(packageNames = emptySet())
+
+            assertThat(appFunctionReader.searchAppFunctions(searchFunctionSpec).first()).isEmpty()
+        }
+
+    @Test
+    fun searchAppFunctions_emptySchemaNameInSearchSpec_noResults() =
+        runBlocking<Unit> {
+            val searchFunctionSpec = AppFunctionSearchSpec(schemaName = "")
+
+            assertThat(appFunctionReader.searchAppFunctions(searchFunctionSpec).first()).isEmpty()
+        }
+
+    @Test
+    fun searchAppFunctions_emptySchemaCategoryInSearchSpec_noResults() =
+        runBlocking<Unit> {
+            val searchFunctionSpec = AppFunctionSearchSpec(schemaCategory = "")
+
+            assertThat(appFunctionReader.searchAppFunctions(searchFunctionSpec).first()).isEmpty()
+        }
+
+    @Test
+    fun searchAppFunctions_packageListNotSetInSpec_returnsAllAppFunctions() =
+        runBlocking<Unit> {
+            val searchFunctionSpec = AppFunctionSearchSpec()
+
+            val appFunctions = appFunctionReader.searchAppFunctions(searchFunctionSpec).first()
+
+            // TODO: Populate other fields for legacy indexer.
+            val expectedMetadata = getTestFunctionIdToMetadataMap(context.packageName)
+            assertThat(appFunctions.map { it.id }).containsExactlyElementsIn(expectedMetadata.keys)
+            // Only check for all fields when dynamic indexer is enabled.
+            assumeTrue(appFunctionMetadataTestHelper.isDynamicIndexerAvailable())
+            assertThat(appFunctions)
+                .containsExactlyElementsIn(
+                    getTestFunctionIdToMetadataMap(context.packageName).values
+                )
+        }
+
+    @Test
+    fun searchAppFunctions_packageListSetInSpec_returnsAppFunctionsInPackage() =
+        runBlocking<Unit> {
+            val searchFunctionSpec =
+                AppFunctionSearchSpec(packageNames = setOf(context.packageName))
+
+            val appFunctions = appFunctionReader.searchAppFunctions(searchFunctionSpec).first()
+
+            // TODO: Populate other fields for legacy indexer.
+            val expectedMetadata = getTestFunctionIdToMetadataMap(context.packageName)
+            assertThat(appFunctions.map { it.id }).containsExactlyElementsIn(expectedMetadata.keys)
+            // Only check for all fields when dynamic indexer is enabled.
+            assumeTrue(appFunctionMetadataTestHelper.isDynamicIndexerAvailable())
+            assertThat(appFunctions)
+                .containsExactlyElementsIn(
+                    getTestFunctionIdToMetadataMap(context.packageName).values
+                )
+        }
+
+    @Test
+    fun searchAppFunctions_schemaNameInSpec_returnsMatchingAppFunctions() =
+        runBlocking<Unit> {
+            val searchFunctionSpec = AppFunctionSearchSpec(schemaName = "print")
+
+            val appFunctions = appFunctionReader.searchAppFunctions(searchFunctionSpec).first()
+
+            val expectedFunctionIds =
+                setOf(
+                    FunctionIds.MEDIA_SCHEMA_PRINT,
+                    FunctionIds.NOTES_SCHEMA_PRINT,
+                    FunctionIds.MEDIA_SCHEMA2_PRINT
+                )
+            val expectedMetadata =
+                getTestFunctionIdToMetadataMap(context.packageName)
+                    .filterKeys { it in expectedFunctionIds }
+                    .values
+            // TODO: Populate other fields for legacy indexer.
+            assertThat(appFunctions.map { it.id }).containsExactlyElementsIn(expectedFunctionIds)
+            assertThat(appFunctions.map { it.schema })
+                .containsExactlyElementsIn(expectedMetadata.map { it.schema })
+            // Only check for all fields when dynamic indexer is enabled.
+            assumeTrue(appFunctionMetadataTestHelper.isDynamicIndexerAvailable())
+            assertThat(appFunctions).containsExactlyElementsIn(expectedMetadata)
+        }
+
+    @Test
+    fun searchAppFunctions_schemaCategoryInSpec_returnsMatchingAppFunctions() =
+        runBlocking<Unit> {
+            val searchFunctionSpec = AppFunctionSearchSpec(schemaCategory = "media")
+
+            val appFunctions = appFunctionReader.searchAppFunctions(searchFunctionSpec).first()
+
+            val expectedFunctionIds =
+                setOf(FunctionIds.MEDIA_SCHEMA_PRINT, FunctionIds.MEDIA_SCHEMA2_PRINT)
+            val expectedMetadata =
+                getTestFunctionIdToMetadataMap(context.packageName)
+                    .filterKeys { it in expectedFunctionIds }
+                    .values
+            // TODO: Populate other fields for legacy indexer.
+            assertThat(appFunctions.map { it.id }).containsExactlyElementsIn(expectedFunctionIds)
+            assertThat(appFunctions.map { it.schema })
+                .containsExactlyElementsIn(expectedMetadata.map { it.schema })
+            // Only check for all fields when dynamic indexer is enabled.
+            assumeTrue(appFunctionMetadataTestHelper.isDynamicIndexerAvailable())
+            assertThat(appFunctions).containsExactlyElementsIn(expectedMetadata)
+        }
+
+    @Test
+    fun searchAppFunctions_minSchemaVersionInSpec_returnsAppFunctionsWithSchemaVersionGreaterThanMin() =
+        runBlocking<Unit> {
+            val searchFunctionSpec = AppFunctionSearchSpec(minSchemaVersion = 2)
+
+            val appFunctions = appFunctionReader.searchAppFunctions(searchFunctionSpec).first()
+
+            val expectedFunctionIds = setOf(FunctionIds.MEDIA_SCHEMA2_PRINT)
+            val expectedMetadata =
+                getTestFunctionIdToMetadataMap(context.packageName)
+                    .filterKeys { it in expectedFunctionIds }
+                    .values
+            // TODO: Populate other fields for legacy indexer.
+            assertThat(appFunctions.map { it.id }).containsExactlyElementsIn(expectedFunctionIds)
+            assertThat(appFunctions.map { it.schema })
+                .containsExactlyElementsIn(expectedMetadata.map { it.schema })
+            // Only check for all fields when dynamic indexer is enabled.
+            assumeTrue(appFunctionMetadataTestHelper.isDynamicIndexerAvailable())
+            assertThat(appFunctions).containsExactlyElementsIn(expectedMetadata)
+        }
+
+    @Test
+    fun searchAppFunctions_isDisabledInRuntime_returnsIsEnabledFalse() =
+        runBlocking<Unit> {
+            val functionIdToTest = FunctionIds.NO_SCHEMA_ENABLED_BY_DEFAULT
+            val searchFunctionSpec = AppFunctionSearchSpec()
+            appFunctionManagerCompat.setAppFunctionEnabled(
+                functionIdToTest,
+                AppFunctionManagerCompat.APP_FUNCTION_STATE_DISABLED
+            )
+
+            val appFunctionMetadata =
+                appFunctionReader.searchAppFunctions(searchFunctionSpec).first().single {
+                    it.id == functionIdToTest
+                }
+
+            assertThat(appFunctionMetadata.isEnabled).isFalse()
+        }
+
+    @Test
+    fun searchAppFunctions_isEnabledInRuntime_returnsIsEnabledTrue() =
+        runBlocking<Unit> {
+            val functionIdToTest = FunctionIds.NO_SCHEMA_DISABLED_BY_DEFAULT
+            val searchFunctionSpec = AppFunctionSearchSpec()
+            appFunctionManagerCompat.setAppFunctionEnabled(
+                functionIdToTest,
+                AppFunctionManagerCompat.APP_FUNCTION_STATE_ENABLED
+            )
+
+            val appFunctionMetadata =
+                appFunctionReader.searchAppFunctions(searchFunctionSpec).first().single {
+                    it.id == functionIdToTest
+                }
+
+            assertThat(appFunctionMetadata.isEnabled).isTrue()
+        }
+
+    @Test
+    fun searchAppFunctions_isEnabledSetByDefault_returnsIsEnabledDefaultValue(
+        @TestParameter(
+            FunctionIds.NO_SCHEMA_DISABLED_BY_DEFAULT,
+            FunctionIds.NO_SCHEMA_ENABLED_BY_DEFAULT
+        )
+        functionIdToTest: String
+    ) =
+        runBlocking<Unit> {
+            val searchFunctionSpec = AppFunctionSearchSpec()
+
+            val appFunctionMetadata =
+                appFunctionReader.searchAppFunctions(searchFunctionSpec).first().single {
+                    it.id == functionIdToTest
+                }
+
+            val expectedMetadataWithIsEnabledDefault =
+                getTestFunctionIdToMetadataMap(context.packageName).getValue(functionIdToTest)
+            assertThat(appFunctionMetadata.isEnabled)
+                .isEqualTo(expectedMetadataWithIsEnabledDefault.isEnabled)
+        }
+
+    @Test
+    fun getAppFunctionSchemaMetadata_found() = runBlocking {
+        val appFunctionSchemaMetadata =
+            appFunctionReader.getAppFunctionSchemaMetadata(
+                FunctionIds.MEDIA_SCHEMA_PRINT,
+                context.packageName
+            )
+
+        val expected = AppFunctionSchemaMetadata("media", "print", 1)
+        assertThat(appFunctionSchemaMetadata).isEqualTo(expected)
+    }
+
+    @Test
+    fun getAppFunctionSchemaMetadata_freeform() = runBlocking {
+        val appFunctionSchemaMetadata =
+            appFunctionReader.getAppFunctionSchemaMetadata(
+                FunctionIds.NO_SCHEMA_EXECUTION_SUCCEED,
+                context.packageName
+            )
+
+        assertThat(appFunctionSchemaMetadata).isNull()
+    }
+
+    @Test
+    fun getAppFunctionSchemaMetadata_notFound() =
+        runBlocking<Unit> {
+            assertFailsWith<AppFunctionFunctionNotFoundException> {
+                appFunctionReader.getAppFunctionSchemaMetadata("notExist", context.packageName)
+            }
+        }
+
+    // TODO: Add test to check we don't trigger updates for unrelated changes.
+    @Test
+    fun searchAppFunctions_observeDocumentChanges_returnsListWithUpdatedValue() =
+        runBlocking<Unit> {
+            val functionIdToTest = FunctionIds.NO_SCHEMA_ENABLED_BY_DEFAULT
+            val searchFunctionSpec =
+                AppFunctionSearchSpec(packageNames = setOf(context.packageName))
+            val appFunctionSearchFlow = appFunctionReader.searchAppFunctions(searchFunctionSpec)
+            val emittedValues = mutableListOf<List<AppFunctionMetadata>>()
+            val job = launch { appFunctionSearchFlow.take(2).toList(emittedValues) }
+            delay(2000) // Allow emitting initial value and registering callback.
+
+            // Modify the runtime document.
+            appFunctionManagerCompat.setAppFunctionEnabled(
+                functionIdToTest,
+                AppFunctionManagerCompat.APP_FUNCTION_STATE_DISABLED
+            )
+
+            job.join()
+            assertThat(emittedValues).hasSize(2)
+            // Assert first result to be default value.
+            assertThat(emittedValues[0].single { it.id == functionIdToTest }.isEnabled)
+                .isEqualTo(
+                    getTestFunctionIdToMetadataMap(context.packageName)
+                        .getValue(functionIdToTest)
+                        .isEnabled
+                )
+            // Assert next update has updated value.
+            assertThat(emittedValues[1].single { it.id == functionIdToTest }.isEnabled).isFalse()
+        }
+
+    @Test
+    fun searchAppFunctions_multipleUpdates_returnsUpdatesAfterDebouncing() =
+        runBlocking<Unit> {
+            val functionIdToTest = FunctionIds.NO_SCHEMA_ENABLED_BY_DEFAULT
+            val searchFunctionSpec =
+                AppFunctionSearchSpec(packageNames = setOf(context.packageName))
+            val appFunctionSearchFlow = appFunctionReader.searchAppFunctions(searchFunctionSpec)
+            val emittedValues = mutableListOf<List<AppFunctionMetadata>>()
+            val job = launch { appFunctionSearchFlow.toList(emittedValues) }
+            delay(2000) // Allow emitting initial value and registering callback.
+
+            // Modify the runtime document twice.
+            appFunctionManagerCompat.setAppFunctionEnabled(
+                functionIdToTest,
+                AppFunctionManagerCompat.APP_FUNCTION_STATE_DISABLED
+            )
+            appFunctionManagerCompat.setAppFunctionEnabled(
+                functionIdToTest,
+                AppFunctionManagerCompat.APP_FUNCTION_STATE_ENABLED
+            )
+            delay(2000)
+
+            job.cancel()
+            // Only 2 updates are emitted.
+            assertThat(emittedValues).hasSize(2)
+            assertThat(emittedValues[1].single { it.id == functionIdToTest }.isEnabled).isTrue()
+        }
+
+    private companion object {
+        fun getTestFunctionIdToMetadataMap(packageName: String) =
+            mapOf(
+                FunctionIds.NO_SCHEMA_EXECUTION_SUCCEED to
+                    AppFunctionMetadata(
+                        id = FunctionIds.NO_SCHEMA_EXECUTION_SUCCEED,
+                        packageName = packageName,
+                        isEnabled = true,
+                        schema = null,
+                        parameters = emptyList(),
+                        response =
+                            AppFunctionResponseMetadata(
+                                valueType =
+                                    AppFunctionPrimitiveTypeMetadata(
+                                        type = AppFunctionPrimitiveTypeMetadata.TYPE_STRING,
+                                        isNullable = false
+                                    )
+                            ),
+                        components = AppFunctionComponentsMetadata()
+                    ),
+                FunctionIds.NO_SCHEMA_ENABLED_BY_DEFAULT to
+                    AppFunctionMetadata(
+                        id = FunctionIds.NO_SCHEMA_ENABLED_BY_DEFAULT,
+                        packageName = packageName,
+                        isEnabled = true,
+                        schema = null,
+                        parameters = emptyList(),
+                        response =
+                            AppFunctionResponseMetadata(
+                                valueType =
+                                    AppFunctionPrimitiveTypeMetadata(
+                                        type = AppFunctionPrimitiveTypeMetadata.TYPE_UNIT,
+                                        isNullable = false
+                                    )
+                            ),
+                        components = AppFunctionComponentsMetadata()
+                    ),
+                FunctionIds.NO_SCHEMA_DISABLED_BY_DEFAULT to
+                    AppFunctionMetadata(
+                        id = FunctionIds.NO_SCHEMA_DISABLED_BY_DEFAULT,
+                        packageName = packageName,
+                        isEnabled = false,
+                        schema = null,
+                        parameters = emptyList(),
+                        response =
+                            AppFunctionResponseMetadata(
+                                valueType =
+                                    AppFunctionPrimitiveTypeMetadata(
+                                        type = AppFunctionPrimitiveTypeMetadata.TYPE_UNIT,
+                                        isNullable = false
+                                    )
+                            ),
+                        components = AppFunctionComponentsMetadata()
+                    ),
+                FunctionIds.NO_SCHEMA_EXECUTION_FAIL to
+                    AppFunctionMetadata(
+                        id = FunctionIds.NO_SCHEMA_EXECUTION_FAIL,
+                        packageName = packageName,
+                        isEnabled = true,
+                        schema = null,
+                        parameters = emptyList(),
+                        response =
+                            AppFunctionResponseMetadata(
+                                valueType =
+                                    AppFunctionPrimitiveTypeMetadata(
+                                        type = AppFunctionPrimitiveTypeMetadata.TYPE_UNIT,
+                                        isNullable = false
+                                    )
+                            ),
+                        components = AppFunctionComponentsMetadata()
+                    ),
+                FunctionIds.NOTES_SCHEMA_PRINT to
+                    AppFunctionMetadata(
+                        id = FunctionIds.NOTES_SCHEMA_PRINT,
+                        packageName = packageName,
+                        isEnabled = true,
+                        schema =
+                            AppFunctionSchemaMetadata(
+                                category = "notes",
+                                name = "print",
+                                version = 1
+                            ),
+                        parameters = emptyList(),
+                        response =
+                            AppFunctionResponseMetadata(
+                                valueType =
+                                    AppFunctionPrimitiveTypeMetadata(
+                                        type = AppFunctionPrimitiveTypeMetadata.TYPE_UNIT,
+                                        isNullable = false
+                                    )
+                            ),
+                        components = AppFunctionComponentsMetadata()
+                    ),
+                FunctionIds.MEDIA_SCHEMA_PRINT to
+                    AppFunctionMetadata(
+                        id = FunctionIds.MEDIA_SCHEMA_PRINT,
+                        packageName = packageName,
+                        isEnabled = true,
+                        schema =
+                            AppFunctionSchemaMetadata(
+                                category = "media",
+                                name = "print",
+                                version = 1
+                            ),
+                        parameters = emptyList(),
+                        response =
+                            AppFunctionResponseMetadata(
+                                valueType =
+                                    AppFunctionPrimitiveTypeMetadata(
+                                        type = AppFunctionPrimitiveTypeMetadata.TYPE_UNIT,
+                                        isNullable = false
+                                    )
+                            ),
+                        components = AppFunctionComponentsMetadata()
+                    ),
+                FunctionIds.MEDIA_SCHEMA2_PRINT to
+                    AppFunctionMetadata(
+                        id = FunctionIds.MEDIA_SCHEMA2_PRINT,
+                        packageName = packageName,
+                        isEnabled = true,
+                        schema =
+                            AppFunctionSchemaMetadata(
+                                category = "media",
+                                name = "print",
+                                version = 2
+                            ),
+                        parameters = emptyList(),
+                        response =
+                            AppFunctionResponseMetadata(
+                                valueType =
+                                    AppFunctionPrimitiveTypeMetadata(
+                                        type = AppFunctionPrimitiveTypeMetadata.TYPE_UNIT,
+                                        isNullable = false
+                                    )
+                            ),
+                        components = AppFunctionComponentsMetadata()
+                    ),
+            )
+    }
+}
diff --git a/appfunctions/appfunctions-runtime/src/main/java/androidx/appfunctions/AppFunctionManagerCompat.kt b/appfunctions/appfunctions-runtime/src/main/java/androidx/appfunctions/AppFunctionManagerCompat.kt
index 71ce3b0..9cbfe8a 100644
--- a/appfunctions/appfunctions-runtime/src/main/java/androidx/appfunctions/AppFunctionManagerCompat.kt
+++ b/appfunctions/appfunctions-runtime/src/main/java/androidx/appfunctions/AppFunctionManagerCompat.kt
@@ -27,10 +27,8 @@
 import androidx.appfunctions.internal.ExtensionAppFunctionManagerApi
 import androidx.appfunctions.internal.TranslatorSelector
 import androidx.appfunctions.internal.TranslatorSelectorImpl
-import androidx.appfunctions.metadata.AppFunctionMetadata
 import androidx.appfunctions.metadata.AppFunctionSchemaMetadata
 import com.android.extensions.appfunctions.AppFunctionManager
-import kotlinx.coroutines.flow.Flow
 
 /**
  * Provides access to interact with App Functions. This is a backward-compatible wrapper for the
@@ -183,32 +181,6 @@
         }
     }
 
-    /**
-     * Observes for available app functions metadata based on the provided filters.
-     *
-     * Allows discovering app functions that match the given [searchSpec] criteria and continuously
-     * emits updates when relevant metadata changes.
-     *
-     * Updates to [AppFunctionMetadata] can occur when the app defining the function is updated or
-     * when a function's enabled state changes.
-     *
-     * If multiple updates happen within a short duration, only the latest update might be emitted.
-     *
-     * @param searchSpec an [AppFunctionSearchSpec] instance specifying the filters for searching
-     *   the app function metadata.
-     * @return a flow that emits a list of [AppFunctionMetadata] matching the search criteria and
-     *   updated versions of this list when underlying data changes.
-     * @throws UnsupportedOperationException if AppFunction is not supported on this device.
-     */
-    @RequiresPermission(value = "android.permission.EXECUTE_APP_FUNCTIONS", conditional = true)
-    public fun observeAppFunctions(
-        searchSpec: AppFunctionSearchSpec
-    ): Flow<List<AppFunctionMetadata>> {
-        checkAppFunctionsFeatureSupported()
-
-        return appFunctionReader.searchAppFunctions(searchSpec)
-    }
-
     private fun checkAppFunctionsFeatureSupported() {
         if (!isSupported()) {
             throw UnsupportedOperationException("AppFunction feature is not supported.")
diff --git a/appsearch/appsearch-builtin-types/build.gradle b/appsearch/appsearch-builtin-types/build.gradle
index 1f4543c..46282d4a 100644
--- a/appsearch/appsearch-builtin-types/build.gradle
+++ b/appsearch/appsearch-builtin-types/build.gradle
@@ -57,6 +57,6 @@
 }
 
 android {
-    compileSdk = 36
+    compileSdk = 35
     namespace = "androidx.appsearch.builtintypes"
 }
diff --git a/appsearch/appsearch-debug-view/build.gradle b/appsearch/appsearch-debug-view/build.gradle
index 0e7c1f7..690b28b 100644
--- a/appsearch/appsearch-debug-view/build.gradle
+++ b/appsearch/appsearch-debug-view/build.gradle
@@ -29,7 +29,7 @@
 }
 
 android {
-    compileSdk = 36
+    compileSdk = 35
     namespace = "androidx.appsearch.debugview"
 }
 
diff --git a/appsearch/appsearch-debug-view/samples/build.gradle b/appsearch/appsearch-debug-view/samples/build.gradle
index 74dfaba..cf74890 100644
--- a/appsearch/appsearch-debug-view/samples/build.gradle
+++ b/appsearch/appsearch-debug-view/samples/build.gradle
@@ -29,7 +29,7 @@
 }
 
 android {
-    compileSdk = 36
+    compileSdk = 35
     namespace = "androidx.appsearch.debugview.samples"
 }
 
diff --git a/appsearch/appsearch-ktx/build.gradle b/appsearch/appsearch-ktx/build.gradle
index d7c22fd..cf2be5f 100644
--- a/appsearch/appsearch-ktx/build.gradle
+++ b/appsearch/appsearch-ktx/build.gradle
@@ -50,6 +50,6 @@
 }
 
 android {
-    compileSdk = 36
+    compileSdk = 35
     namespace = "androidx.appsearch.ktx"
 }
diff --git a/appsearch/appsearch-local-storage/api/1.1.0-beta02.txt b/appsearch/appsearch-local-storage/api/1.1.0-beta02.txt
index 0574cfd..425b7b2 100644
--- a/appsearch/appsearch-local-storage/api/1.1.0-beta02.txt
+++ b/appsearch/appsearch-local-storage/api/1.1.0-beta02.txt
@@ -4,7 +4,6 @@
   public class LocalStorage {
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.GlobalSearchSession!> createGlobalSearchSessionAsync(androidx.appsearch.localstorage.LocalStorage.GlobalSearchContext);
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.AppSearchSession!> createSearchSessionAsync(androidx.appsearch.localstorage.LocalStorage.SearchContext);
-    method @SuppressCompatibility @androidx.appsearch.app.ExperimentalAppSearchApi public static androidx.appsearch.app.Features getFeatures();
   }
 
   public static final class LocalStorage.GlobalSearchContext {
diff --git a/appsearch/appsearch-local-storage/api/current.txt b/appsearch/appsearch-local-storage/api/current.txt
index 0574cfd..425b7b2 100644
--- a/appsearch/appsearch-local-storage/api/current.txt
+++ b/appsearch/appsearch-local-storage/api/current.txt
@@ -4,7 +4,6 @@
   public class LocalStorage {
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.GlobalSearchSession!> createGlobalSearchSessionAsync(androidx.appsearch.localstorage.LocalStorage.GlobalSearchContext);
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.AppSearchSession!> createSearchSessionAsync(androidx.appsearch.localstorage.LocalStorage.SearchContext);
-    method @SuppressCompatibility @androidx.appsearch.app.ExperimentalAppSearchApi public static androidx.appsearch.app.Features getFeatures();
   }
 
   public static final class LocalStorage.GlobalSearchContext {
diff --git a/appsearch/appsearch-local-storage/api/restricted_1.1.0-beta02.txt b/appsearch/appsearch-local-storage/api/restricted_1.1.0-beta02.txt
index 0574cfd..425b7b2 100644
--- a/appsearch/appsearch-local-storage/api/restricted_1.1.0-beta02.txt
+++ b/appsearch/appsearch-local-storage/api/restricted_1.1.0-beta02.txt
@@ -4,7 +4,6 @@
   public class LocalStorage {
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.GlobalSearchSession!> createGlobalSearchSessionAsync(androidx.appsearch.localstorage.LocalStorage.GlobalSearchContext);
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.AppSearchSession!> createSearchSessionAsync(androidx.appsearch.localstorage.LocalStorage.SearchContext);
-    method @SuppressCompatibility @androidx.appsearch.app.ExperimentalAppSearchApi public static androidx.appsearch.app.Features getFeatures();
   }
 
   public static final class LocalStorage.GlobalSearchContext {
diff --git a/appsearch/appsearch-local-storage/api/restricted_current.txt b/appsearch/appsearch-local-storage/api/restricted_current.txt
index 0574cfd..425b7b2 100644
--- a/appsearch/appsearch-local-storage/api/restricted_current.txt
+++ b/appsearch/appsearch-local-storage/api/restricted_current.txt
@@ -4,7 +4,6 @@
   public class LocalStorage {
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.GlobalSearchSession!> createGlobalSearchSessionAsync(androidx.appsearch.localstorage.LocalStorage.GlobalSearchContext);
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.AppSearchSession!> createSearchSessionAsync(androidx.appsearch.localstorage.LocalStorage.SearchContext);
-    method @SuppressCompatibility @androidx.appsearch.app.ExperimentalAppSearchApi public static androidx.appsearch.app.Features getFeatures();
   }
 
   public static final class LocalStorage.GlobalSearchContext {
diff --git a/appsearch/appsearch-local-storage/build.gradle b/appsearch/appsearch-local-storage/build.gradle
index f972c09..63ebdfc 100644
--- a/appsearch/appsearch-local-storage/build.gradle
+++ b/appsearch/appsearch-local-storage/build.gradle
@@ -30,7 +30,7 @@
 }
 
 android {
-    compileSdk = 36
+    compileSdk = 35
     compileOptions {
         sourceCompatibility = JavaVersion.VERSION_1_8
         targetCompatibility = JavaVersion.VERSION_1_8
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java
index fe53380..fdeb1d4 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java
@@ -28,7 +28,6 @@
 import androidx.appsearch.app.AppSearchEnvironmentFactory;
 import androidx.appsearch.app.AppSearchSession;
 import androidx.appsearch.app.ExperimentalAppSearchApi;
-import androidx.appsearch.app.Features;
 import androidx.appsearch.app.GlobalSearchSession;
 import androidx.appsearch.exceptions.AppSearchException;
 import androidx.appsearch.flags.Flags;
@@ -325,15 +324,6 @@
     }
 
     /**
-     * Returns the {@link Features} to check for the availability of certain features for this
-     * AppSearch storage.
-     */
-    @ExperimentalAppSearchApi
-    public static @NonNull Features getFeatures() {
-        return new FeaturesImpl();
-    }
-
-    /**
      * Returns the singleton instance of {@link LocalStorage}.
      *
      * <p>If the system is not initialized, it will be initialized using the provided
diff --git a/appsearch/appsearch-platform-storage/api/1.1.0-beta02.txt b/appsearch/appsearch-platform-storage/api/1.1.0-beta02.txt
index 41a348f..4709926 100644
--- a/appsearch/appsearch-platform-storage/api/1.1.0-beta02.txt
+++ b/appsearch/appsearch-platform-storage/api/1.1.0-beta02.txt
@@ -5,7 +5,6 @@
     method @RequiresApi(android.os.Build.VERSION_CODES.VANILLA_ICE_CREAM) public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.EnterpriseGlobalSearchSession!> createEnterpriseGlobalSearchSessionAsync(androidx.appsearch.platformstorage.PlatformStorage.GlobalSearchContext);
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.GlobalSearchSession!> createGlobalSearchSessionAsync(androidx.appsearch.platformstorage.PlatformStorage.GlobalSearchContext);
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.AppSearchSession!> createSearchSessionAsync(androidx.appsearch.platformstorage.PlatformStorage.SearchContext);
-    method @SuppressCompatibility @androidx.appsearch.app.ExperimentalAppSearchApi public static androidx.appsearch.app.Features getFeatures(android.content.Context);
   }
 
   public static final class PlatformStorage.GlobalSearchContext {
diff --git a/appsearch/appsearch-platform-storage/api/current.txt b/appsearch/appsearch-platform-storage/api/current.txt
index 41a348f..4709926 100644
--- a/appsearch/appsearch-platform-storage/api/current.txt
+++ b/appsearch/appsearch-platform-storage/api/current.txt
@@ -5,7 +5,6 @@
     method @RequiresApi(android.os.Build.VERSION_CODES.VANILLA_ICE_CREAM) public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.EnterpriseGlobalSearchSession!> createEnterpriseGlobalSearchSessionAsync(androidx.appsearch.platformstorage.PlatformStorage.GlobalSearchContext);
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.GlobalSearchSession!> createGlobalSearchSessionAsync(androidx.appsearch.platformstorage.PlatformStorage.GlobalSearchContext);
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.AppSearchSession!> createSearchSessionAsync(androidx.appsearch.platformstorage.PlatformStorage.SearchContext);
-    method @SuppressCompatibility @androidx.appsearch.app.ExperimentalAppSearchApi public static androidx.appsearch.app.Features getFeatures(android.content.Context);
   }
 
   public static final class PlatformStorage.GlobalSearchContext {
diff --git a/appsearch/appsearch-platform-storage/api/restricted_1.1.0-beta02.txt b/appsearch/appsearch-platform-storage/api/restricted_1.1.0-beta02.txt
index 41a348f..4709926 100644
--- a/appsearch/appsearch-platform-storage/api/restricted_1.1.0-beta02.txt
+++ b/appsearch/appsearch-platform-storage/api/restricted_1.1.0-beta02.txt
@@ -5,7 +5,6 @@
     method @RequiresApi(android.os.Build.VERSION_CODES.VANILLA_ICE_CREAM) public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.EnterpriseGlobalSearchSession!> createEnterpriseGlobalSearchSessionAsync(androidx.appsearch.platformstorage.PlatformStorage.GlobalSearchContext);
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.GlobalSearchSession!> createGlobalSearchSessionAsync(androidx.appsearch.platformstorage.PlatformStorage.GlobalSearchContext);
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.AppSearchSession!> createSearchSessionAsync(androidx.appsearch.platformstorage.PlatformStorage.SearchContext);
-    method @SuppressCompatibility @androidx.appsearch.app.ExperimentalAppSearchApi public static androidx.appsearch.app.Features getFeatures(android.content.Context);
   }
 
   public static final class PlatformStorage.GlobalSearchContext {
diff --git a/appsearch/appsearch-platform-storage/api/restricted_current.txt b/appsearch/appsearch-platform-storage/api/restricted_current.txt
index 41a348f..4709926 100644
--- a/appsearch/appsearch-platform-storage/api/restricted_current.txt
+++ b/appsearch/appsearch-platform-storage/api/restricted_current.txt
@@ -5,7 +5,6 @@
     method @RequiresApi(android.os.Build.VERSION_CODES.VANILLA_ICE_CREAM) public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.EnterpriseGlobalSearchSession!> createEnterpriseGlobalSearchSessionAsync(androidx.appsearch.platformstorage.PlatformStorage.GlobalSearchContext);
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.GlobalSearchSession!> createGlobalSearchSessionAsync(androidx.appsearch.platformstorage.PlatformStorage.GlobalSearchContext);
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.AppSearchSession!> createSearchSessionAsync(androidx.appsearch.platformstorage.PlatformStorage.SearchContext);
-    method @SuppressCompatibility @androidx.appsearch.app.ExperimentalAppSearchApi public static androidx.appsearch.app.Features getFeatures(android.content.Context);
   }
 
   public static final class PlatformStorage.GlobalSearchContext {
diff --git a/appsearch/appsearch-platform-storage/build.gradle b/appsearch/appsearch-platform-storage/build.gradle
index 2e6303f..91ec378 100644
--- a/appsearch/appsearch-platform-storage/build.gradle
+++ b/appsearch/appsearch-platform-storage/build.gradle
@@ -52,6 +52,6 @@
 }
 
 android {
-    compileSdk = 36
+    compileSdk = 35
     namespace = "androidx.appsearch.platformstorage"
 }
diff --git a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/FeaturesImpl.java b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/FeaturesImpl.java
index e80ea96..15577cb 100644
--- a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/FeaturesImpl.java
+++ b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/FeaturesImpl.java
@@ -123,21 +123,19 @@
                         || AppSearchVersionUtil.getAppSearchVersionCode(mContext)
                         >= AppSearchVersionUtil.APPSEARCH_M2024_11_VERSION_CODE;
 
-            // Android B Features
-            case Features.SCHEMA_EMBEDDING_PROPERTY_CONFIG:
-                // fall through
-            case Features.SEARCH_SPEC_ADD_INFORMATIONAL_RANKING_EXPRESSIONS:
-                // fall through
-            case Features.SEARCH_RESULT_PARENT_TYPES:
-                return AppSearchVersionUtil.isAtLeastB();
-
             // Pending Android B Features
+            case Features.SCHEMA_EMBEDDING_PROPERTY_CONFIG:
+                // TODO(b/326656531) : Update when feature is ready in service-appsearch.
+                // fall through
             case Features.SCHEMA_EMBEDDING_QUANTIZATION:
                 // TODO(b/359959345) : Update when feature is ready in service-appsearch.
                 // fall through
             case Features.SEARCH_SPEC_SEARCH_STRING_PARAMETERS:
                 // TODO(b/332620561) : Update when feature is ready in service-appsearch.
                 // fall through
+            case Features.SEARCH_SPEC_ADD_INFORMATIONAL_RANKING_EXPRESSIONS:
+                // TODO(b/332642571) : Update when feature is ready in service-appsearch.
+                // fall through
             case Features.SEARCH_SPEC_ADD_FILTER_DOCUMENT_IDS:
                 // TODO(b/367464836) : Update when feature is ready in service-appsearch.
                 // fall through
@@ -147,6 +145,9 @@
             case Features.SCHEMA_SCORABLE_PROPERTY_CONFIG:
                 // TODO(b/357105837) : Update when feature is ready in service-appsearch.
                 // fall through
+            case Features.SEARCH_RESULT_PARENT_TYPES:
+                // TODO(b/371610934) : Update when feature is ready in service-appsearch.
+                return false;
 
             // Beyond Android B Features
             case Features.SCHEMA_SET_DESCRIPTION:
diff --git a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/PlatformStorage.java b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/PlatformStorage.java
index c22e802..7838ec1 100644
--- a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/PlatformStorage.java
+++ b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/PlatformStorage.java
@@ -25,7 +25,6 @@
 import androidx.appsearch.app.AppSearchEnvironmentFactory;
 import androidx.appsearch.app.AppSearchSession;
 import androidx.appsearch.app.EnterpriseGlobalSearchSession;
-import androidx.appsearch.app.ExperimentalAppSearchApi;
 import androidx.appsearch.app.Features;
 import androidx.appsearch.app.GlobalSearchSession;
 import androidx.appsearch.exceptions.AppSearchException;
@@ -318,15 +317,6 @@
         return future;
     }
 
-    /**
-     * Returns the {@link Features} to check for the availability of certain features for this
-     * AppSearch storage.
-     */
-    @ExperimentalAppSearchApi
-    public static @NonNull Features getFeatures(@NonNull Context context) {
-        return new FeaturesImpl(context);
-    }
-
     @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
     private static class ApiHelperForV {
         private ApiHelperForV() {
diff --git a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/GenericDocumentToPlatformConverter.java b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/GenericDocumentToPlatformConverter.java
index 1e3935a..86b4625 100644
--- a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/GenericDocumentToPlatformConverter.java
+++ b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/GenericDocumentToPlatformConverter.java
@@ -16,10 +16,8 @@
 
 package androidx.appsearch.platformstorage.converter;
 
-import android.annotation.SuppressLint;
 import android.os.Build;
 
-import androidx.annotation.DoNotInline;
 import androidx.annotation.OptIn;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
@@ -28,7 +26,6 @@
 import androidx.appsearch.app.ExperimentalAppSearchApi;
 import androidx.appsearch.app.Features;
 import androidx.appsearch.app.GenericDocument;
-import androidx.appsearch.platformstorage.util.AppSearchVersionUtil;
 import androidx.core.util.Preconditions;
 
 import org.jspecify.annotations.NonNull;
@@ -97,14 +94,9 @@
                 }
                 platformBuilder.setPropertyDocument(propertyName, platformSubDocuments);
             } else if (property instanceof EmbeddingVector[]) {
-                if (!AppSearchVersionUtil.isAtLeastB()) {
-                    throw new UnsupportedOperationException(
-                            Features.SCHEMA_EMBEDDING_PROPERTY_CONFIG
-                                    + " is not available on this AppSearch implementation.");
-                }
-                EmbeddingVector[] embeddingVectors = (EmbeddingVector[]) property;
-                ApiHelperForB.setPlatformPropertyEmbedding(platformBuilder, propertyName,
-                        embeddingVectors);
+                // TODO(b/326656531): Remove this once embedding search APIs are available.
+                throw new UnsupportedOperationException(Features.SCHEMA_EMBEDDING_PROPERTY_CONFIG
+                        + " is not available on this AppSearch implementation.");
             } else if (property instanceof AppSearchBlobHandle[]) {
                 // TODO(b/273591938): Remove this once blob APIs are available.
                 throw new UnsupportedOperationException(Features.BLOB_STORAGE
@@ -164,13 +156,9 @@
                     jetpackSubDocuments[j] = toJetpackGenericDocument(documentValues[j]);
                 }
                 jetpackBuilder.setPropertyDocument(propertyName, jetpackSubDocuments);
-            } else if (AppSearchVersionUtil.isAtLeastB()
-                    && property instanceof android.app.appsearch.EmbeddingVector[]) {
-                android.app.appsearch.EmbeddingVector[] embeddingVectors =
-                        (android.app.appsearch.EmbeddingVector[]) property;
-                ApiHelperForB.setJetpackPropertyEmbedding(jetpackBuilder, propertyName,
-                        embeddingVectors);
             } else {
+                // TODO(b/326656531) : Add an entry for EmbeddingVector once it becomes
+                //  available in platform.
                 throw new IllegalStateException(
                         String.format("Property \"%s\" has unsupported value type %s", propertyName,
                                 property.getClass().toString()));
@@ -180,43 +168,4 @@
     }
 
     private GenericDocumentToPlatformConverter() {}
-
-    @RequiresApi(36)
-    private static class ApiHelperForB {
-        private ApiHelperForB() {
-        }
-
-        @SuppressLint("NewApi") // EmbeddingVector is incorrectly flagged as needing 34-ext16
-        @DoNotInline
-        static void setPlatformPropertyEmbedding(
-                android.app.appsearch.GenericDocument.@NonNull Builder<
-                        android.app.appsearch.GenericDocument.Builder<?>> platformBuilder,
-                @NonNull String propertyName,
-                EmbeddingVector @NonNull [] jetpackEmbeddingVectors) {
-            android.app.appsearch.EmbeddingVector[] platformEmbeddingVectors =
-                    new android.app.appsearch.EmbeddingVector[jetpackEmbeddingVectors.length];
-            for (int i = 0; i < jetpackEmbeddingVectors.length; i++) {
-                platformEmbeddingVectors[i] = new android.app.appsearch.EmbeddingVector(
-                        jetpackEmbeddingVectors[i].getValues(),
-                        jetpackEmbeddingVectors[i].getModelSignature());
-            }
-            platformBuilder.setPropertyEmbedding(propertyName, platformEmbeddingVectors);
-        }
-
-        @SuppressLint("NewApi") // getValues() is incorrectly flagged as needing 34-ext16
-        @DoNotInline
-        static void setJetpackPropertyEmbedding(
-                GenericDocument.@NonNull Builder<GenericDocument.Builder<?>> jetpackBuilder,
-                @NonNull String propertyName,
-                android.app.appsearch.EmbeddingVector @NonNull [] platformEmbeddingVectors) {
-            EmbeddingVector[] jetpackEmbeddingVectors =
-                    new EmbeddingVector[platformEmbeddingVectors.length];
-            for (int i = 0; i < platformEmbeddingVectors.length; i++) {
-                jetpackEmbeddingVectors[i] = new EmbeddingVector(
-                        platformEmbeddingVectors[i].getValues(),
-                        platformEmbeddingVectors[i].getModelSignature());
-            }
-            jetpackBuilder.setPropertyEmbedding(propertyName, jetpackEmbeddingVectors);
-        }
-    }
 }
diff --git a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java
index 296bb0bd6..256558e 100644
--- a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java
+++ b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java
@@ -29,7 +29,6 @@
 import androidx.appsearch.app.AppSearchSchema;
 import androidx.appsearch.app.ExperimentalAppSearchApi;
 import androidx.appsearch.app.Features;
-import androidx.appsearch.platformstorage.util.AppSearchVersionUtil;
 import androidx.core.util.Preconditions;
 
 import org.jspecify.annotations.NonNull;
@@ -232,19 +231,11 @@
             }
             return platformBuilder.build();
         } else if (jetpackProperty instanceof AppSearchSchema.EmbeddingPropertyConfig) {
-            if (!AppSearchVersionUtil.isAtLeastB()) {
-                throw new UnsupportedOperationException(Features.SCHEMA_EMBEDDING_PROPERTY_CONFIG
-                        + " is not available on this AppSearch implementation.");
-            }
-            AppSearchSchema.EmbeddingPropertyConfig embeddingProperty =
-                    (AppSearchSchema.EmbeddingPropertyConfig) jetpackProperty;
-            if (embeddingProperty.getQuantizationType()
-                    != AppSearchSchema.EmbeddingPropertyConfig.QUANTIZATION_TYPE_NONE) {
-                // TODO(b/359959345): Remove this once embedding quantization is available.
-                throw new UnsupportedOperationException(Features.SCHEMA_EMBEDDING_QUANTIZATION
-                        + " is not available on this AppSearch implementation.");
-            }
-            return ApiHelperForB.createPlatformEmbeddingPropertyConfig(embeddingProperty);
+            // TODO(b/326656531): Remove this once embedding search APIs are available.
+            // TODO(b/359959345): Remember to add the check for quantization when embedding has
+            //  become available but quantization has not yet.
+            throw new UnsupportedOperationException(Features.SCHEMA_EMBEDDING_PROPERTY_CONFIG
+                    + " is not available on this AppSearch implementation.");
         } else if (jetpackProperty instanceof AppSearchSchema.BlobHandlePropertyConfig) {
             // TODO(b/273591938): Remove this once blob APIs are available.
             throw new UnsupportedOperationException(Features.BLOB_STORAGE
@@ -257,7 +248,7 @@
 
     // Most stringProperty.get calls cause WrongConstant lint errors because the methods are not
     // defined as returning the same constants as the corresponding setter expects, but they do
-    @SuppressLint({"WrongConstant", "NewApi"}) // EmbeddingPropertyConfig incorrectly flagged
+    @SuppressLint("WrongConstant")
     private static AppSearchSchema.@NonNull PropertyConfig toJetpackProperty(
             android.app.appsearch.AppSearchSchema.@NonNull PropertyConfig platformProperty) {
         Preconditions.checkNotNull(platformProperty);
@@ -334,14 +325,9 @@
                 jetpackBuilder.addIndexableNestedProperties(indexableNestedProperties);
             }
             return jetpackBuilder.build();
-        } else if (AppSearchVersionUtil.isAtLeastB() && platformProperty
-                instanceof android.app.appsearch.AppSearchSchema.EmbeddingPropertyConfig) {
-            // TODO(b/359959345): Update quantization once it becomes available in platform.
-            android.app.appsearch.AppSearchSchema.EmbeddingPropertyConfig embeddingProperty =
-                    (android.app.appsearch.AppSearchSchema
-                            .EmbeddingPropertyConfig) platformProperty;
-            return ApiHelperForB.createJetpackEmbeddingPropertyConfig(embeddingProperty);
         } else {
+            // TODO(b/326656531) : Add an entry for EmbeddingPropertyConfig once it becomes
+            //  available in platform.
             throw new IllegalArgumentException(
                     "Invalid property type " + platformProperty.getClass()
                             + ": " + platformProperty);
@@ -422,36 +408,4 @@
             return platformDocumentProperty.getIndexableNestedProperties();
         }
     }
-
-    @RequiresApi(36)
-    @SuppressLint("NewApi") // EmbeddingPropertyConfig incorrectly flagged as 34-ext16
-    private static class ApiHelperForB {
-        private ApiHelperForB() {
-        }
-
-        @DoNotInline
-        @SuppressLint("WrongConstant")
-        static android.app.appsearch.AppSearchSchema.PropertyConfig
-                createPlatformEmbeddingPropertyConfig(
-                AppSearchSchema.@NonNull EmbeddingPropertyConfig jetpackEmbeddingProperty) {
-            return new android.app.appsearch.AppSearchSchema.EmbeddingPropertyConfig.Builder(
-                    jetpackEmbeddingProperty.getName())
-                    .setCardinality(jetpackEmbeddingProperty.getCardinality())
-                    .setIndexingType(jetpackEmbeddingProperty.getIndexingType())
-                    .build();
-        }
-
-        @DoNotInline
-        @SuppressLint("WrongConstant")
-        static AppSearchSchema.EmbeddingPropertyConfig
-                createJetpackEmbeddingPropertyConfig(
-                android.app.appsearch.AppSearchSchema.@NonNull EmbeddingPropertyConfig
-                        platformEmbeddingProperty) {
-            return new AppSearchSchema.EmbeddingPropertyConfig.Builder(
-                    platformEmbeddingProperty.getName())
-                    .setCardinality(platformEmbeddingProperty.getCardinality())
-                    .setIndexingType(platformEmbeddingProperty.getIndexingType())
-                    .build();
-        }
-    }
 }
diff --git a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchResultToPlatformConverter.java b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchResultToPlatformConverter.java
index 966b408..5e5b702 100644
--- a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchResultToPlatformConverter.java
+++ b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchResultToPlatformConverter.java
@@ -16,24 +16,18 @@
 
 package androidx.appsearch.platformstorage.converter;
 
-import android.annotation.SuppressLint;
 import android.os.Build;
-import android.util.Log;
 
 import androidx.annotation.DoNotInline;
-import androidx.annotation.OptIn;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
-import androidx.appsearch.app.ExperimentalAppSearchApi;
 import androidx.appsearch.app.GenericDocument;
 import androidx.appsearch.app.SearchResult;
-import androidx.appsearch.platformstorage.util.AppSearchVersionUtil;
 import androidx.core.util.Preconditions;
 
 import org.jspecify.annotations.NonNull;
 
 import java.util.List;
-import java.util.Map;
 
 /**
  * Translates between Platform and Jetpack versions of {@link SearchResult}.
@@ -42,12 +36,9 @@
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @RequiresApi(Build.VERSION_CODES.S)
 public class SearchResultToPlatformConverter {
-    private static final String TAG = "AppSearchSearchResPlatC";
-
     private SearchResultToPlatformConverter() {}
 
     /** Translates from Platform to Jetpack versions of {@link SearchResult}. */
-    @OptIn(markerClass = ExperimentalAppSearchApi.class)
     public static @NonNull SearchResult toJetpackSearchResult(
             android.app.appsearch.@NonNull SearchResult platformResult) {
         Preconditions.checkNotNull(platformResult);
@@ -69,27 +60,8 @@
                 builder.addJoinedResult(toJetpackSearchResult(joinedResult));
             }
         }
-        if (AppSearchVersionUtil.isAtLeastB()) {
-            List<Double> informationalRankingSignals =
-                    ApiHelperForB.getInformationalRankingSignals(platformResult);
-            for (int i = 0; i < informationalRankingSignals.size(); i++) {
-                builder.addInformationalRankingSignal(informationalRankingSignals.get(i));
-            }
-
-            try {
-                // TODO(b/371610934): Ensure the parent type map is set for older devices receiving
-                //  mainline updates. AppSearch will relocate parent type information from
-                //  GenericDocument to SearchResult in new versions. Omitting this step will result
-                //  in missing parent data and incorrect polymorphic deserialization behavior for
-                //  GenericDocument.
-                builder.setParentTypeMap(ApiHelperForB.getParentTypeMap(platformResult));
-            } catch (NoSuchMethodError e) {
-                // Catch NoSuchMethodError thrown by older pre-release Android B devices that may
-                // not have the getParentTypeMap method. This is a temporary workaround until all
-                // B devices have the method available.
-                Log.e(TAG, "Failed to set parent type map.", e);
-            }
-        }
+        // TODO(b/332642571): Add informational ranking signal once it is available in platform.
+        // TODO(b/371610934): Set parentTypeMap once it is available in platform.
         return builder.build();
     }
 
@@ -148,23 +120,4 @@
             return result.getJoinedResults();
         }
     }
-
-    @RequiresApi(36)
-    private static class ApiHelperForB {
-        private ApiHelperForB() {
-        }
-
-        @DoNotInline
-        @SuppressLint("NewApi") // getInformationalRankingSignals() incorrectly flagged as 34-ext16
-        static List<Double> getInformationalRankingSignals(
-                android.app.appsearch.@NonNull SearchResult result) {
-            return result.getInformationalRankingSignals();
-        }
-
-        @DoNotInline
-        static Map<String, List<String>> getParentTypeMap(
-                android.app.appsearch.@NonNull SearchResult result) {
-            return result.getParentTypeMap();
-        }
-    }
 }
diff --git a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchSpecToPlatformConverter.java b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchSpecToPlatformConverter.java
index b6ca26c..9c07c7d 100644
--- a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchSpecToPlatformConverter.java
+++ b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchSpecToPlatformConverter.java
@@ -24,7 +24,6 @@
 import androidx.annotation.OptIn;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
-import androidx.appsearch.app.EmbeddingVector;
 import androidx.appsearch.app.ExperimentalAppSearchApi;
 import androidx.appsearch.app.Features;
 import androidx.appsearch.app.JoinSpec;
@@ -150,14 +149,9 @@
             }
         }
         if (!jetpackSearchSpec.getEmbeddingParameters().isEmpty()) {
-            if (!AppSearchVersionUtil.isAtLeastB()) {
-                throw new UnsupportedOperationException(Features.SCHEMA_EMBEDDING_PROPERTY_CONFIG
-                        + " is not available on this AppSearch implementation.");
-            }
-            ApiHelperForB.addEmbeddingParameters(platformBuilder,
-                    jetpackSearchSpec.getEmbeddingParameters());
-            ApiHelperForB.setDefaultEmbeddingSearchMetricType(platformBuilder,
-                    jetpackSearchSpec.getDefaultEmbeddingSearchMetricType());
+            // TODO(b/326656531): Remove this once embedding search APIs are available.
+            throw new UnsupportedOperationException(Features.SCHEMA_EMBEDDING_PROPERTY_CONFIG
+                    + " is not available on this AppSearch implementation.");
         }
         if (!jetpackSearchSpec.getSearchStringParameters().isEmpty()) {
             // TODO(b/332620561): Remove this once search parameter strings APIs is supported.
@@ -193,13 +187,10 @@
         }
 
         if (!jetpackSearchSpec.getInformationalRankingExpressions().isEmpty()) {
-            if (!AppSearchVersionUtil.isAtLeastB()) {
-                throw new UnsupportedOperationException(
-                        Features.SEARCH_SPEC_ADD_INFORMATIONAL_RANKING_EXPRESSIONS
-                                + " are not available on this AppSearch implementation.");
-            }
-            ApiHelperForB.addInformationalRankingExpressions(platformBuilder,
-                    jetpackSearchSpec.getInformationalRankingExpressions());
+            // TODO(b/332642571): Remove this once informational ranking expressions are available.
+            throw new UnsupportedOperationException(
+                    Features.SEARCH_SPEC_ADD_INFORMATIONAL_RANKING_EXPRESSIONS
+                            + " are not available on this AppSearch implementation.");
         }
 
         if (!jetpackSearchSpec.getFilterDocumentIds().isEmpty()) {
@@ -290,40 +281,4 @@
             platformBuilder.setSearchSourceLogTag(searchSourceLogTag);
         }
     }
-
-    @RequiresApi(36)
-    @SuppressLint("NewApi") // EmbeddingVector incorrectly flagged as 34-ext16
-    private static class ApiHelperForB {
-        private ApiHelperForB() {
-        }
-
-        @DoNotInline
-        static void addEmbeddingParameters(
-                android.app.appsearch.SearchSpec.@NonNull Builder platformBuilder,
-                @NonNull List<EmbeddingVector> embeddingVectors) {
-            android.app.appsearch.EmbeddingVector[] platformEmbeddingVectors =
-                    new android.app.appsearch.EmbeddingVector[embeddingVectors.size()];
-            for (int i = 0; i < embeddingVectors.size(); i++) {
-                platformEmbeddingVectors[i] = new android.app.appsearch.EmbeddingVector(
-                        embeddingVectors.get(i).getValues(),
-                        embeddingVectors.get(i).getModelSignature());
-            }
-            platformBuilder.addEmbeddingParameters(platformEmbeddingVectors);
-        }
-
-        @DoNotInline
-        @SuppressLint("WrongConstant")
-        static void setDefaultEmbeddingSearchMetricType(
-                android.app.appsearch.SearchSpec.@NonNull Builder platformBuilder,
-                @SearchSpec.EmbeddingSearchMetricType int defaultEmbeddingSearchMetricType) {
-            platformBuilder.setDefaultEmbeddingSearchMetricType(defaultEmbeddingSearchMetricType);
-        }
-
-        @DoNotInline
-        static void addInformationalRankingExpressions(
-                android.app.appsearch.SearchSpec.@NonNull Builder platformBuilder,
-                @NonNull List<String> informationalRankingExpressions) {
-            platformBuilder.addInformationalRankingExpressions(informationalRankingExpressions);
-        }
-    }
 }
diff --git a/appsearch/appsearch-play-services-storage/build.gradle b/appsearch/appsearch-play-services-storage/build.gradle
index 6651a80..7453214 100644
--- a/appsearch/appsearch-play-services-storage/build.gradle
+++ b/appsearch/appsearch-play-services-storage/build.gradle
@@ -55,7 +55,7 @@
 }
 
 android {
-    compileSdk = 36
+    compileSdk = 35
     namespace = "androidx.appsearch.playservicesstorage"
      defaultConfig {
     }
diff --git a/appsearch/appsearch-test-util/build.gradle b/appsearch/appsearch-test-util/build.gradle
index af58115..9bb1de6 100644
--- a/appsearch/appsearch-test-util/build.gradle
+++ b/appsearch/appsearch-test-util/build.gradle
@@ -43,6 +43,6 @@
 }
 
 android {
-    compileSdk = 36
+    compileSdk = 35
     namespace = "androidx.appsearch.testutil"
 }
diff --git a/appsearch/appsearch/build.gradle b/appsearch/appsearch/build.gradle
index 11ac0a1..18a9a3b 100644
--- a/appsearch/appsearch/build.gradle
+++ b/appsearch/appsearch/build.gradle
@@ -29,7 +29,7 @@
 }
 
 android {
-    compileSdk = 36
+    compileSdk = 35
     buildTypes.configureEach {
         consumerProguardFiles "proguard-rules.pro"
     }
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AnnotationProcessorPlatformTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AnnotationProcessorPlatformTest.java
index e2f6620..686ae18 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AnnotationProcessorPlatformTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AnnotationProcessorPlatformTest.java
@@ -16,10 +16,13 @@
 // @exportToFramework:skipFile()
 package androidx.appsearch.app;
 
+import static org.junit.Assume.assumeFalse;
+
 import android.content.Context;
 import android.os.Build;
 
 import androidx.appsearch.platformstorage.PlatformStorage;
+import androidx.appsearch.platformstorage.util.AppSearchVersionUtil;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.filters.SdkSuppress;
 
@@ -35,4 +38,20 @@
         return PlatformStorage.createSearchSessionAsync(
                 new PlatformStorage.SearchContext.Builder(context, dbName).build());
     }
+
+    @Override
+    public void testPolymorphicDeserialization_Integration() throws Exception {
+        // TODO(b/371610934): Enable this test for B devices once we are able to call
+        //  SearchResult#getParentTypeMap in platform storage to hook up the parent information.
+        assumeFalse(AppSearchVersionUtil.isAtLeastB());
+        super.testPolymorphicDeserialization_Integration();
+    }
+
+    @Override
+    public void testPolymorphicDeserialization_NestedType_Integration() throws Exception {
+        // TODO(b/371610934): Enable this test for B devices once we are able to call
+        //  SearchResult#getParentTypeMap in platform storage to hook up the parent information.
+        assumeFalse(AppSearchVersionUtil.isAtLeastB());
+        super.testPolymorphicDeserialization_NestedType_Integration();
+    }
 }
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AppSearchSessionPlatformInternalTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AppSearchSessionPlatformInternalTest.java
index 3a820a0..f5ce5a15 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AppSearchSessionPlatformInternalTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AppSearchSessionPlatformInternalTest.java
@@ -29,6 +29,7 @@
 import androidx.appsearch.app.AppSearchSchema.StringPropertyConfig;
 import androidx.appsearch.flags.Flags;
 import androidx.appsearch.platformstorage.PlatformStorage;
+import androidx.appsearch.platformstorage.util.AppSearchVersionUtil;
 import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.filters.SdkSuppress;
@@ -85,4 +86,12 @@
                 "StringPropertyConfig.DELETE_PROPAGATION_TYPE_PROPAGATE_FROM is not supported on "
                         + "this AppSearch implementation.");
     }
+
+    @Override
+    public void testQuery_genericDocumentWrapsParentTypeForPolymorphism() throws Exception {
+        // TODO(b/371610934): Enable this test for B devices once we are able to call
+        //  SearchResult#getParentTypeMap in platform storage to hook up the parent information.
+        assumeFalse(AppSearchVersionUtil.isAtLeastB());
+        super.testQuery_genericDocumentWrapsParentTypeForPolymorphism();
+    }
 }
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SetSchemaRequestCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SetSchemaRequestCtsTest.java
index c09e3a3..6b38c44 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SetSchemaRequestCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SetSchemaRequestCtsTest.java
@@ -1231,34 +1231,6 @@
         assertThat(request.getMigrators()).isEmpty();
     }
 
-    @Test
-    public void testSetSchemaEquals() {
-        AppSearchSchema schema1 = new AppSearchSchema.Builder("type1").build();
-        Migrator migrator = new NoOpMigrator();
-        SetSchemaRequest request1 = new SetSchemaRequest.Builder()
-                .addSchemas(schema1)
-                .setMigrator("type1", migrator)
-                .setForceOverride(true)
-                .setVersion(1)
-                .build();
-        SetSchemaRequest request2 = new SetSchemaRequest.Builder()
-                .addSchemas(schema1)
-                .setMigrator("type1", migrator)
-                .setForceOverride(true)
-                .setVersion(1)
-                .build();
-        SetSchemaRequest request3 = new SetSchemaRequest.Builder()
-                .setForceOverride(true)
-                .setVersion(1)
-                .build();
-        // All parameters same.
-        assertThat(request1).isEqualTo(request2);
-        assertThat(request1.hashCode()).isEqualTo(request2.hashCode());
-        // Migrator not set.
-        assertThat(request1).isNotEqualTo(request3);
-        assertThat(request1.hashCode()).isNotEqualTo(request3.hashCode());
-    }
-
     /** Migrator that does nothing. */
     private static class NoOpMigrator extends Migrator {
         @Override
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/SetSchemaRequest.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/SetSchemaRequest.java
index 1e4e263..e463232 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/SetSchemaRequest.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/SetSchemaRequest.java
@@ -30,7 +30,6 @@
 import androidx.appsearch.flags.Flags;
 import androidx.collection.ArrayMap;
 import androidx.collection.ArraySet;
-import androidx.core.util.ObjectsCompat;
 import androidx.core.util.Preconditions;
 
 import java.lang.annotation.Retention;
@@ -381,33 +380,6 @@
         return mVersion;
     }
 
-    @Override
-    public boolean equals(@Nullable Object other) {
-        if (this == other) {
-            return true;
-        }
-        if (!(other instanceof SetSchemaRequest)) {
-            return false;
-        }
-        SetSchemaRequest otherRequest = (SetSchemaRequest) other;
-        return mSchemas.equals(otherRequest.mSchemas)
-                && mSchemasNotDisplayedBySystem.equals(otherRequest.mSchemasNotDisplayedBySystem)
-                && mSchemasVisibleToPackages.equals(otherRequest.mSchemasVisibleToPackages)
-                && mSchemasVisibleToPermissions.equals(otherRequest.mSchemasVisibleToPermissions)
-                && mPubliclyVisibleSchemas.equals(otherRequest.mPubliclyVisibleSchemas)
-                && mSchemasVisibleToConfigs.equals(otherRequest.mSchemasVisibleToConfigs)
-                && mMigrators.equals(otherRequest.mMigrators)
-                && mForceOverride == otherRequest.mForceOverride
-                && mVersion == otherRequest.mVersion;
-    }
-
-    @Override
-    public int hashCode() {
-        return ObjectsCompat.hash(mSchemas, mSchemasNotDisplayedBySystem, mSchemasVisibleToPackages,
-        mSchemasVisibleToPermissions, mPubliclyVisibleSchemas, mSchemasVisibleToConfigs, mMigrators,
-                mForceOverride, mVersion);
-    }
-
     /** Builder for {@link SetSchemaRequest} objects. */
     public static final class Builder {
         private static final int DEFAULT_VERSION = 1;
diff --git a/benchmark/benchmark-macro/dependencyAnalysis-baseline.json b/benchmark/benchmark-macro/dependencyAnalysis-baseline.json
index a538886..d3ba703 100644
--- a/benchmark/benchmark-macro/dependencyAnalysis-baseline.json
+++ b/benchmark/benchmark-macro/dependencyAnalysis-baseline.json
@@ -70,6 +70,14 @@
     },
     {
       "coordinates": {
+        "type": "module",
+        "identifier": "com.squareup.wire:wire-runtime",
+        "resolvedVersion": "5.2.1"
+      },
+      "fromConfiguration": "implementation"
+    },
+    {
+      "coordinates": {
         "type": "project",
         "identifier": ":benchmark:benchmark-traceprocessor"
       },
diff --git a/browser/browser/api/current.txt b/browser/browser/api/current.txt
index 6c80138..06ecaa3 100644
--- a/browser/browser/api/current.txt
+++ b/browser/browser/api/current.txt
@@ -492,13 +492,6 @@
     field public final java.util.List<android.net.Uri!> uris;
   }
 
-  public final class LaunchHandlerClientMode {
-    field public static final int AUTO = 0; // 0x0
-    field public static final int FOCUS_EXISTING = 2; // 0x2
-    field public static final int NAVIGATE_EXISTING = 1; // 0x1
-    field public static final int NAVIGATE_NEW = 3; // 0x3
-  }
-
   public final class ScreenOrientation {
     field public static final int ANY = 5; // 0x5
     field public static final int DEFAULT = 0; // 0x0
@@ -555,7 +548,6 @@
   public final class TrustedWebActivityIntent {
     method public androidx.browser.trusted.FileHandlingData? getFileHandlingData();
     method public android.content.Intent getIntent();
-    method public int getLaunchHandlerClientMode();
     method public android.net.Uri? getOriginalLaunchUrl();
     method public void launchTrustedWebActivity(android.content.Context);
   }
@@ -572,7 +564,6 @@
     method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setDefaultColorSchemeParams(androidx.browser.customtabs.CustomTabColorSchemeParams);
     method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setDisplayMode(androidx.browser.trusted.TrustedWebActivityDisplayMode);
     method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setFileHandlingData(androidx.browser.trusted.FileHandlingData);
-    method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setLaunchHandlerClientMode(int);
     method @Deprecated public androidx.browser.trusted.TrustedWebActivityIntentBuilder setNavigationBarColor(@ColorInt int);
     method @Deprecated public androidx.browser.trusted.TrustedWebActivityIntentBuilder setNavigationBarDividerColor(@ColorInt int);
     method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setOriginalLaunchUrl(android.net.Uri);
@@ -583,7 +574,6 @@
     field public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS = "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
     field public static final String EXTRA_DISPLAY_MODE = "androidx.browser.trusted.extra.DISPLAY_MODE";
     field public static final String EXTRA_FILE_HANDLING_DATA = "androidx.browser.trusted.extra.FILE_HANDLING_DATA";
-    field public static final String EXTRA_LAUNCH_HANDLER_CLIENT_MODE = "androidx.browser.trusted.extra.LAUNCH_HANDLER_CLIENT_MODE";
     field public static final String EXTRA_ORIGINAL_LAUNCH_URL = "androidx.browser.trusted.extra.ORIGINAL_LAUNCH_URL";
     field public static final String EXTRA_SCREEN_ORIENTATION = "androidx.browser.trusted.extra.SCREEN_ORIENTATION";
     field public static final String EXTRA_SHARE_DATA = "androidx.browser.trusted.extra.SHARE_DATA";
diff --git a/browser/browser/api/restricted_current.txt b/browser/browser/api/restricted_current.txt
index 80cfe8f..9cb7cf8 100644
--- a/browser/browser/api/restricted_current.txt
+++ b/browser/browser/api/restricted_current.txt
@@ -503,13 +503,6 @@
     field public final java.util.List<android.net.Uri!> uris;
   }
 
-  public final class LaunchHandlerClientMode {
-    field public static final int AUTO = 0; // 0x0
-    field public static final int FOCUS_EXISTING = 2; // 0x2
-    field public static final int NAVIGATE_EXISTING = 1; // 0x1
-    field public static final int NAVIGATE_NEW = 3; // 0x3
-  }
-
   public final class ScreenOrientation {
     field public static final int ANY = 5; // 0x5
     field public static final int DEFAULT = 0; // 0x0
@@ -566,7 +559,6 @@
   public final class TrustedWebActivityIntent {
     method public androidx.browser.trusted.FileHandlingData? getFileHandlingData();
     method public android.content.Intent getIntent();
-    method public int getLaunchHandlerClientMode();
     method public android.net.Uri? getOriginalLaunchUrl();
     method public void launchTrustedWebActivity(android.content.Context);
   }
@@ -583,7 +575,6 @@
     method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setDefaultColorSchemeParams(androidx.browser.customtabs.CustomTabColorSchemeParams);
     method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setDisplayMode(androidx.browser.trusted.TrustedWebActivityDisplayMode);
     method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setFileHandlingData(androidx.browser.trusted.FileHandlingData);
-    method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setLaunchHandlerClientMode(int);
     method @Deprecated public androidx.browser.trusted.TrustedWebActivityIntentBuilder setNavigationBarColor(@ColorInt int);
     method @Deprecated public androidx.browser.trusted.TrustedWebActivityIntentBuilder setNavigationBarDividerColor(@ColorInt int);
     method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setOriginalLaunchUrl(android.net.Uri);
@@ -594,7 +585,6 @@
     field public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS = "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
     field public static final String EXTRA_DISPLAY_MODE = "androidx.browser.trusted.extra.DISPLAY_MODE";
     field public static final String EXTRA_FILE_HANDLING_DATA = "androidx.browser.trusted.extra.FILE_HANDLING_DATA";
-    field public static final String EXTRA_LAUNCH_HANDLER_CLIENT_MODE = "androidx.browser.trusted.extra.LAUNCH_HANDLER_CLIENT_MODE";
     field public static final String EXTRA_ORIGINAL_LAUNCH_URL = "androidx.browser.trusted.extra.ORIGINAL_LAUNCH_URL";
     field public static final String EXTRA_SCREEN_ORIENTATION = "androidx.browser.trusted.extra.SCREEN_ORIENTATION";
     field public static final String EXTRA_SHARE_DATA = "androidx.browser.trusted.extra.SHARE_DATA";
diff --git a/browser/browser/build.gradle b/browser/browser/build.gradle
index bf6d9f9..dba336e 100644
--- a/browser/browser/build.gradle
+++ b/browser/browser/build.gradle
@@ -26,10 +26,6 @@
     namespace = "androidx.browser"
 }
 
-android {
-    compileSdk = 36
-}
-
 dependencies {
     api(libs.jspecify)
     api("androidx.core:core:1.10.0")
diff --git a/browser/browser/dependencyAnalysis-baseline.json b/browser/browser/dependencyAnalysis-baseline.json
index b523227..7f6a514 100644
--- a/browser/browser/dependencyAnalysis-baseline.json
+++ b/browser/browser/dependencyAnalysis-baseline.json
@@ -4,10 +4,58 @@
     {
       "coordinates": {
         "type": "module",
+        "identifier": "androidx.test.espresso:espresso-core",
+        "resolvedVersion": "3.7.0-alpha01"
+      },
+      "fromConfiguration": "androidTestImplementation"
+    },
+    {
+      "coordinates": {
+        "type": "module",
+        "identifier": "androidx.test:monitor",
+        "resolvedVersion": "1.8.0-alpha01"
+      },
+      "toConfiguration": "androidTestImplementation"
+    },
+    {
+      "coordinates": {
+        "type": "module",
+        "identifier": "com.google.guava:guava",
+        "resolvedVersion": "33.3.1-jre"
+      },
+      "toConfiguration": "testImplementation"
+    },
+    {
+      "coordinates": {
+        "type": "module",
         "identifier": "com.linkedin.dexmaker:dexmaker-mockito",
         "resolvedVersion": "2.28.4"
       },
       "fromConfiguration": "androidTestImplementation"
+    },
+    {
+      "coordinates": {
+        "type": "module",
+        "identifier": "junit:junit",
+        "resolvedVersion": "4.13.2"
+      },
+      "toConfiguration": "androidTestImplementation"
+    },
+    {
+      "coordinates": {
+        "type": "module",
+        "identifier": "org.robolectric:annotations",
+        "resolvedVersion": "4.14"
+      },
+      "toConfiguration": "testImplementation"
+    },
+    {
+      "coordinates": {
+        "type": "module",
+        "identifier": "org.robolectric:shadowapi",
+        "resolvedVersion": "4.14"
+      },
+      "toConfiguration": "testImplementation"
     }
   ]
 }
\ No newline at end of file
diff --git a/browser/browser/src/main/java/androidx/browser/customtabs/CustomTabsIntent.java b/browser/browser/src/main/java/androidx/browser/customtabs/CustomTabsIntent.java
index e96e8b6..837916a 100644
--- a/browser/browser/src/main/java/androidx/browser/customtabs/CustomTabsIntent.java
+++ b/browser/browser/src/main/java/androidx/browser/customtabs/CustomTabsIntent.java
@@ -1519,9 +1519,6 @@
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
                 setShareIdentityEnabled();
             }
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
-                setAllowPassThroughOnTouchOutside();
-            }
             if (mActivityOptions != null) {
                 bundle = mActivityOptions.toBundle();
             }
@@ -1557,15 +1554,6 @@
             }
             Api34Impl.setShareIdentityEnabled(mActivityOptions, mShareIdentity);
         }
-
-        @RequiresApi(api = Build.VERSION_CODES.BAKLAVA)
-        private void setAllowPassThroughOnTouchOutside() {
-            if (mActivityOptions == null) {
-                mActivityOptions = Api23Impl.makeBasicActivityOptions();
-            }
-            boolean enabled = isBackgroundInteractionEnabled(mIntent);
-            Api36Impl.setAllowPassThroughOnTouchOutside(mActivityOptions, enabled);
-        }
     }
 
     /**
@@ -1897,12 +1885,4 @@
             activityOptions.setShareIdentityEnabled(enabled);
         }
     }
-
-    @RequiresApi(api = Build.VERSION_CODES.BAKLAVA)
-    private static class Api36Impl {
-        static void setAllowPassThroughOnTouchOutside(
-                ActivityOptions activityOptions, boolean enabled) {
-            activityOptions.setAllowPassThroughOnTouchOutside(enabled);
-        }
-    }
 }
diff --git a/browser/browser/src/main/java/androidx/browser/trusted/LaunchHandlerClientMode.java b/browser/browser/src/main/java/androidx/browser/trusted/LaunchHandlerClientMode.java
deleted file mode 100644
index 912b8f4..0000000
--- a/browser/browser/src/main/java/androidx/browser/trusted/LaunchHandlerClientMode.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.browser.trusted;
-
-import androidx.annotation.IntDef;
-import androidx.annotation.RestrictTo;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Represents launch handler client mode type value of a Launch Handler API
- * https://developer.mozilla.org/en-US/docs/Web/API/Launch_Handler_API
- */
-public final class LaunchHandlerClientMode {
-
-    private LaunchHandlerClientMode() {
-    }
-
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    @IntDef({
-            AUTO,
-            NAVIGATE_EXISTING,
-            FOCUS_EXISTING,
-            NAVIGATE_NEW,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface ClientMode {
-    }
-
-    /**
-     * The user agent's default launch routing behavior is used.
-     */
-    public static final int AUTO = 0;
-
-    /**
-     * If an existing web app client is open it is brought to focus and navigated to the launch's
-     * target URL. If there are no existing web app clients the navigate-new behavior is used
-     * instead.
-     */
-    public static final int NAVIGATE_EXISTING = 1;
-
-    /**
-     * If an existing web app client is open it is brought to focus but not navigated to the
-     * launch's target URL, instead the target URL is communicated via LaunchParams.
-     * If there are no existing web app clients the navigate-new behavior is used instead.
-     */
-    public static final int FOCUS_EXISTING = 2;
-
-    /**
-     * A new web app client is created to load the launch's target URL.
-     */
-    public static final int NAVIGATE_NEW = 3;
-}
diff --git a/browser/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityIntent.java b/browser/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityIntent.java
index a361522..a328275 100644
--- a/browser/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityIntent.java
+++ b/browser/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityIntent.java
@@ -69,19 +69,6 @@
     }
 
     /**
-     * Used for Launch Handler API to provide client mode to a browser.
-     *
-     * {@see https://developer.mozilla.org/en-US/docs/Web/API/Launch_Handler_API}
-     *
-     * @return An integer that represents Launch Handler API client mode.
-     */
-    public @LaunchHandlerClientMode.ClientMode int getLaunchHandlerClientMode() {
-        return getIntent().getIntExtra(
-                TrustedWebActivityIntentBuilder.EXTRA_LAUNCH_HANDLER_CLIENT_MODE,
-                LaunchHandlerClientMode.AUTO);
-    }
-
-    /**
      * Launches a Trusted Web Activity.
      */
     public void launchTrustedWebActivity(@NonNull Context context) {
diff --git a/browser/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityIntentBuilder.java b/browser/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityIntentBuilder.java
index 7dc04eb..e9b4821 100644
--- a/browser/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityIntentBuilder.java
+++ b/browser/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityIntentBuilder.java
@@ -90,13 +90,6 @@
     public static final String EXTRA_ORIGINAL_LAUNCH_URL =
             "androidx.browser.trusted.extra.ORIGINAL_LAUNCH_URL";
 
-    /**
-     * If a TWA is being launched using Launch Handler API, its client mode value is provided,
-     * see {@link #setLaunchHandlerClientMode}.
-     */
-    public static final String EXTRA_LAUNCH_HANDLER_CLIENT_MODE =
-            "androidx.browser.trusted.extra.LAUNCH_HANDLER_CLIENT_MODE";
-
     private final @NonNull Uri mUri;
     private final CustomTabsIntent.@NonNull Builder mIntentBuilder = new CustomTabsIntent.Builder();
 
@@ -110,9 +103,6 @@
 
     private @Nullable Uri mOriginalLaunchUrl;
 
-    @LaunchHandlerClientMode.ClientMode
-    private int mLaunchHandlerClientMode = LaunchHandlerClientMode.AUTO;
-
     private @NonNull TrustedWebActivityDisplayMode mDisplayMode =
             new TrustedWebActivityDisplayMode.DefaultMode();
 
@@ -317,17 +307,6 @@
     }
 
     /**
-     * Sets the parameter for delivering Launch Handler API client mode via a Trusted Web Activity.
-     *
-     * @param launchHandlerClientMode A string describing the client mode.
-     */
-    public @NonNull TrustedWebActivityIntentBuilder setLaunchHandlerClientMode(
-            @LaunchHandlerClientMode.ClientMode int launchHandlerClientMode) {
-        mLaunchHandlerClientMode = launchHandlerClientMode;
-        return this;
-    }
-
-    /**
      * Builds an instance of {@link TrustedWebActivityIntent}.
      *
      * @param session The {@link CustomTabsSession} to use for launching a Trusted Web Activity.
@@ -369,9 +348,6 @@
         if (mOriginalLaunchUrl != null) {
             intent.putExtra(EXTRA_ORIGINAL_LAUNCH_URL, mOriginalLaunchUrl);
         }
-
-        intent.putExtra(EXTRA_LAUNCH_HANDLER_CLIENT_MODE, mLaunchHandlerClientMode);
-
         return new TrustedWebActivityIntent(intent, sharedUris, fileHandlingUris);
     }
 
diff --git a/browser/browser/src/test/java/androidx/browser/trusted/TrustedWebActivityIntentBuilderTest.java b/browser/browser/src/test/java/androidx/browser/trusted/TrustedWebActivityIntentBuilderTest.java
index 795b324..99aec80 100644
--- a/browser/browser/src/test/java/androidx/browser/trusted/TrustedWebActivityIntentBuilderTest.java
+++ b/browser/browser/src/test/java/androidx/browser/trusted/TrustedWebActivityIntentBuilderTest.java
@@ -81,9 +81,6 @@
         FileHandlingData fileHandlingData = new FileHandlingData(
                 Arrays.asList(Uri.parse("content://test.uri")));
 
-        @LaunchHandlerClientMode.ClientMode int launchHandlerClientMode =
-                LaunchHandlerClientMode.NAVIGATE_EXISTING;
-
         CustomTabsSession session = TestUtil.makeMockSession();
 
         ImmersiveMode displayMode = new ImmersiveMode(true,
@@ -100,7 +97,6 @@
                         .setDisplayMode(displayMode)
                         .setOriginalLaunchUrl(originalLaunchUrl)
                         .setFileHandlingData(fileHandlingData)
-                        .setLaunchHandlerClientMode(launchHandlerClientMode)
                         .build(session)
                         .getIntent();
 
@@ -151,8 +147,5 @@
                 FileHandlingData.fromBundle(intent.getBundleExtra(
                         TrustedWebActivityIntentBuilder.EXTRA_FILE_HANDLING_DATA));
         assertEquals(fileHandlingData.uris.get(0), fileHandlingDataFromIntent.uris.get(0));
-
-        assertEquals(launchHandlerClientMode, intent.getIntExtra(
-                TrustedWebActivityIntentBuilder.EXTRA_LAUNCH_HANDLER_CLIENT_MODE, 0));
     }
 }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
index 69f6139..a617199 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
@@ -871,7 +871,6 @@
         return when (compileSdk) {
             34 -> "8.1.1"
             35 -> "8.6.0"
-            36 -> "8.9.1"
             else -> throw Exception("Unknown compileSdk to minAgpVersion mapping")
         }
     }
diff --git a/buildSrc/repos.gradle b/buildSrc/repos.gradle
index 26f31ca..b46d7e2 100644
--- a/buildSrc/repos.gradle
+++ b/buildSrc/repos.gradle
@@ -45,9 +45,9 @@
             artifact()
         }
         content {
-            includeGroupByRegex "android.*"
-            includeGroupByRegex "com.android.support.*"
-            excludeGroupByRegex "androidx.databinding.*"
+            includeGroupByRegex("android.*")
+            includeGroupByRegex("com.android.support.*")
+            excludeGroupByRegex("androidx.databinding.*")
         }
     }
     handler.maven {
@@ -59,7 +59,7 @@
         if (metalavaRepoOverride != null) {
             // When using custom metalava repo, do not resolve metalava artifacts from this repo
             content {
-                excludeGroup "com.android.tools.metalava"
+                excludeGroup("com.android.tools.metalava")
             }
         }
     }
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java
index 6ab9b1c..61b1d1b 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java
@@ -438,7 +438,7 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
     public void setTorchStrengthLevel_valueUpdated()
             throws ExecutionException, InterruptedException {
-        assumeTrue(mCameraCharacteristicsCompat.isTorchStrengthLevelSupported());
+        assumeTrue(mHasFlashUnit);
 
         // Arrange
         ImageAnalysis imageAnalysis = new ImageAnalysis.Builder().build();
@@ -469,7 +469,7 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
     public void setTorchStrengthLevel_throwExceptionIfLessThanOne()
             throws ExecutionException, InterruptedException {
-        assumeTrue(mCameraCharacteristicsCompat.isTorchStrengthLevelSupported());
+        assumeTrue(mHasFlashUnit);
 
         // Arrange
         ImageAnalysis imageAnalysis = new ImageAnalysis.Builder().build();
@@ -496,7 +496,7 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
     public void setTorchStrengthLevel_throwExceptionIfLargerThanMax()
             throws ExecutionException, InterruptedException {
-        assumeTrue(mCameraCharacteristicsCompat.isTorchStrengthLevelSupported());
+        assumeTrue(mHasFlashUnit);
 
         // Arrange
         ImageAnalysis imageAnalysis = new ImageAnalysis.Builder().build();
@@ -610,7 +610,7 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
     public void capture_torchAsFlash_shouldUseDefaultTorchStrength()
             throws ExecutionException, InterruptedException, TimeoutException {
-        assumeTrue(mCameraCharacteristicsCompat.isTorchStrengthLevelSupported());
+        assumeTrue(mHasFlashUnit);
 
         // Arrange: explicitly set flash type to use torch as flash
         ImageCapture.Builder imageCaptureBuilder = new ImageCapture.Builder().setFlashType(
diff --git a/camera/camera-feature-combination-query/src/main/java/androidx/camera/featurecombinationquery/SessionConfigurationCompat.java b/camera/camera-feature-combination-query/src/main/java/androidx/camera/featurecombinationquery/SessionConfigurationCompat.java
index ac105d2..7defce6 100644
--- a/camera/camera-feature-combination-query/src/main/java/androidx/camera/featurecombinationquery/SessionConfigurationCompat.java
+++ b/camera/camera-feature-combination-query/src/main/java/androidx/camera/featurecombinationquery/SessionConfigurationCompat.java
@@ -17,7 +17,6 @@
 package androidx.camera.featurecombinationquery;
 
 import android.hardware.camera2.params.OutputConfiguration;
-import android.hardware.camera2.params.SessionConfiguration;
 
 import org.jspecify.annotations.NonNull;
 
@@ -37,12 +36,6 @@
  * {@link android.hardware.camera2.CameraDevice.CameraDeviceSetup}. Use
  * {@link android.hardware.camera2.CameraDevice.CameraDeviceSetup#createCaptureRequest} and
  * {@link android.hardware.camera2.params.SessionConfiguration} for those devices instead.
- * <p>
- * In situations where {@link android.hardware.camera2.CameraDevice} object is available, it is
- * strongly recommended to use
- * {@link CameraDeviceSetupCompat#isSessionConfigurationSupported(SessionConfiguration)} instead of
- * {@link CameraDeviceSetupCompat#isSessionConfigurationSupported(SessionConfigurationCompat)} may
- * lead to inaccurate results if not constructed accurately.
  */
 public class SessionConfigurationCompat {
     private final List<OutputConfiguration> mOutputConfigs;
diff --git a/camera/camera-feature-combination-query/src/main/java/androidx/camera/featurecombinationquery/SessionParametersCompat.java b/camera/camera-feature-combination-query/src/main/java/androidx/camera/featurecombinationquery/SessionParametersCompat.java
index cc0eea5..04a5b40 100644
--- a/camera/camera-feature-combination-query/src/main/java/androidx/camera/featurecombinationquery/SessionParametersCompat.java
+++ b/camera/camera-feature-combination-query/src/main/java/androidx/camera/featurecombinationquery/SessionParametersCompat.java
@@ -17,7 +17,6 @@
 package androidx.camera.featurecombinationquery;
 
 import android.hardware.camera2.CaptureRequest;
-import android.hardware.camera2.params.SessionConfiguration;
 
 import org.jspecify.annotations.NonNull;
 import org.jspecify.annotations.Nullable;
@@ -37,13 +36,6 @@
  * For device that support {@link android.hardware.camera2.CameraDevice.CameraDeviceSetup}, use
  * {@link android.hardware.camera2.CameraDevice.CameraDeviceSetup#createCaptureRequest} for
  * session parameters instead.
- * <p>
- * In situations where {@link android.hardware.camera2.CameraDevice} object is available, it is
- * strongly recommended to use
- * {@link CameraDeviceSetupCompat#isSessionConfigurationSupported(SessionConfiguration)} instead of
- * {@link CameraDeviceSetupCompat#isSessionConfigurationSupported(SessionConfigurationCompat)} as
- * {@link CameraDeviceSetupCompat#isSessionConfigurationSupported(SessionConfigurationCompat)} may
- * lead to inaccurate results if not constructed accurately.
  */
 public class SessionParametersCompat {
     @NonNull
diff --git a/camera/camera-lifecycle/build.gradle b/camera/camera-lifecycle/build.gradle
index 6bfff41..0be9f4c 100644
--- a/camera/camera-lifecycle/build.gradle
+++ b/camera/camera-lifecycle/build.gradle
@@ -61,12 +61,11 @@
     androidTestImplementation(project(":camera:camera-camera2"))
     androidTestImplementation(project(":camera:camera-camera2-pipe-integration"))
 
-    testImplementation(libs.kotlinCoroutinesTest)
-    testImplementation(libs.kotlinStdlib)
-    testImplementation(libs.testCore)
     testImplementation(libs.testRunner)
     testImplementation(libs.robolectric)
+    testImplementation(libs.kotlinStdlib)
     testImplementation(libs.truth)
+    testImplementation(libs.testCore)
     testImplementation("org.jetbrains.kotlinx:atomicfu:0.13.1")
     testImplementation(project(":internal-testutils-truth"))
     testImplementation(project(":camera:camera-testing")) {
diff --git a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraProviderImpl.kt b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraProviderImpl.kt
index 18b730aa..9e09db7e 100644
--- a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraProviderImpl.kt
+++ b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraProviderImpl.kt
@@ -109,7 +109,7 @@
                     }
 
                     override fun onFailure(t: Throwable) {
-                        shutdownAsync(clearConfigProvider = false)
+                        shutdownAsync()
                     }
                 },
                 CameraXExecutors.directExecutor()
@@ -140,7 +140,7 @@
             }
         }
 
-    internal fun shutdownAsync(clearConfigProvider: Boolean = true): ListenableFuture<Void> {
+    internal fun shutdownAsync(): ListenableFuture<Void> {
         Threads.runOnMainSync {
             unbindAll()
             lifecycleCameraRepository.removeLifecycleCameras(lifecycleCameraKeys)
@@ -154,9 +154,7 @@
             if (cameraX != null) cameraX!!.shutdown() else Futures.immediateFuture<Void>(null)
 
         synchronized(lock) {
-            if (clearConfigProvider) {
-                cameraXConfigProvider = null
-            }
+            cameraXConfigProvider = null
             cameraXInitializeFuture = null
             cameraXShutdownFuture = shutdownFuture
             cameraInfoMap.clear()
diff --git a/camera/camera-lifecycle/src/test/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt b/camera/camera-lifecycle/src/test/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
deleted file mode 100644
index 3bd5a89..0000000
--- a/camera/camera-lifecycle/src/test/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.lifecycle
-
-import android.content.Context
-import android.content.pm.PackageManager
-import android.os.Build
-import android.os.Handler
-import android.os.Looper
-import android.os.SystemClock
-import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraXConfig
-import androidx.camera.core.InitializationException
-import androidx.camera.core.impl.CameraDeviceSurfaceManager
-import androidx.camera.core.impl.CameraFactory
-import androidx.camera.core.impl.CameraFactory.Provider
-import androidx.camera.core.impl.CameraThreadConfig
-import androidx.camera.core.impl.UseCaseConfigFactory
-import androidx.camera.testing.fakes.FakeCamera
-import androidx.camera.testing.fakes.FakeCameraInfoInternal
-import androidx.camera.testing.impl.fakes.FakeCameraCoordinator
-import androidx.camera.testing.impl.fakes.FakeCameraDeviceSurfaceManager
-import androidx.camera.testing.impl.fakes.FakeCameraFactory
-import androidx.camera.testing.impl.fakes.FakeUseCaseConfigFactory
-import androidx.concurrent.futures.await
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.core.internal.os.HandlerExecutor
-import androidx.testutils.assertThrows
-import java.util.concurrent.TimeUnit
-import kotlinx.coroutines.Deferred
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.async
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.currentTime
-import kotlinx.coroutines.test.runTest
-import org.junit.After
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.robolectric.RobolectricTestRunner
-import org.robolectric.Shadows.shadowOf
-import org.robolectric.annotation.Config
-import org.robolectric.annotation.internal.DoNotInstrument
-import org.robolectric.shadows.ShadowPackageManager
-import org.robolectric.shadows.ShadowSystemClock
-
-@RunWith(RobolectricTestRunner::class)
-@DoNotInstrument
-@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
-@OptIn(ExperimentalCoroutinesApi::class)
-class ProcessCameraProviderTest {
-
-    private val context = ApplicationProvider.getApplicationContext<Context>()
-    private val handler = Handler(Looper.getMainLooper()) // Same to the looper of TestScope
-    private val handlerExecutor = HandlerExecutor(handler)
-    private lateinit var shadowPackageManager: ShadowPackageManager
-    private var repeatingJob: Deferred<Unit>? = null
-
-    @Before
-    fun setUp() {
-        // This test asserts both the type of the exception thrown, and the type of the cause of the
-        // exception thrown in many cases. The Kotlin stacktrace recovery feature is useful for
-        // debugging, but it inserts exceptions into the `cause` chain and interferes with this
-        // test.
-        System.setProperty("kotlinx.coroutines.stacktrace.recovery", false.toString())
-        shadowPackageManager = shadowOf(context.packageManager)
-        shadowPackageManager.setSystemFeature(PackageManager.FEATURE_CAMERA, true)
-        shadowPackageManager.setSystemFeature(PackageManager.FEATURE_CAMERA_FRONT, true)
-    }
-
-    @After
-    fun tearDown() {
-        repeatingJob?.cancel()
-    }
-
-    @Test
-    fun processCameraProviderFail_retainCameraConfig() = runTest {
-        // Arrange
-        val configBuilder: CameraXConfig.Builder =
-            CameraXConfig.Builder.fromConfig(
-                    createCameraXConfig(
-                        cameraFactory =
-                            createFakeCameraFactory(frontCamera = false, backCamera = false)
-                    )
-                )
-                .apply {
-                    setCameraExecutor(handlerExecutor)
-                    setSchedulerHandler(handler)
-                }
-
-        // Simulate the system time increases.
-        repeatingJob = simulateSystemTimeIncrease()
-
-        ProcessCameraProvider.configureInstance(configBuilder.build())
-
-        // Act
-        assertThrows<InitializationException> { ProcessCameraProvider.getInstance(context).await() }
-
-        // Assert
-        // When retrying ProcessCameraProvider#getInstance, it should be able to try without calling
-        // configureInstance again.
-        assertThrows<InitializationException> { ProcessCameraProvider.getInstance(context).await() }
-    }
-
-    private fun createCameraXConfig(
-        cameraFactory: CameraFactory = createFakeCameraFactory(),
-        surfaceManager: CameraDeviceSurfaceManager? = FakeCameraDeviceSurfaceManager(),
-        useCaseConfigFactory: UseCaseConfigFactory? = FakeUseCaseConfigFactory()
-    ): CameraXConfig {
-        val cameraFactoryProvider =
-            Provider { _: Context?, _: CameraThreadConfig?, _: CameraSelector?, _: Long ->
-                cameraFactory
-            }
-        return CameraXConfig.Builder()
-            .setCameraFactoryProvider(cameraFactoryProvider)
-            .apply {
-                surfaceManager?.let {
-                    setDeviceSurfaceManagerProvider { _: Context?, _: Any?, _: Set<String?>? -> it }
-                }
-                useCaseConfigFactory?.let { setUseCaseConfigFactoryProvider { _: Context? -> it } }
-            }
-            .build()
-    }
-
-    private fun createFakeCameraFactory(
-        frontCamera: Boolean = false,
-        backCamera: Boolean = false,
-    ): CameraFactory =
-        FakeCameraFactory(null).also { cameraFactory ->
-            if (backCamera) {
-                cameraFactory.insertCamera(CameraSelector.LENS_FACING_BACK, CAMERA_ID_0) {
-                    FakeCamera(
-                        CAMERA_ID_0,
-                        null,
-                        FakeCameraInfoInternal(CAMERA_ID_0, 0, CameraSelector.LENS_FACING_BACK)
-                    )
-                }
-            }
-            if (frontCamera) {
-                cameraFactory.insertCamera(CameraSelector.LENS_FACING_FRONT, CAMERA_ID_1) {
-                    FakeCamera(
-                        CAMERA_ID_1,
-                        null,
-                        FakeCameraInfoInternal(CAMERA_ID_1, 0, CameraSelector.LENS_FACING_FRONT)
-                    )
-                }
-            }
-            cameraFactory.cameraCoordinator = FakeCameraCoordinator()
-        }
-
-    private fun TestScope.simulateSystemTimeIncrease() = async {
-        val startTimeMs = SystemClock.elapsedRealtime()
-        while (SystemClock.elapsedRealtime() - startTimeMs < 20000L) {
-            shadowOf(handler.looper).idle()
-            if (SystemClock.elapsedRealtime() < currentTime) {
-                ShadowSystemClock.advanceBy(
-                    currentTime - SystemClock.elapsedRealtime(),
-                    TimeUnit.MILLISECONDS
-                )
-            }
-            delay(FAKE_INIT_PROCESS_TIME_MS)
-        }
-    }
-
-    companion object {
-        private const val CAMERA_ID_0 = "0"
-        private const val CAMERA_ID_1 = "1"
-        private const val FAKE_INIT_PROCESS_TIME_MS = 33L
-    }
-}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/impl/IgnoreVideoRecordingProblematicDeviceRule.kt b/camera/camera-testing/src/main/java/androidx/camera/testing/impl/IgnoreVideoRecordingProblematicDeviceRule.kt
index 425c371..7a5c337 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/impl/IgnoreVideoRecordingProblematicDeviceRule.kt
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/impl/IgnoreVideoRecordingProblematicDeviceRule.kt
@@ -36,9 +36,8 @@
         public fun skipVideoRecordingTestIfNotSupportedByEmulator() {
             // Skip test for b/168175357, b/233661493
             Assume.assumeFalse(
-                "Skip tests for Cuttlefish MediaCodec issues",
-                Build.MODEL.contains("Cuttlefish") &&
-                    (Build.VERSION.SDK_INT == 29 || Build.VERSION.SDK_INT == 33)
+                "Cuttlefish has MediaCodec dequeInput/Output buffer fails issue. Unable to test.",
+                Build.MODEL.contains("Cuttlefish") && Build.VERSION.SDK_INT == 29
             )
             // Skip test for b/268102904
             Assume.assumeFalse(
diff --git a/camera/camera-video/dependencyAnalysis-baseline.json b/camera/camera-video/dependencyAnalysis-baseline.json
index 670f23e..2f942e0 100644
--- a/camera/camera-video/dependencyAnalysis-baseline.json
+++ b/camera/camera-video/dependencyAnalysis-baseline.json
@@ -15,7 +15,7 @@
         "identifier": "androidx.arch.core:core-common",
         "resolvedVersion": "2.1.0"
       },
-      "toConfiguration": "testImplementation"
+      "toConfiguration": "api"
     },
     {
       "coordinates": {
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 b6e8894..3f0a91b 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
@@ -49,12 +49,12 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.lifecycle.awaitInstance
+import androidx.camera.testing.impl.AndroidUtil.isEmulator
 import androidx.camera.testing.impl.AudioUtil
 import androidx.camera.testing.impl.CameraPipeConfigTestRule
 import androidx.camera.testing.impl.CameraUtil
 import androidx.camera.testing.impl.ExtensionsUtil
 import androidx.camera.testing.impl.GarbageCollectionUtil
-import androidx.camera.testing.impl.IgnoreVideoRecordingProblematicDeviceRule
 import androidx.camera.testing.impl.LabTestRule
 import androidx.camera.testing.impl.SurfaceTextureProvider
 import androidx.camera.testing.impl.asFlow
@@ -120,7 +120,6 @@
 import org.junit.Test
 import org.junit.rules.TemporaryFolder
 import org.junit.rules.TestName
-import org.junit.rules.TestRule
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 import org.mockito.ArgumentMatchers.argThat
@@ -169,8 +168,6 @@
             Manifest.permission.RECORD_AUDIO
         )
 
-    @get:Rule val skipRule: TestRule = IgnoreVideoRecordingProblematicDeviceRule()
-
     @get:Rule val labTest: LabTestRule = LabTestRule()
 
     companion object {
@@ -195,7 +192,30 @@
 
     @Before
     fun setUp() = runBlocking {
+        // Skip for b/264902324
+        assumeFalse(
+            "Emulator API 30 crashes running this test.",
+            Build.VERSION.SDK_INT == 30 && isEmulator()
+        )
+
+        // Skip for b/399704074
+        assumeFalse(
+            "Emulator API 26 crashes running this test.",
+            Build.VERSION.SDK_INT == 26 && isEmulator()
+        )
+
         assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
+        // Skip for b/168175357, b/233661493
+        assumeFalse(
+            "Skip tests for Cuttlefish MediaCodec issues",
+            Build.MODEL.contains("Cuttlefish") &&
+                (Build.VERSION.SDK_INT == 29 || Build.VERSION.SDK_INT == 33)
+        )
+        // Skip for b/331618729
+        assumeFalse(
+            "Emulator API 28 crashes running this test.",
+            Build.VERSION.SDK_INT == 28 && isEmulator()
+        )
         // Skip for b/241876294
         assumeFalse(
             "Skip test for devices with ExtraSupportedResolutionQuirk, since the extra" +
@@ -203,6 +223,8 @@
             DeviceQuirks.get(ExtraSupportedResolutionQuirk::class.java) != null
         )
         assumeTrue(AudioUtil.canStartAudioRecord(MediaRecorder.AudioSource.CAMCORDER))
+        // Skip for b/331618729
+        assumeNotBrokenEmulator()
 
         ProcessCameraProvider.configureInstance(cameraConfig)
         cameraProvider = ProcessCameraProvider.awaitInstance(context)
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoTestingUtil.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoTestingUtil.kt
index 5b74507..e5e9d50 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoTestingUtil.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoTestingUtil.kt
@@ -74,6 +74,13 @@
     )
 }
 
+fun assumeNotBrokenEmulator() {
+    assumeFalse(
+        "Skip tests for Emulator API 30 crashing issue",
+        Build.MODEL.contains("gphone") && Build.VERSION.SDK_INT == 30
+    )
+}
+
 fun getRotationNeeded(videoCapture: VideoCapture<Recorder>, cameraInfo: CameraInfo) =
     cameraInfo.getSensorRotationDegrees(videoCapture.targetRotation)
 
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/camera2/CameraControlDeviceTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/camera2/CameraControlDeviceTest.kt
index cb0508e..812d501 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/camera2/CameraControlDeviceTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/camera2/CameraControlDeviceTest.kt
@@ -158,7 +158,7 @@
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
     fun setTorchStrengthLevel_torchEnabled_futureCompletes() {
-        assumeTrue(cameraProvider.getCameraInfo(cameraSelector).isTorchStrengthSupported)
+        assumeTrue(CameraUtil.hasFlashUnitWithLensFacing(cameraSelector.lensFacing!!))
 
         bindUseCases()
 
@@ -171,7 +171,7 @@
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
     fun setTorchStrengthLevel_torchDisabled_futureCompletes() {
-        assumeTrue(cameraProvider.getCameraInfo(cameraSelector).isTorchStrengthSupported)
+        assumeTrue(CameraUtil.hasFlashUnitWithLensFacing(cameraSelector.lensFacing!!))
 
         bindUseCases()
 
@@ -183,7 +183,7 @@
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
     fun setTorchStrengthLevel_throwExceptionIfLessThanOne() {
-        assumeTrue(cameraProvider.getCameraInfo(cameraSelector).isTorchStrengthSupported)
+        assumeTrue(CameraUtil.hasFlashUnitWithLensFacing(cameraSelector.lensFacing!!))
 
         bindUseCases()
 
@@ -202,7 +202,7 @@
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
     fun setTorchStrengthLevel_throwExceptionIfLargerThanMax() {
-        assumeTrue(cameraProvider.getCameraInfo(cameraSelector).isTorchStrengthSupported)
+        assumeTrue(CameraUtil.hasFlashUnitWithLensFacing(cameraSelector.lensFacing!!))
 
         bindUseCases()
 
@@ -223,6 +223,8 @@
     @Test
     @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM - 1)
     fun setTorchStrengthLevel_throwExceptionWhenApiNotMet() {
+        assumeTrue(CameraUtil.hasFlashUnitWithLensFacing(cameraSelector.lensFacing!!))
+
         bindUseCases()
 
         try {
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/camera2/PreviewTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/camera2/PreviewTest.kt
index d4091f4..02c8e56 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/camera2/PreviewTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/camera2/PreviewTest.kt
@@ -1537,8 +1537,6 @@
     @Test
     @SdkSuppress(minSdkVersion = 21, maxSdkVersion = 32)
     fun setMirrorModeIsNoOp_priorToAPI33() = runBlocking {
-        // Skip for b/404348154
-        assumeFalse("Skip test for API 26.", Build.VERSION.SDK_INT == 26)
         verifyMirrorMode(
             CameraSelector.DEFAULT_BACK_CAMERA,
             mirrorMode = MirrorMode.MIRROR_MODE_ON,
diff --git a/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/EffectsFragmentDeviceTest.kt b/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/EffectsFragmentDeviceTest.kt
index c241909..6175a8c 100644
--- a/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/EffectsFragmentDeviceTest.kt
+++ b/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/EffectsFragmentDeviceTest.kt
@@ -17,7 +17,6 @@
 package androidx.camera.integration.view
 
 import android.net.Uri
-import android.os.Build
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.CameraXConfig
@@ -39,7 +38,6 @@
 import java.util.concurrent.Semaphore
 import java.util.concurrent.TimeUnit
 import org.junit.After
-import org.junit.Assume.assumeFalse
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
@@ -108,8 +106,6 @@
 
     @Test
     fun toggleCameraLatencyTest() {
-        // Skip for b/404348512
-        assumeFalse("Skip test for API 26.", Build.VERSION.SDK_INT == 26)
         // Arrange: use COMPATIBLE mode to get an accurate measurement.
         instrumentation.runOnMainSync {
             fragment.previewView.implementationMode = PreviewView.ImplementationMode.COMPATIBLE
diff --git a/car/app/app/api/current.txt b/car/app/app/api/current.txt
index c025b1c..f2419f1 100644
--- a/car/app/app/api/current.txt
+++ b/car/app/app/api/current.txt
@@ -1180,21 +1180,17 @@
   }
 
   @SuppressCompatibility @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi public class Badge {
-    method @Deprecated public androidx.car.app.model.CarColor? getBackgroundColor();
-    method public androidx.car.app.model.CarColor? getDotColor();
+    method public androidx.car.app.model.CarColor? getBackgroundColor();
     method public androidx.car.app.model.CarIcon? getIcon();
-    method public androidx.car.app.model.CarColor? getIconBackgroundColor();
     method public boolean hasDot();
   }
 
   public static final class Badge.Builder {
     ctor public Badge.Builder();
     method public androidx.car.app.model.Badge build();
-    method @Deprecated public androidx.car.app.model.Badge.Builder setBackgroundColor(androidx.car.app.model.CarColor);
-    method public androidx.car.app.model.Badge.Builder setDotColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.model.Badge.Builder setBackgroundColor(androidx.car.app.model.CarColor);
     method public androidx.car.app.model.Badge.Builder setHasDot(boolean);
     method public androidx.car.app.model.Badge.Builder setIcon(androidx.car.app.model.CarIcon);
-    method public androidx.car.app.model.Badge.Builder setIconBackgroundColor(androidx.car.app.model.CarColor);
   }
 
   @SuppressCompatibility @androidx.car.app.annotations.CarProtocol public final class CarColor {
@@ -1755,7 +1751,6 @@
     ctor protected Section(androidx.car.app.model.Section.BaseBuilder<T!,? extends java.lang.Object!>);
     method public androidx.car.app.serialization.ListDelegate<T!> getItemsDelegate();
     method public androidx.car.app.model.CarText? getNoItemsMessage();
-    method public androidx.car.app.model.OnItemVisibilityChangedDelegate? getOnItemVisibilityChangedDelegate();
     method public androidx.car.app.model.CarText? getTitle();
   }
 
@@ -1766,7 +1761,6 @@
     method @com.google.errorprone.annotations.CanIgnoreReturnValue public B setItems(java.util.List<T!>);
     method @com.google.errorprone.annotations.CanIgnoreReturnValue public B setNoItemsMessage(androidx.car.app.model.CarText?);
     method @com.google.errorprone.annotations.CanIgnoreReturnValue public B setNoItemsMessage(CharSequence?);
-    method @com.google.errorprone.annotations.CanIgnoreReturnValue public B setOnItemVisibilityChangedListener(androidx.car.app.model.ItemList.OnItemVisibilityChangedListener?);
     method @com.google.errorprone.annotations.CanIgnoreReturnValue public B setTitle(androidx.car.app.model.CarText?);
     method @com.google.errorprone.annotations.CanIgnoreReturnValue public B setTitle(CharSequence?);
   }
diff --git a/car/app/app/api/restricted_current.txt b/car/app/app/api/restricted_current.txt
index c025b1c..f2419f1 100644
--- a/car/app/app/api/restricted_current.txt
+++ b/car/app/app/api/restricted_current.txt
@@ -1180,21 +1180,17 @@
   }
 
   @SuppressCompatibility @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi public class Badge {
-    method @Deprecated public androidx.car.app.model.CarColor? getBackgroundColor();
-    method public androidx.car.app.model.CarColor? getDotColor();
+    method public androidx.car.app.model.CarColor? getBackgroundColor();
     method public androidx.car.app.model.CarIcon? getIcon();
-    method public androidx.car.app.model.CarColor? getIconBackgroundColor();
     method public boolean hasDot();
   }
 
   public static final class Badge.Builder {
     ctor public Badge.Builder();
     method public androidx.car.app.model.Badge build();
-    method @Deprecated public androidx.car.app.model.Badge.Builder setBackgroundColor(androidx.car.app.model.CarColor);
-    method public androidx.car.app.model.Badge.Builder setDotColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.model.Badge.Builder setBackgroundColor(androidx.car.app.model.CarColor);
     method public androidx.car.app.model.Badge.Builder setHasDot(boolean);
     method public androidx.car.app.model.Badge.Builder setIcon(androidx.car.app.model.CarIcon);
-    method public androidx.car.app.model.Badge.Builder setIconBackgroundColor(androidx.car.app.model.CarColor);
   }
 
   @SuppressCompatibility @androidx.car.app.annotations.CarProtocol public final class CarColor {
@@ -1755,7 +1751,6 @@
     ctor protected Section(androidx.car.app.model.Section.BaseBuilder<T!,? extends java.lang.Object!>);
     method public androidx.car.app.serialization.ListDelegate<T!> getItemsDelegate();
     method public androidx.car.app.model.CarText? getNoItemsMessage();
-    method public androidx.car.app.model.OnItemVisibilityChangedDelegate? getOnItemVisibilityChangedDelegate();
     method public androidx.car.app.model.CarText? getTitle();
   }
 
@@ -1766,7 +1761,6 @@
     method @com.google.errorprone.annotations.CanIgnoreReturnValue public B setItems(java.util.List<T!>);
     method @com.google.errorprone.annotations.CanIgnoreReturnValue public B setNoItemsMessage(androidx.car.app.model.CarText?);
     method @com.google.errorprone.annotations.CanIgnoreReturnValue public B setNoItemsMessage(CharSequence?);
-    method @com.google.errorprone.annotations.CanIgnoreReturnValue public B setOnItemVisibilityChangedListener(androidx.car.app.model.ItemList.OnItemVisibilityChangedListener?);
     method @com.google.errorprone.annotations.CanIgnoreReturnValue public B setTitle(androidx.car.app.model.CarText?);
     method @com.google.errorprone.annotations.CanIgnoreReturnValue public B setTitle(CharSequence?);
   }
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Badge.java b/car/app/app/src/main/java/androidx/car/app/model/Badge.java
index 71fff36..06f5c16 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Badge.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Badge.java
@@ -29,19 +29,17 @@
  * Represents a badge that can be displayed as an overlay on top of an image.
  *
  * <p>A badge denotes some sort of call to action, notification, alert, etc. An example is
- * badging of application icons in a launcher to add a number which denotes how many active
- * notifications that application has.
- *
- * <p>Badges may have a dot which is a colored circle appearing in a different location to the icon.
+ * badging of application icons in a launcher to add a number at the top right corner which
+ * denotes how many active notifications that application has.
  */
 @CarProtocol
 @ExperimentalCarApi
 @KeepFields
 public class Badge {
+
     private final boolean mHasDot;
-    private final @Nullable CarColor mDotColor;
+    private final @Nullable CarColor mBackgroundColor;
     private final @Nullable CarIcon mIcon;
-    private final @Nullable CarColor mIconBackgroundColor;
 
     /**
      * Returns whether the badge has a dot.
@@ -53,20 +51,10 @@
     }
 
     /**
-     * Returns the dot color.
-     */
-    public @Nullable CarColor getDotColor() {
-        return mDotColor;
-    }
-
-    /**
      * Returns the dot background color.
-     *
-     * @deprecated use {@link #getDotColor()} instead.
      */
-    @Deprecated
     public @Nullable CarColor getBackgroundColor() {
-        return mDotColor;
+        return mBackgroundColor;
     }
 
     /**
@@ -78,24 +66,16 @@
         return mIcon;
     }
 
-    /**
-     * Returns the icon background color.
-     */
-    public @Nullable CarColor getIconBackgroundColor() {
-        return mIconBackgroundColor;
-    }
-
     @Override
     public @NonNull String toString() {
         return "[hasDot: " + mHasDot
-                + ", dotColor: " + mDotColor
-                + ", icon: " + mIcon
-                + ", iconBackgroundColor: " + mIconBackgroundColor + "]";
+                + ", backgroundColor: " + mBackgroundColor
+                + ", icon: " + mIcon + "]";
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(mHasDot, mDotColor, mIcon, mIconBackgroundColor);
+        return Objects.hash(mHasDot, mBackgroundColor, mIcon);
     }
 
     @Override
@@ -109,35 +89,28 @@
         Badge otherBadge = (Badge) other;
 
         return mHasDot == otherBadge.mHasDot
-                && Objects.equals(mDotColor, otherBadge.mDotColor)
-                && Objects.equals(mIcon, otherBadge.mIcon)
-                && Objects.equals(mIconBackgroundColor, otherBadge.mIconBackgroundColor);
+                && Objects.equals(mBackgroundColor, otherBadge.mBackgroundColor)
+                && Objects.equals(mIcon, otherBadge.mIcon);
     }
 
     Badge(Builder builder) {
         mHasDot = builder.mHasDot;
-        mDotColor = builder.mDotColor;
+        mBackgroundColor = builder.mBackgroundColor;
         mIcon = builder.mIcon;
-        mIconBackgroundColor = builder.mIconBackgroundColor;
     }
 
     /** Constructs an empty instance, used by serialization code. */
     private Badge() {
         mHasDot = false;
-        mDotColor = null;
+        mBackgroundColor = null;
         mIcon = null;
-        mIconBackgroundColor = null;
     }
 
     /** A builder of {@link Badge}. */
     public static final class Builder {
         boolean mHasDot;
-        @Nullable
-        CarColor mDotColor;
-        @Nullable
-        CarIcon mIcon;
-        @Nullable
-        CarColor mIconBackgroundColor;
+        @Nullable CarColor mBackgroundColor;
+        @Nullable CarIcon mIcon;
 
         /**
          * Enables a circular dot that denotes some sort of alert, notification, etc.
@@ -148,21 +121,10 @@
         }
 
         /**
-         * Sets the color of the dot to the given {@code color}.
-         */
-        public @NonNull Builder setDotColor(@NonNull CarColor color) {
-            mDotColor = color;
-            return this;
-        }
-
-        /**
          * Sets the color of the dot to the given {@code backgroundColor}.
-         *
-         * @deprecated use {@link #setDotColor(CarColor)} instead.
          */
-        @Deprecated
         public @NonNull Builder setBackgroundColor(@NonNull CarColor backgroundColor) {
-            mDotColor = backgroundColor;
+            mBackgroundColor = backgroundColor;
             return this;
         }
 
@@ -179,31 +141,16 @@
         }
 
         /**
-         * Sets the color of the icon background to the given {@code color}.
-         */
-        public @NonNull Builder setIconBackgroundColor(@NonNull CarColor color) {
-            mIconBackgroundColor = color;
-            return this;
-        }
-
-        /**
          * Constructs the {@link Badge} defined by this builder.
          *
          * @throws IllegalStateException if the badge doesn't have a dot or an icon.
-         * @throws IllegalStateException if the a dot color is set but the badge has no dot.
-         * @throws IllegalStateException if the a icon background color is set but the badge has
-         * no icon.
          */
         public @NonNull Badge build() {
             if (!mHasDot && mIcon == null) {
                 throw new IllegalStateException("A badge must have a dot or an icon set");
             }
-            if (!mHasDot && mDotColor != null) {
-                throw new IllegalStateException("The dot must be enabled to set the dot "
-                        + "color.");
-            }
-            if (mIcon == null && mIconBackgroundColor != null) {
-                throw new IllegalStateException("The icon must be set to set the icon background "
+            if (!mHasDot && mBackgroundColor != null) {
+                throw new IllegalStateException("The dot must be enabled to set the background "
                         + "color.");
             }
             return new Badge(this);
diff --git a/car/app/app/src/main/java/androidx/car/app/model/ItemList.java b/car/app/app/src/main/java/androidx/car/app/model/ItemList.java
index ac54af1..b109465 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/ItemList.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/ItemList.java
@@ -70,7 +70,7 @@
          *
          * <p>The start index is inclusive, and the end index is exclusive. For example, if only the
          * first item in a list is visible, the start and end indices would be 0 and 1,
-         * respectively.
+         * respectively. If no items are visible, the indices will be set to -1.
          *
          * @param startIndex the index of the first item that is visible
          * @param endIndex   the index of the first item that is not visible after the visible
diff --git a/car/app/app/src/main/java/androidx/car/app/model/OnItemVisibilityChangedDelegate.java b/car/app/app/src/main/java/androidx/car/app/model/OnItemVisibilityChangedDelegate.java
index 7325995..f8ee0ba 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/OnItemVisibilityChangedDelegate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/OnItemVisibilityChangedDelegate.java
@@ -34,10 +34,12 @@
      *
      * <p>The start index is inclusive, and the end index is exclusive. For example, if only the
      * first item in a list is visible, the start and end indices would be 0 and 1,
-     * respectively.
+     * respectively. If no items are visible, the indices will be set to -1.
      *
-     * @param startIndex the index (inclusive) of the first visible element
-     * @param endIndex   the index (exclusive) of the last visible element
+     * @param startIndex the index (inclusive) of the first visible element, or -1 if no items
+     *                   are visible
+     * @param endIndex   the index (exclusive) of the last visible element, or -1 if no items
+     *                   are visible
      * @param callback   the {@link OnDoneCallback} to trigger when the client finishes handling
      *                   the event
      */
diff --git a/car/app/app/src/main/java/androidx/car/app/model/OnItemVisibilityChangedDelegateImpl.java b/car/app/app/src/main/java/androidx/car/app/model/OnItemVisibilityChangedDelegateImpl.java
index 6e3a5a1..a5b0879 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/OnItemVisibilityChangedDelegateImpl.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/OnItemVisibilityChangedDelegateImpl.java
@@ -35,8 +35,8 @@
 import org.jspecify.annotations.Nullable;
 
 /**
- * Implementation class for {@link OnItemVisibilityChangedDelegate} that uses the {@link
- * IOnItemVisibilityChangedListener} binder interface.
+ * Implementation class for {@link OnItemVisibilityChangedDelegate}.
+ *
  */
 @RestrictTo(LIBRARY)
 @CarProtocol
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Section.java b/car/app/app/src/main/java/androidx/car/app/model/Section.java
index 9fa9035..9a119f2 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Section.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Section.java
@@ -16,13 +16,9 @@
 
 package androidx.car.app.model;
 
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-
-import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.KeepFields;
-import androidx.car.app.model.ItemList.OnItemVisibilityChangedListener;
 import androidx.car.app.model.constraints.CarTextConstraints;
 import androidx.car.app.serialization.ListDelegate;
 import androidx.car.app.serialization.ListDelegateImpl;
@@ -50,14 +46,12 @@
     private final @NonNull ListDelegate<T> mItemsDelegate;
     private final @Nullable CarText mTitle;
     private final @Nullable CarText mNoItemsMessage;
-    private final @Nullable OnItemVisibilityChangedDelegate mOnItemVisibilityChangedDelegate;
 
     // Empty constructor for serialization
     protected Section() {
         mItemsDelegate = new ListDelegateImpl<>(Collections.emptyList());
         mTitle = null;
         mNoItemsMessage = null;
-        mOnItemVisibilityChangedDelegate = null;
     }
 
     /** Constructor that fills out fields from any section builder. */
@@ -65,7 +59,6 @@
         mItemsDelegate = new ListDelegateImpl<>(Collections.unmodifiableList(builder.mItems));
         mTitle = builder.mHeader;
         mNoItemsMessage = builder.mNoItemsMessage;
-        mOnItemVisibilityChangedDelegate = builder.mOnItemVisibilityChangedDelegate;
     }
 
     /** Returns the items added to this section. */
@@ -85,14 +78,6 @@
         return mNoItemsMessage;
     }
 
-    /**
-     * Returns the {@link OnItemVisibilityChangedDelegate} to be called when the visible items in
-     * this {@link Section} changes, or {@code null} if one isn't set.
-     */
-    public @Nullable OnItemVisibilityChangedDelegate getOnItemVisibilityChangedDelegate() {
-        return mOnItemVisibilityChangedDelegate;
-    }
-
     @Override
     public boolean equals(@Nullable Object other) {
         if (other == null) {
@@ -103,26 +88,19 @@
         }
         Section<?> section = (Section<?>) other;
 
-        return Objects.equals(mItemsDelegate, section.mItemsDelegate)
-                && Objects.equals(mTitle, section.mTitle)
-                && Objects.equals(mNoItemsMessage, section.mNoItemsMessage)
-                && Objects.equals(mOnItemVisibilityChangedDelegate == null,
-                section.mOnItemVisibilityChangedDelegate == null);
+        return Objects.equals(mItemsDelegate, section.mItemsDelegate) && Objects.equals(mTitle,
+                section.mTitle)
+                && Objects.equals(mNoItemsMessage, section.mNoItemsMessage);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(
-                mItemsDelegate, mTitle, mNoItemsMessage, mOnItemVisibilityChangedDelegate == null);
+        return Objects.hash(mItemsDelegate, mTitle, mNoItemsMessage);
     }
 
     @Override
     public @NonNull String toString() {
-        return "Section { title: " + mTitle
-                + ", noItemsMessage: " + mNoItemsMessage
-                + ", itemsDelegate: " + mItemsDelegate
-                + ", onItemVisibilityChangedDelegate: "
-                + (mOnItemVisibilityChangedDelegate != null);
+        return "Section";
     }
 
     /**
@@ -136,50 +114,10 @@
         @NonNull List<T> mItems = new ArrayList<>();
         @Nullable CarText mHeader;
         @Nullable CarText mNoItemsMessage;
-        @Nullable OnItemVisibilityChangedDelegate mOnItemVisibilityChangedDelegate;
 
         protected BaseBuilder() {
         }
 
-        /**
-         * Sets the {@link OnItemVisibilityChangedListener} to call when the visible items in this
-         * {@link Section} changes.
-         *
-         * <p>Note that the listener relates to UI events and will be executed on the main thread
-         * using {@code Looper#getMainLooper()}.
-         *
-         * <p>It's possible for more than 1 {@link Section} to be visible on the screen at the same
-         * time, in which case, every visible Section's {@link OnItemVisibilityChangedListener}
-         * will be triggered with their respective visible items.
-         *
-         * <p>Passing {@code null} will clear the {@link OnItemVisibilityChangedListener}.
-         */
-        @CanIgnoreReturnValue
-        @SuppressWarnings({"SetterReturnsThis", "unchecked", "ExecutorRegistration"})
-        public @NonNull B setOnItemVisibilityChangedListener(
-                @Nullable OnItemVisibilityChangedListener onItemVisibilityChangedListener) {
-            if (onItemVisibilityChangedListener == null) {
-                mOnItemVisibilityChangedDelegate = null;
-            } else {
-                mOnItemVisibilityChangedDelegate =
-                        OnItemVisibilityChangedDelegateImpl.create(onItemVisibilityChangedListener);
-            }
-            return (B) this;
-        }
-
-        /**
-         * Use {@link #setOnItemVisibilityChangedListener(OnItemVisibilityChangedListener)} instead.
-         */
-        @CanIgnoreReturnValue
-        @SuppressWarnings({"SetterReturnsThis", "unchecked"})
-        @RestrictTo(LIBRARY)
-        public @NonNull B setOnItemVisibilityChangedDelegate(
-                @Nullable OnItemVisibilityChangedDelegate onItemVisibilityChangedDelegate) {
-            mOnItemVisibilityChangedDelegate = onItemVisibilityChangedDelegate;
-            return (B) this;
-        }
-
-
         /** Sets the items for this section, overwriting any other previously set items. */
         @CanIgnoreReturnValue
         @SuppressWarnings({"SetterReturnsThis", "unchecked"})
diff --git a/car/app/app/src/main/java/androidx/car/app/serialization/ListDelegateImpl.kt b/car/app/app/src/main/java/androidx/car/app/serialization/ListDelegateImpl.kt
index 9755d79..628be63 100644
--- a/car/app/app/src/main/java/androidx/car/app/serialization/ListDelegateImpl.kt
+++ b/car/app/app/src/main/java/androidx/car/app/serialization/ListDelegateImpl.kt
@@ -75,10 +75,6 @@
 
     override fun hashCode(): Int = listHashCode
 
-    override fun toString(): String {
-        return "ListDelegate { Size: $size, listHashCode: $listHashCode }"
-    }
-
     private class RemoteListStub<T>(private val mContent: List<T>) : IRemoteList.Stub() {
         @Throws(RemoteException::class)
         override fun requestItemRange(startIndex: Int, endIndex: Int, callback: IOnDoneCallback) {
diff --git a/car/app/app/src/test/java/androidx/car/app/model/BadgeTest.java b/car/app/app/src/test/java/androidx/car/app/model/BadgeTest.java
index cef984f..96b1797 100644
--- a/car/app/app/src/test/java/androidx/car/app/model/BadgeTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/model/BadgeTest.java
@@ -35,22 +35,17 @@
     }
 
     @Test
-    public void build_withIconAndIconBackgroundColor() {
-        Badge b = new Badge.Builder()
-                .setIcon(CarIcon.ALERT)
-                .setIconBackgroundColor(CarColor.GREEN)
-                .build();
+    public void build_withIcon() {
+        Badge b = new Badge.Builder().setIcon(CarIcon.ALERT).build();
 
         assertThat(b.getIcon()).isEqualTo(CarIcon.ALERT);
-        assertThat(b.getIconBackgroundColor()).isEqualTo(CarColor.GREEN);
     }
 
-    @Test
-    public void build_withDotAndDotColor() {
-        Badge b = new Badge.Builder().setHasDot(true).setDotColor(CarColor.PRIMARY).build();
+    public void build_withDotAndBackgroundColor() {
+        Badge b = new Badge.Builder().setHasDot(true).setBackgroundColor(CarColor.PRIMARY).build();
 
         assertThat(b.hasDot()).isEqualTo(true);
-        assertThat(b.getDotColor()).isEqualTo(CarColor.PRIMARY);
+        assertThat(b.getBackgroundColor()).isEqualTo(CarColor.PRIMARY);
     }
 
     @Test
@@ -65,30 +60,22 @@
     }
 
     @Test
-    public void build_setDotColorWithoutDot_ThrowsException() {
+    public void build_setBackgroundColorWithoutDot_ThrowsException() {
         assertThrows(IllegalStateException.class,
                 () -> new Badge.Builder()
                         .setIcon(CarIcon.ALERT)
-                        .setDotColor(CarColor.PRIMARY).build());
-    }
-
-    @Test
-    public void build_setIconBackgroundColorWithoutIcon_ThrowsException() {
-        assertThrows(IllegalStateException.class,
-                () -> new Badge.Builder()
-                        .setHasDot(true)
-                        .setIconBackgroundColor(CarColor.PRIMARY).build());
+                        .setBackgroundColor(CarColor.PRIMARY).build());
     }
 
     @Test
     public void equals() {
         Badge b1 = new Badge.Builder()
                 .setHasDot(true)
-                .setDotColor(CarColor.PRIMARY)
+                .setBackgroundColor(CarColor.PRIMARY)
                 .setIcon(CarIcon.ALERT).build();
         Badge b2 = new Badge.Builder()
                 .setHasDot(true)
-                .setDotColor(CarColor.PRIMARY)
+                .setBackgroundColor(CarColor.PRIMARY)
                 .setIcon(CarIcon.ALERT).build();
 
         assertThat(b1.equals(b2)).isTrue();
@@ -103,9 +90,9 @@
     }
 
     @Test
-    public void notEquals_differentDotColor() {
-        Badge b1 = new Badge.Builder().setHasDot(true).setDotColor(CarColor.BLUE).build();
-        Badge b2 = new Badge.Builder().setHasDot(true).setDotColor(CarColor.RED).build();
+    public void notEquals_differentBackgroundColor() {
+        Badge b1 = new Badge.Builder().setHasDot(true).setBackgroundColor(CarColor.BLUE).build();
+        Badge b2 = new Badge.Builder().setHasDot(true).setBackgroundColor(CarColor.RED).build();
 
         assertThat(b1.equals(b2)).isFalse();
     }
@@ -122,7 +109,6 @@
     public void string() {
         Badge b = new Badge.Builder().setHasDot(true).build();
 
-        assertThat(b.toString()).isEqualTo(
-                "[hasDot: true, dotColor: null, icon: null, iconBackgroundColor: null]");
+        assertThat(b.toString()).isEqualTo("[hasDot: true, backgroundColor: null, icon: null]");
     }
 }
diff --git a/car/app/app/src/test/java/androidx/car/app/model/SectionTest.kt b/car/app/app/src/test/java/androidx/car/app/model/SectionTest.kt
index de5ed10..1a96fb0 100644
--- a/car/app/app/src/test/java/androidx/car/app/model/SectionTest.kt
+++ b/car/app/app/src/test/java/androidx/car/app/model/SectionTest.kt
@@ -68,13 +68,6 @@
     }
 
     @Test
-    fun getOnItemVisibilityChangedDelegate() {
-        val section = TestSection.Builder().setOnItemVisibilityChangedListener { _, _ -> }.build()
-
-        assertThat(section.onItemVisibilityChangedDelegate).isNotNull()
-    }
-
-    @Test
     fun setTitleCarText_throwsException_whenMoreThanJustText() {
         try {
             // #setTitle(CarText)
@@ -133,7 +126,6 @@
                 .addItem(TestItem(2))
                 .setNoItemsMessage("Some message")
                 .setTitle("some title")
-                .setOnItemVisibilityChangedListener { _, _ -> }
                 .build()
 
         @Suppress("ReplaceCallWithBinaryOperator") assertThat(section.equals(section)).isTrue()
@@ -147,7 +139,6 @@
                 .addItem(TestItem(2))
                 .setNoItemsMessage("Some message")
                 .setTitle("some title")
-                .setOnItemVisibilityChangedListener { _, _ -> }
                 .build()
         val section2 =
             TestSection.Builder()
@@ -155,7 +146,6 @@
                 .addItem(TestItem(2))
                 .setNoItemsMessage("Some message")
                 .setTitle("some title")
-                .setOnItemVisibilityChangedListener { _, _ -> }
                 .build()
 
         // Is symmetric
@@ -171,8 +161,7 @@
                 TestSection.Builder().addItem(TestItem(1)).build(),
                 TestSection.Builder().addItem(TestItem(2)).build(),
                 TestSection.Builder().setTitle("title").build(),
-                TestSection.Builder().setNoItemsMessage("no items").build(),
-                TestSection.Builder().setOnItemVisibilityChangedListener { _, _ -> }.build(),
+                TestSection.Builder().setNoItemsMessage("no items").build()
             )
 
         // Test all different sections against each other
diff --git a/compose/foundation/foundation/api/current.txt b/compose/foundation/foundation/api/current.txt
index 657468f..e5b55ce 100644
--- a/compose/foundation/foundation/api/current.txt
+++ b/compose/foundation/foundation/api/current.txt
@@ -1173,7 +1173,7 @@
 
   public final class LazyLayoutCacheWindowKt {
     method @SuppressCompatibility @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow LazyLayoutCacheWindow(optional float ahead, optional float behind);
-    method @SuppressCompatibility @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow LazyLayoutCacheWindow(optional @FloatRange(from=0.0) float aheadFraction, optional @FloatRange(from=0.0) float behindFraction);
+    method @SuppressCompatibility @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow LazyLayoutCacheWindow(optional float aheadFraction, optional float behindFraction);
   }
 
   public abstract class LazyLayoutIntervalContent<Interval extends androidx.compose.foundation.lazy.layout.LazyLayoutIntervalContent.Interval> {
@@ -1244,10 +1244,8 @@
   }
 
   public static interface LazyLayoutPrefetchState.LazyLayoutPrefetchResultScope {
-    method public int getIndex();
     method public int getPlaceablesCount();
-    method public long getSize(int placeableIndex);
-    property public abstract int index;
+    method public long getSize(int index);
     property public abstract int placeablesCount;
   }
 
diff --git a/compose/foundation/foundation/api/restricted_current.txt b/compose/foundation/foundation/api/restricted_current.txt
index 0858d2f..d69a9eb 100644
--- a/compose/foundation/foundation/api/restricted_current.txt
+++ b/compose/foundation/foundation/api/restricted_current.txt
@@ -1175,7 +1175,7 @@
 
   public final class LazyLayoutCacheWindowKt {
     method @SuppressCompatibility @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow LazyLayoutCacheWindow(optional float ahead, optional float behind);
-    method @SuppressCompatibility @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow LazyLayoutCacheWindow(optional @FloatRange(from=0.0) float aheadFraction, optional @FloatRange(from=0.0) float behindFraction);
+    method @SuppressCompatibility @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow LazyLayoutCacheWindow(optional float aheadFraction, optional float behindFraction);
   }
 
   public abstract class LazyLayoutIntervalContent<Interval extends androidx.compose.foundation.lazy.layout.LazyLayoutIntervalContent.Interval> {
@@ -1246,10 +1246,8 @@
   }
 
   public static interface LazyLayoutPrefetchState.LazyLayoutPrefetchResultScope {
-    method public int getIndex();
     method public int getPlaceablesCount();
-    method public long getSize(int placeableIndex);
-    property public abstract int index;
+    method public long getSize(int index);
     property public abstract int placeablesCount;
   }
 
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/build.gradle b/compose/foundation/foundation/integration-tests/foundation-demos/build.gradle
index 732a93e..f278819 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/build.gradle
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/build.gradle
@@ -26,7 +26,7 @@
     implementation("androidx.core:core:1.12.0")
     implementation(libs.kotlinStdlib)
 
-    implementation("androidx.activity:activity-compose:1.10.1")
+    implementation(project(":activity:activity-compose"))
     implementation(project(":compose:animation:animation"))
     implementation(project(":compose:foundation:foundation"))
     implementation(project(":compose:foundation:foundation:foundation-samples"))
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestureTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestureTest.kt
index 0b9eb60..1a0200b 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestureTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestureTest.kt
@@ -16,25 +16,34 @@
 
 package androidx.compose.foundation.contextmenu
 
+import androidx.compose.foundation.background
 import androidx.compose.foundation.contextmenu.ContextMenuState.Status
 import androidx.compose.foundation.gestures.awaitEachGesture
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.text.selection.assertThatOffset
+import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.input.pointer.PointerEventType
+import androidx.compose.ui.input.pointer.PointerInputScope
 import androidx.compose.ui.input.pointer.changedToDown
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.MouseButton
+import androidx.compose.ui.test.click
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.performMouseInput
 import androidx.compose.ui.test.rightClick
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.util.fastAll
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMap
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
@@ -49,6 +58,7 @@
 
     private val tag = "testTag"
 
+    // region Modifier.contextMenuGestures Tests
     @Test
     fun whenContextMenuGestures_thenRightClick_isOpenAtOffset() {
         val state = ContextMenuState()
@@ -109,4 +119,115 @@
         assertThatContextMenuState(state).statusIsOpen()
         assertThat(pressCount).isEqualTo(2)
     }
+
+    // endregion Modifier.contextMenuGestures Tests
+
+    // region PointerInputScope.onRightClickDown Tests
+    @Composable
+    private fun TestRightClickBox(
+        onClick: (Offset) -> Unit,
+    ) {
+        Box(
+            modifier =
+                Modifier.background(Color.LightGray).size(100.dp).testTag(tag).pointerInput(Unit) {
+                    onRightClickDown(onClick)
+                }
+        )
+    }
+
+    @Test
+    fun whenOnRightClickDown_rightClick_doesTriggerWithCorrectOffset() {
+        var clickCount = 0
+        val expectedOffset = Offset(10f, 10f)
+        rule.setContent {
+            TestRightClickBox {
+                assertThatOffset(it).equalsWithTolerance(expectedOffset)
+                clickCount++
+            }
+        }
+        rule.onNodeWithTag(tag).performMouseInput { rightClick(expectedOffset) }
+        assertThat(clickCount).isEqualTo(1)
+    }
+
+    @Test
+    fun whenOnRightClickDown_leftClick_doesNotTrigger() {
+        var clickCount = 0
+        rule.setContent { TestRightClickBox { clickCount++ } }
+        rule.onNodeWithTag(tag).performMouseInput { click() }
+        assertThat(clickCount).isEqualTo(0)
+    }
+
+    @Test
+    fun whenOnRightClickDown_triggersOnPressAndNotOnRelease() {
+        var clickCount = 0
+        rule.setContent { TestRightClickBox { clickCount++ } }
+        val interaction = rule.onNodeWithTag(tag)
+
+        interaction.performMouseInput {
+            updatePointerTo(center)
+            press(MouseButton.Secondary)
+        }
+        assertThat(clickCount).isEqualTo(1)
+
+        interaction.performMouseInput { release(MouseButton.Secondary) }
+        assertThat(clickCount).isEqualTo(1)
+    }
+
+    @Test
+    fun whenOnRightClickDown_alreadyConsumed_doesNotTrigger() {
+        var clickCount = 0
+        rule.setContent {
+            Box(modifier = Modifier.pointerInput(Unit) { onRightClickDown { clickCount++ } }) {
+                Box(
+                    modifier =
+                        Modifier.background(Color.LightGray).size(100.dp).testTag(tag).pointerInput(
+                            Unit
+                        ) {
+                            awaitPointerEventScope {
+                                while (true) {
+                                    awaitPointerEvent().changes.fastForEach { it.consume() }
+                                }
+                            }
+                        }
+                )
+            }
+        }
+
+        rule.onNodeWithTag(tag).performMouseInput { rightClick() }
+        assertThat(clickCount).isEqualTo(0)
+    }
+
+    @Test
+    fun whenOnRightClickDown_consumesRightClickPressAndRelease() {
+        suspend fun PointerInputScope.assertCorrectlyConsumed() {
+            awaitPointerEventScope {
+                while (true) {
+                    val event = awaitPointerEvent()
+                    assertThat(event.changes.fastMap { it.isConsumed }.toSet()).run {
+                        when (event.type) {
+                            PointerEventType.Press,
+                            PointerEventType.Release -> containsExactly(true)
+                            else -> containsExactly(false)
+                        }
+                    }
+                }
+            }
+        }
+
+        rule.setContent {
+            Box(modifier = Modifier.pointerInput(Unit) { assertCorrectlyConsumed() }) {
+                Box(
+                    modifier =
+                        Modifier.background(Color.LightGray).size(100.dp).testTag(tag).pointerInput(
+                            Unit
+                        ) {
+                            onRightClickDown { /* Nothing */ }
+                        }
+                )
+            }
+        }
+
+        rule.onNodeWithTag(tag).performMouseInput { rightClick() }
+    }
+    // endregion PointerInputScope.onRightClickDown Tests
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/MinLinesMemoryLeakTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/MinLinesMemoryLeakTest.kt
index 9c35133..c516566 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/MinLinesMemoryLeakTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/MinLinesMemoryLeakTest.kt
@@ -41,18 +41,11 @@
         // issues for other tests that use leak canary
         private lateinit var savedLeakCanaryConfig: LeakCanary.Config
 
-        private val IgnoreFrameTrackerLeaks =
-            listOf(
-                AndroidReferenceMatchers.instanceFieldLeak(
-                    className = "com.android.internal.jank.FrameTracker",
-                    fieldName = "mConfig",
-                    "Ignoring a leak due to misconfigured framework jank tracking b/349355283"
-                ),
-                AndroidReferenceMatchers.instanceFieldLeak(
-                    className = "com.android.internal.jank.FrameTracker",
-                    fieldName = "mListener",
-                    "Ignoring a leak due to misconfigured framework jank tracking b/349355283"
-                )
+        private val IgnoreFrameTrackerLeak =
+            AndroidReferenceMatchers.instanceFieldLeak(
+                className = "com.android.internal.jank.FrameTracker",
+                fieldName = "mConfig",
+                "Ignoring a leak due to misconfigured framework jank tracking b/349355283"
             )
 
         @JvmStatic
@@ -61,9 +54,7 @@
             val current = LeakCanary.config
             savedLeakCanaryConfig = current
             LeakCanary.config =
-                current.copy(
-                    referenceMatchers = current.referenceMatchers + IgnoreFrameTrackerLeaks
-                )
+                current.copy(referenceMatchers = current.referenceMatchers + IgnoreFrameTrackerLeak)
         }
 
         @JvmStatic
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/contextmenu/gestures/RightClickGesturesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/contextmenu/gestures/RightClickGesturesTest.kt
deleted file mode 100644
index 4e76868..0000000
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/contextmenu/gestures/RightClickGesturesTest.kt
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.foundation.text.contextmenu.gestures
-
-import androidx.compose.foundation.background
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.text.selection.assertThatOffset
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.input.pointer.PointerEventType
-import androidx.compose.ui.input.pointer.PointerInputScope
-import androidx.compose.ui.input.pointer.pointerInput
-import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.test.MouseButton
-import androidx.compose.ui.test.click
-import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.test.onNodeWithTag
-import androidx.compose.ui.test.performMouseInput
-import androidx.compose.ui.test.rightClick
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.util.fastForEach
-import androidx.compose.ui.util.fastMap
-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
-
-@RunWith(AndroidJUnit4::class)
-@MediumTest
-class OnRightClickDownTest {
-    @get:Rule val rule = createComposeRule()
-
-    private val tag = "testTag"
-
-    @Composable
-    private fun TestRightClickBox(
-        onClick: (Offset) -> Unit,
-    ) {
-        Box(
-            modifier =
-                Modifier.background(Color.LightGray).size(100.dp).testTag(tag).pointerInput(Unit) {
-                    onRightClickDown(onClick)
-                }
-        )
-    }
-
-    @Test
-    fun whenOnRightClickDown_rightClick_doesTriggerWithCorrectOffset() {
-        var clickCount = 0
-        val expectedOffset = Offset(10f, 10f)
-        rule.setContent {
-            TestRightClickBox {
-                assertThatOffset(it).equalsWithTolerance(expectedOffset)
-                clickCount++
-            }
-        }
-        rule.onNodeWithTag(tag).performMouseInput { rightClick(expectedOffset) }
-        assertThat(clickCount).isEqualTo(1)
-    }
-
-    @Test
-    fun whenOnRightClickDown_leftClick_doesNotTrigger() {
-        var clickCount = 0
-        rule.setContent { TestRightClickBox { clickCount++ } }
-        rule.onNodeWithTag(tag).performMouseInput { click() }
-        assertThat(clickCount).isEqualTo(0)
-    }
-
-    @Test
-    fun whenOnRightClickDown_triggersOnPressAndNotOnRelease() {
-        var clickCount = 0
-        rule.setContent { TestRightClickBox { clickCount++ } }
-        val interaction = rule.onNodeWithTag(tag)
-
-        interaction.performMouseInput {
-            updatePointerTo(center)
-            press(MouseButton.Secondary)
-        }
-        assertThat(clickCount).isEqualTo(1)
-
-        interaction.performMouseInput { release(MouseButton.Secondary) }
-        assertThat(clickCount).isEqualTo(1)
-    }
-
-    @Test
-    fun whenOnRightClickDown_alreadyConsumed_doesNotTrigger() {
-        var clickCount = 0
-        rule.setContent {
-            Box(modifier = Modifier.pointerInput(Unit) { onRightClickDown { clickCount++ } }) {
-                Box(
-                    modifier =
-                        Modifier.background(Color.LightGray).size(100.dp).testTag(tag).pointerInput(
-                            Unit
-                        ) {
-                            awaitPointerEventScope {
-                                while (true) {
-                                    awaitPointerEvent().changes.fastForEach { it.consume() }
-                                }
-                            }
-                        }
-                )
-            }
-        }
-
-        rule.onNodeWithTag(tag).performMouseInput { rightClick() }
-        assertThat(clickCount).isEqualTo(0)
-    }
-
-    @Test
-    fun whenOnRightClickDown_consumesRightClickPressAndRelease() {
-        suspend fun PointerInputScope.assertCorrectlyConsumed() {
-            awaitPointerEventScope {
-                while (true) {
-                    val event = awaitPointerEvent()
-                    assertThat(event.changes.fastMap { it.isConsumed }.toSet()).run {
-                        when (event.type) {
-                            PointerEventType.Press,
-                            PointerEventType.Release -> containsExactly(true)
-                            else -> containsExactly(false)
-                        }
-                    }
-                }
-            }
-        }
-
-        rule.setContent {
-            Box(modifier = Modifier.pointerInput(Unit) { assertCorrectlyConsumed() }) {
-                Box(
-                    modifier =
-                        Modifier.background(Color.LightGray).size(100.dp).testTag(tag).pointerInput(
-                            Unit
-                        ) {
-                            onRightClickDown { /* Nothing */ }
-                        }
-                )
-            }
-        }
-
-        rule.onNodeWithTag(tag).performMouseInput { rightClick() }
-    }
-}
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/contextmenu/modifier/TextContextMenuGesturesModifierTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/contextmenu/modifier/TextContextMenuGesturesModifierTest.kt
deleted file mode 100644
index e9abef8..0000000
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/contextmenu/modifier/TextContextMenuGesturesModifierTest.kt
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.foundation.text.contextmenu.modifier
-
-import androidx.compose.foundation.background
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.offset
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.text.contextmenu.builder.TextContextMenuBuilderScope
-import androidx.compose.foundation.text.contextmenu.data.TextContextMenuSession
-import androidx.compose.foundation.text.contextmenu.provider.LocalTextContextMenuDropdownProvider
-import androidx.compose.foundation.text.contextmenu.provider.TextContextMenuDataProvider
-import androidx.compose.foundation.text.contextmenu.provider.TextContextMenuProvider
-import androidx.compose.runtime.CompositionLocalProvider
-import androidx.compose.runtime.derivedStateOf
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.neverEqualPolicy
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.takeOrElse
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.test.SemanticsNodeInteraction
-import androidx.compose.ui.test.click
-import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.test.onNodeWithTag
-import androidx.compose.ui.test.performMouseInput
-import androidx.compose.ui.test.performTouchInput
-import androidx.compose.ui.test.rightClick
-import androidx.compose.ui.unit.IntOffset
-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 org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@RunWith(AndroidJUnit4::class)
-@MediumTest
-class TextContextMenuGesturesModifierTest {
-    @get:Rule val rule = createComposeRule()
-
-    private val baseLength = 100
-    private val baseLengthDp = with(rule.density) { baseLength.toDp() }
-
-    @Test
-    fun whenTouchTap_nothingHappens() =
-        runTest(postGestureModifier = Modifier.background(Color.LightGray).size(baseLengthDp)) {
-            onBox().performTouchInput { click() }
-            assertNullDataProvider()
-            assertPreShowContextMenuInvocationCount(0)
-        }
-
-    @Test
-    fun whenLeftClick_nothingHappens() =
-        runTest(postGestureModifier = Modifier.background(Color.LightGray).size(baseLengthDp)) {
-            onBox().performMouseInput { click() }
-            assertNullDataProvider()
-            assertPreShowContextMenuInvocationCount(0)
-        }
-
-    @Test
-    fun whenRightClick_dataProviderTriggers() =
-        runTest(
-            preGestureModifier = Modifier.addTextContextMenuComponents { testItem(TestItem.One) },
-            postGestureModifier = Modifier.background(Color.LightGray).size(baseLengthDp)
-        ) {
-            val clickOffset = IntOffset(10, 10)
-            rightClick(clickOffset.toOffset())
-            assertDataContains(TestItem.One)
-            assertClickPositionEquals(clickOffset)
-            assertPreShowContextMenuInvocationCount(1)
-        }
-
-    @Test
-    fun whenDestinationCoordinatesMove_dataProviderPositionsCorrectly() {
-        val initialOffset = IntOffset.Zero
-        val finalOffset = IntOffset(baseLength, baseLength)
-        var offset by mutableStateOf(initialOffset)
-        runTest(
-            preGestureModifier = Modifier.size(baseLengthDp * 2),
-            postGestureModifier =
-                Modifier.offset { offset }.background(Color.LightGray).size(baseLengthDp)
-        ) {
-            val clickOffset = IntOffset(10, 10)
-
-            rightClick(clickOffset.toOffset())
-            assertClickPositionEquals(clickOffset)
-            assertPreShowContextMenuInvocationCount(1)
-
-            offset = finalOffset
-            rule.waitForIdle()
-            // The destinationCoordinates move,
-            // but the localCoordinates at the gesture location do not,
-            // so the result in the destination coordinates should be subtracting any movement.
-            assertClickPositionEquals(clickOffset - finalOffset)
-            assertPreShowContextMenuInvocationCount(1)
-        }
-    }
-
-    @Test
-    fun whenGestureCoordinatesMove_dataProviderPositionsCorrectly() {
-        val initialOffset = IntOffset.Zero
-        val finalOffset = IntOffset(baseLength, baseLength)
-        var offset by mutableStateOf(initialOffset)
-        runTest(
-            preGestureModifier = Modifier.size(baseLengthDp * 2).offset { offset },
-            postGestureModifier = Modifier.background(Color.LightGray).size(baseLengthDp)
-        ) {
-            val clickOffset = IntOffset(10, 10)
-
-            rightClick(clickOffset.toOffset())
-            assertClickPositionEquals(clickOffset)
-            assertPreShowContextMenuInvocationCount(1)
-
-            offset = finalOffset
-            rule.waitForIdle()
-            // Both layouts move the same amount, so the result should be the same
-            assertClickPositionEquals(clickOffset)
-            assertPreShowContextMenuInvocationCount(1)
-        }
-    }
-
-    @Test
-    fun whenDataProviderDataUpdates_dataResultUpdates() {
-        var item by mutableStateOf(TestItem.One)
-        runTest(
-            preGestureModifier = Modifier.addTextContextMenuComponents { testItem(item) },
-            postGestureModifier = Modifier.background(Color.LightGray).size(baseLengthDp)
-        ) {
-            rightClick()
-            assertDataContains(TestItem.One)
-            assertPreShowContextMenuInvocationCount(1)
-
-            item = TestItem.Two
-            rule.waitForIdle()
-            assertDataContains(TestItem.Two)
-            assertPreShowContextMenuInvocationCount(1)
-        }
-    }
-
-    private fun runTest(
-        preGestureModifier: Modifier = Modifier,
-        postGestureModifier: Modifier = Modifier,
-        block: TestScope.() -> Unit
-    ) {
-        TestScope(preGestureModifier, postGestureModifier).block()
-    }
-
-    private inner class TestScope(
-        preGestureModifier: Modifier,
-        postGestureModifier: Modifier,
-    ) {
-        private val tag = "testTag"
-
-        private var dataProvider by
-            mutableStateOf<TextContextMenuDataProvider?>(null, neverEqualPolicy())
-
-        private var destinationCoordinates by
-            mutableStateOf<LayoutCoordinates?>(null, neverEqualPolicy())
-
-        private var onPreShowContextMenuInvocationCount = 0
-
-        private val actualPosition by derivedStateOf {
-            assertNotNull(dataProvider).position(assertNotNull(destinationCoordinates))
-        }
-
-        private val actualDataComponents by derivedStateOf {
-            assertNotNull(dataProvider).data().components
-        }
-
-        init {
-            rule.setContent {
-                CompositionLocalProvider(
-                    LocalTextContextMenuDropdownProvider provides FakeProvider { dataProvider = it }
-                ) {
-                    Box(
-                        preGestureModifier
-                            .textContextMenuGestures { onPreShowContextMenuInvocationCount++ }
-                            .then(postGestureModifier)
-                            .onGloballyPositioned { destinationCoordinates = it }
-                            .testTag(tag)
-                    )
-                }
-            }
-        }
-
-        fun assertNullDataProvider() {
-            assertThat(dataProvider).isNull()
-        }
-
-        fun assertClickPositionEquals(expectedOffset: IntOffset) {
-            assertThat(actualPosition.round()).isEqualTo(expectedOffset)
-        }
-
-        fun assertDataContains(vararg items: TestItem) {
-            assertThat(actualDataComponents).hasSize(items.size)
-            items.zip(actualDataComponents).forEach { (expectedTestItem, actualComponent) ->
-                assertThat(actualComponent.key).isEqualTo(expectedTestItem)
-            }
-        }
-
-        fun assertPreShowContextMenuInvocationCount(n: Int) {
-            assertThat(onPreShowContextMenuInvocationCount).isEqualTo(n)
-        }
-
-        fun onBox(): SemanticsNodeInteraction = rule.onNodeWithTag(tag)
-
-        fun rightClick(clickPosition: Offset = Offset.Unspecified) {
-            onBox().performMouseInput { rightClick(clickPosition.takeOrElse { center }) }
-        }
-    }
-}
-
-private enum class TestItem(val label: String) {
-    One("One"),
-    Two("Two"),
-}
-
-private fun TextContextMenuBuilderScope.testItem(
-    item: TestItem,
-    onClick: TextContextMenuSession.() -> Unit = {}
-) {
-    item(key = item, label = item.label, onClick = onClick)
-}
-
-private fun interface FakeProvider : TextContextMenuProvider {
-    fun onShow(dataProvider: TextContextMenuDataProvider)
-
-    override suspend fun showTextContextMenu(dataProvider: TextContextMenuDataProvider) {
-        onShow(dataProvider)
-    }
-}
-
-private fun <T : Any> assertNotNull(value: T?): T = value.also { assertThat(it).isNotNull() }!!
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/contextmenu/provider/BasicTextContextMenuProviderTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/contextmenu/provider/BasicTextContextMenuProviderTest.kt
index 3d7761de..36220d9 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/contextmenu/provider/BasicTextContextMenuProviderTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/contextmenu/provider/BasicTextContextMenuProviderTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.compose.foundation.text.contextmenu.provider
 
-import android.annotation.SuppressLint
 import androidx.compose.foundation.background
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Arrangement
@@ -182,7 +181,8 @@
 
             assertContextMenuExistsWithNumbers(1)
             assertThatJob(contextMenuCoroutine).isActive()
-            val initialBounds = anchorLayoutCoordinates.boundsInRoot().roundToIntRect()
+            val initialBounds =
+                assertNotNull(anchorLayoutCoordinates).boundsInRoot().roundToIntRect()
 
             length = 50
             rule.waitForIdle()
@@ -190,7 +190,7 @@
             assertContextMenuExistsWithNumbers(1)
             assertThatJob(contextMenuCoroutine).isActive()
 
-            val finalBounds = anchorLayoutCoordinates.boundsInRoot().roundToIntRect()
+            val finalBounds = assertNotNull(anchorLayoutCoordinates).boundsInRoot().roundToIntRect()
             val expectedBounds = initialBounds.translate(IntOffset(50, 50))
             assertThat(finalBounds).isEqualTo(expectedBounds)
         }
@@ -207,7 +207,7 @@
         (
             session: TextContextMenuSession,
             dataProvider: TextContextMenuDataProvider,
-            anchorLayoutCoordinates: () -> LayoutCoordinates,
+            anchorLayoutCoordinates: LayoutCoordinates,
         ) -> Unit = { _, _, _ ->
             Box(modifier = Modifier.background(Color.LightGray).size(50.dp).testTag(tag))
         }
@@ -273,7 +273,7 @@
                     ProvideTestBasicTextContextMenu(
                         onContextMenuComposition = { session, anchorLayoutCoordinates ->
                             testScope.session = session
-                            testScope.anchorLayoutCoordinatesFunction = anchorLayoutCoordinates
+                            testScope.anchorLayoutCoordinates = anchorLayoutCoordinates
                         }
                     ) {
                         testScope.provider = LocalTestContextMenuProvider.current
@@ -289,13 +289,10 @@
     }
 
     private inner class TestScope {
-        var anchorLayoutCoordinatesFunction: (() -> LayoutCoordinates)? = null
-        val anchorLayoutCoordinates: LayoutCoordinates
-            get() = assertNotNull(anchorLayoutCoordinatesFunction).invoke()
-
         var coroutineScope: CoroutineScope? = null
         var provider: TextContextMenuProvider? = null
         var session: TextContextMenuSession? = null
+        var anchorLayoutCoordinates: LayoutCoordinates? = null
         var enabled by mutableStateOf(true)
 
         fun launch(block: suspend CoroutineScope.() -> Unit): Job =
@@ -328,7 +325,6 @@
 private const val ContextMenuTag = "ContextMenu"
 
 @Composable
-@SuppressLint("ModifierParameter")
 private fun OuterBox(modifier: Modifier = Modifier.fillMaxSize(), content: @Composable () -> Unit) {
     Box(modifier, Alignment.Center) { content() }
 }
@@ -346,7 +342,7 @@
     onContextMenuComposition:
         (
             session: TextContextMenuSession?,
-            anchorLayoutCoordinates: () -> LayoutCoordinates,
+            anchorLayoutCoordinates: LayoutCoordinates?,
         ) -> Unit,
     content: @Composable () -> Unit
 ) {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldLongPressTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldLongPressTest.kt
index 46e98c0..16d69d4 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldLongPressTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldLongPressTest.kt
@@ -150,12 +150,9 @@
     @Test
     fun longPressOnEmptyRegion_showsTextToolbar() {
         val state = TextFieldState("abc")
-        var toolbarShown = false
+        var showMenuCalled = 0
         val textToolbar =
-            FakeTextToolbar(
-                onShowMenu = { _, _, _, _, _, _ -> toolbarShown = true },
-                onHideMenu = { toolbarShown = false }
-            )
+            FakeTextToolbar(onShowMenu = { _, _, _, _, _, _ -> showMenuCalled++ }, onHideMenu = {})
         val clipboard = FakeClipboard("hello")
         rule.setTextFieldTestContent {
             CompositionLocalProvider(
@@ -174,7 +171,7 @@
             longClick(Offset(fontSize.toPx() * 5, fontSize.toPx() / 2))
         }
 
-        rule.runOnIdle { assertThat(toolbarShown).isTrue() }
+        rule.runOnIdle { assertThat(showMenuCalled).isEqualTo(1) }
     }
 
     @Test
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerContextMenuFlagFlippedTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerContextMenuFlagFlippedTest.kt
deleted file mode 100644
index 015da88..0000000
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerContextMenuFlagFlippedTest.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.foundation.text.selection
-
-import androidx.compose.foundation.ComposeFoundationFlags
-import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.test.filters.MediumTest
-import org.junit.After
-import org.junit.Before
-
-/**
- * We expect the [SelectionContainerContextMenuFlagFlippedTest] to succeed no matter how the
- * [ComposeFoundationFlags.isNewContextMenuEnabled] is flipped.
- *
- * When the [ComposeFoundationFlags.isNewContextMenuEnabled] flag is removed, this test should be
- * removed and the [SelectionContainerContextMenuFlagFlippedTest] class should have its `open`
- * keyword removed.
- */
-@OptIn(ExperimentalFoundationApi::class)
-@MediumTest
-class SelectionContainerContextMenuFlagFlippedTest : SelectionContainerContextMenuTest() {
-    private var initialFlag = ComposeFoundationFlags.isNewContextMenuEnabled
-
-    @Before
-    fun setup() {
-        ComposeFoundationFlags.isNewContextMenuEnabled = !initialFlag
-    }
-
-    @After
-    fun cleanup() {
-        ComposeFoundationFlags.isNewContextMenuEnabled = initialFlag
-    }
-}
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerContextMenuTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerContextMenuTest.kt
index 384e3ed..1d37ca5 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerContextMenuTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerContextMenuTest.kt
@@ -56,7 +56,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-open class SelectionContainerContextMenuTest {
+class SelectionContainerContextMenuTest {
     @get:Rule val rule = createComposeRule()
 
     private val textTag = "text"
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldContextMenuBuilderTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldContextMenuBuilderTest.kt
new file mode 100644
index 0000000..8c44ce1
--- /dev/null
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldContextMenuBuilderTest.kt
@@ -0,0 +1,849 @@
+/*
+ * Copyright 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.textfield
+
+import androidx.compose.foundation.ComposeFoundationFlags
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.internal.readText
+import androidx.compose.foundation.internal.toClipEntry
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.text.BasicSecureTextField
+import androidx.compose.foundation.text.BasicTextField
+import androidx.compose.foundation.text.FocusedWindowTest
+import androidx.compose.foundation.text.TextContextMenuItems
+import androidx.compose.foundation.text.contextmenu.data.TextContextMenuItem
+import androidx.compose.foundation.text.contextmenu.data.TextContextMenuKeys.AutofillKey
+import androidx.compose.foundation.text.contextmenu.data.TextContextMenuKeys.CopyKey
+import androidx.compose.foundation.text.contextmenu.data.TextContextMenuKeys.CutKey
+import androidx.compose.foundation.text.contextmenu.data.TextContextMenuKeys.PasteKey
+import androidx.compose.foundation.text.contextmenu.data.TextContextMenuKeys.SelectAllKey
+import androidx.compose.foundation.text.contextmenu.data.TextContextMenuSession
+import androidx.compose.foundation.text.contextmenu.test.TestTextContextMenuDataInvoker
+import androidx.compose.foundation.text.contextmenu.test.assertItems
+import androidx.compose.foundation.text.contextmenu.test.testTextContextMenuDataReader
+import androidx.compose.foundation.text.input.TextFieldDecorator
+import androidx.compose.foundation.text.input.TextFieldState
+import androidx.compose.foundation.text.input.internal.selection.FakeClipboard
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalClipboard
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.click
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.longClick
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performMouseInput
+import androidx.compose.ui.test.performTouchInput
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.TextRange
+import androidx.compose.ui.text.input.PasswordVisualTransformation
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.ui.text.input.VisualTransformation
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import com.google.common.truth.Truth.assertThat
+import com.google.common.truth.Truth.assertWithMessage
+import kotlinx.coroutines.test.runTest
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class TextFieldContextMenuBuilderTest : FocusedWindowTest {
+    @get:Rule val rule = createComposeRule()
+
+    private val textFieldTag = "BTF"
+
+    private var initialIsNewContextMenuEnabled = false
+
+    @OptIn(ExperimentalFoundationApi::class)
+    @Before
+    fun setup() {
+        initialIsNewContextMenuEnabled = ComposeFoundationFlags.isNewContextMenuEnabled
+        ComposeFoundationFlags.isNewContextMenuEnabled = true
+    }
+
+    @OptIn(ExperimentalFoundationApi::class)
+    @After
+    fun cleanup() {
+        ComposeFoundationFlags.isNewContextMenuEnabled = initialIsNewContextMenuEnabled
+    }
+
+    private enum class SelectionAmount {
+        NONE,
+        PARTIAL,
+        ALL
+    }
+
+    // region BTF1 Context Menu Item Action Tests
+    @Test
+    fun btf1_contextMenu_whenMouse_onClickCut() = runTest {
+        runBtf1ClickContextMenuItemTest(
+            isMouse = true,
+            expectedSessionClosed = true,
+            itemToInvoke = TextContextMenuItems.Cut,
+            expectedText = "Text  Text",
+            expectedSelection = TextRange(5),
+            expectedClipboardContent = "Text",
+        )
+    }
+
+    @Test
+    fun btf1_contextMenu_whenMouse_onClickCopy() = runTest {
+        runBtf1ClickContextMenuItemTest(
+            isMouse = true,
+            expectedSessionClosed = true,
+            itemToInvoke = TextContextMenuItems.Copy,
+            expectedText = "Text Text Text",
+            expectedSelection = TextRange(5, 9),
+            expectedClipboardContent = "Text",
+        )
+    }
+
+    @Test
+    fun btf1_contextMenu_whenMouse_onClickPaste() = runTest {
+        runBtf1ClickContextMenuItemTest(
+            isMouse = true,
+            expectedSessionClosed = true,
+            itemToInvoke = TextContextMenuItems.Paste,
+            expectedText = "Text clip Text",
+            expectedSelection = TextRange(9),
+            expectedClipboardContent = "clip",
+        )
+    }
+
+    @Test
+    fun btf1_contextMenu_whenMouse_onClickSelectAll() = runTest {
+        runBtf1ClickContextMenuItemTest(
+            isMouse = true,
+            expectedSessionClosed = true,
+            itemToInvoke = TextContextMenuItems.SelectAll,
+            expectedText = "Text Text Text",
+            expectedSelection = TextRange(0, 14),
+            expectedClipboardContent = "clip",
+        )
+    }
+
+    @Test
+    fun btf1_contextMenu_whenTouch_onClickCut() = runTest {
+        runBtf1ClickContextMenuItemTest(
+            isMouse = false,
+            expectedSessionClosed = true,
+            itemToInvoke = TextContextMenuItems.Cut,
+            expectedText = "Text  Text",
+            expectedSelection = TextRange(5),
+            expectedClipboardContent = "Text",
+        )
+    }
+
+    @Test
+    fun btf1_contextMenu_whenTouch_onClickCopy() = runTest {
+        runBtf1ClickContextMenuItemTest(
+            isMouse = false,
+            expectedSessionClosed = true,
+            itemToInvoke = TextContextMenuItems.Copy,
+            expectedText = "Text Text Text",
+            expectedSelection = TextRange(9),
+            expectedClipboardContent = "Text",
+        )
+    }
+
+    @Test
+    fun btf1_contextMenu_whenTouch_onClickPaste() = runTest {
+        runBtf1ClickContextMenuItemTest(
+            isMouse = false,
+            expectedSessionClosed = true,
+            itemToInvoke = TextContextMenuItems.Paste,
+            expectedText = "Text clip Text",
+            expectedSelection = TextRange(9),
+            expectedClipboardContent = "clip",
+        )
+    }
+
+    @Test
+    fun btf1_contextMenu_whenTouch_onClickSelectAll() = runTest {
+        runBtf1ClickContextMenuItemTest(
+            isMouse = false,
+            expectedSessionClosed = false,
+            itemToInvoke = TextContextMenuItems.SelectAll,
+            expectedText = "Text Text Text",
+            expectedSelection = TextRange(0, 14),
+            expectedClipboardContent = "clip",
+        )
+    }
+
+    private suspend fun runBtf1ClickContextMenuItemTest(
+        isMouse: Boolean,
+        expectedSessionClosed: Boolean,
+        itemToInvoke: TextContextMenuItems,
+        expectedText: String,
+        expectedSelection: TextRange,
+        expectedClipboardContent: String,
+    ) {
+        val initialText = "Text Text Text"
+        val initialClipboardText = "clip"
+
+        var value by
+            mutableStateOf(
+                TextFieldValue(
+                    text = initialText,
+                    selection = TextRange(5, 9),
+                )
+            )
+
+        val clipboard =
+            FakeClipboard(
+                initialText = initialClipboardText,
+                supportsClipEntry = true,
+            )
+
+        var sessionClosed = false
+        val fakeSession =
+            object : TextContextMenuSession {
+                override fun close() {
+                    sessionClosed = true
+                }
+            }
+
+        val reader = TestTextContextMenuDataInvoker()
+        rule.setTextFieldTestContent {
+            CompositionLocalProvider(LocalClipboard provides clipboard) {
+                BasicTextField(
+                    value = value,
+                    onValueChange = { value = it },
+                    modifier = Modifier.testTag(textFieldTag),
+                ) { innerTextField ->
+                    Box(
+                        propagateMinConstraints = true,
+                        modifier = Modifier.testTextContextMenuDataReader(reader)
+                    ) {
+                        innerTextField()
+                    }
+                }
+            }
+        }
+
+        // start selection of middle word
+        if (isMouse) {
+            rule.onNodeWithTag(textFieldTag).performMouseInput { repeat(2) { click() } }
+        } else {
+            rule.onNodeWithTag(textFieldTag).performTouchInput { longClick() }
+        }
+
+        // collect our context menu items.
+        val data = reader.invokeTraversal()
+
+        // get and verify component
+        val component = data.components.singleOrNull { it.key == itemToInvoke.key }
+        assertWithMessage("Component with key %s not found", itemToInvoke.key)
+            .that(component)
+            .isNotNull()
+        assertThat(component).isInstanceOf(TextContextMenuItem::class.java)
+        val item = component as TextContextMenuItem
+
+        // simulate clicking the item.
+        rule.runOnUiThread { item.onClick(fakeSession) }
+
+        // verify whether close called
+        if (expectedSessionClosed) {
+            assertThat(sessionClosed).isTrue()
+        } else {
+            assertThat(sessionClosed).isFalse()
+        }
+
+        // Operation was applied
+        assertThat(value.text).isEqualTo(expectedText)
+        assertThat(value.selection).isEqualTo(expectedSelection)
+        val clipboardContent = clipboard.getClipEntry()?.readText()
+        assertThat(clipboardContent).isNotNull()
+        assertThat(clipboardContent!!).isEqualTo(expectedClipboardContent)
+    }
+
+    // endregion BTF1 Context Menu Item Action Tests
+
+    // region BTF1 Context Menu Correct Item Tests
+    @Test
+    @SdkSuppress(maxSdkVersion = 25)
+    fun btf1_contextMenu_emptyClipboard_noSelection_itemsMatch_beforeApi26() =
+        runBtf1CorrectItemsTest(
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.NONE,
+            expectedItems = listOf(SelectAllKey),
+        )
+
+    @Test
+    @SdkSuppress(minSdkVersion = 26)
+    fun btf1_contextMenu_emptyClipboard_noSelection_itemsMatch_afterApi26() =
+        runBtf1CorrectItemsTest(
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.NONE,
+            expectedItems = listOf(SelectAllKey, AutofillKey),
+        )
+
+    @Test
+    fun btf1_contextMenu_emptyClipboard_partialSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.PARTIAL,
+            expectedItems = listOf(CutKey, CopyKey, SelectAllKey),
+        )
+
+    @Test
+    fun btf1_contextMenu_emptyClipboard_fullSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.ALL,
+            expectedItems = listOf(CutKey, CopyKey),
+        )
+
+    @Test
+    @SdkSuppress(maxSdkVersion = 25)
+    fun btf1_contextMenu_nonEmptyClipboard_noSelection_itemsMatch_beforeApi26() =
+        runBtf1CorrectItemsTest(
+            isEmptyClipboard = false,
+            selectionAmount = SelectionAmount.NONE,
+            expectedItems = listOf(PasteKey, SelectAllKey),
+        )
+
+    @Test
+    @SdkSuppress(minSdkVersion = 26)
+    fun btf1_contextMenu_nonEmptyClipboard_noSelection_itemsMatch_afterApi26() =
+        runBtf1CorrectItemsTest(
+            isEmptyClipboard = false,
+            selectionAmount = SelectionAmount.NONE,
+            expectedItems = listOf(PasteKey, SelectAllKey, AutofillKey),
+        )
+
+    @Test
+    fun btf1_contextMenu_nonEmptyClipboard_partialSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isEmptyClipboard = false,
+            selectionAmount = SelectionAmount.PARTIAL,
+            expectedItems = listOf(CutKey, CopyKey, PasteKey, SelectAllKey),
+        )
+
+    @Test
+    fun btf1_contextMenu_nonEmptyClipboard_fullSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isEmptyClipboard = false,
+            selectionAmount = SelectionAmount.ALL,
+            expectedItems = listOf(CutKey, CopyKey, PasteKey),
+        )
+
+    @Test
+    @SdkSuppress(maxSdkVersion = 25)
+    fun btf1_contextMenu_password_noSelection_itemsMatch_beforeApi26() =
+        runBtf1CorrectItemsTest(
+            isPassword = true,
+            selectionAmount = SelectionAmount.NONE,
+            expectedItems = listOf(PasteKey, SelectAllKey),
+        )
+
+    @Test
+    @SdkSuppress(minSdkVersion = 26)
+    fun btf1_contextMenu_password_noSelection_itemsMatch_afterApi26() =
+        runBtf1CorrectItemsTest(
+            isPassword = true,
+            selectionAmount = SelectionAmount.NONE,
+            expectedItems = listOf(PasteKey, SelectAllKey, AutofillKey),
+        )
+
+    @Test
+    fun btf1_contextMenu_password_partialSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isPassword = true,
+            selectionAmount = SelectionAmount.PARTIAL,
+            expectedItems = listOf(PasteKey, SelectAllKey),
+        )
+
+    @Test
+    fun btf1_contextMenu_password_fullSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isPassword = true,
+            selectionAmount = SelectionAmount.ALL,
+            expectedItems = listOf(PasteKey),
+        )
+
+    @Test
+    fun btf1_contextMenu_readOnly_noSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isReadOnly = true,
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.NONE,
+            expectedItems = listOf(SelectAllKey),
+        )
+
+    @Test
+    fun btf1_contextMenu_readOnly_partialSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isReadOnly = true,
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.PARTIAL,
+            expectedItems = listOf(CopyKey, SelectAllKey),
+        )
+
+    @Test
+    fun btf1_contextMenu_readOnly_fullSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isReadOnly = true,
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.ALL,
+            expectedItems = listOf(CopyKey),
+        )
+
+    private fun runBtf1CorrectItemsTest(
+        isPassword: Boolean = false,
+        isReadOnly: Boolean = false,
+        isEmptyClipboard: Boolean = false,
+        selectionAmount: SelectionAmount = SelectionAmount.PARTIAL,
+        expectedItems: List<Any>,
+    ) = runTest {
+        check(!(isPassword && isReadOnly)) { "Can't be a password field and read-only." }
+
+        val initialText = "Text Text Text"
+        var value by
+            mutableStateOf(
+                TextFieldValue(
+                    text = initialText,
+                    selection =
+                        when (selectionAmount) {
+                            SelectionAmount.NONE -> TextRange.Zero
+                            SelectionAmount.PARTIAL -> TextRange(5, 9)
+                            SelectionAmount.ALL -> TextRange(0, 14)
+                        }
+                )
+            )
+
+        val visualTransformation =
+            if (isPassword) PasswordVisualTransformation() else VisualTransformation.None
+
+        val clipboard =
+            FakeClipboard(supportsClipEntry = true).apply {
+                if (isEmptyClipboard) {
+                    setClipEntry(null)
+                } else {
+                    setClipEntry(AnnotatedString("Clipboard Text").toClipEntry())
+                }
+            }
+
+        val reader = TestTextContextMenuDataInvoker()
+        rule.setTextFieldTestContent {
+            CompositionLocalProvider(LocalClipboard provides clipboard) {
+                BasicTextField(
+                    value = value,
+                    onValueChange = { value = it },
+                    visualTransformation = visualTransformation,
+                    readOnly = isReadOnly,
+                    modifier = Modifier.testTag(textFieldTag)
+                ) { innerTextField ->
+                    Box(
+                        propagateMinConstraints = true,
+                        modifier = Modifier.testTextContextMenuDataReader(reader)
+                    ) {
+                        innerTextField()
+                    }
+                }
+            }
+        }
+
+        val data = reader.invokeTraversal()
+        data.assertItems(expectedItems)
+    }
+
+    // endregion BTF1 Context Menu Correct Item Tests
+
+    // region BTF2 Context Menu Item Action Tests
+    @Test
+    fun btf2_contextMenu_whenMouse_onClickCut() = runTest {
+        runBtf2ClickContextMenuItemTest(
+            isMouse = true,
+            expectedSessionClosed = true,
+            itemToInvoke = TextContextMenuItems.Cut,
+            expectedText = "Text  Text",
+            expectedSelection = TextRange(5),
+            expectedClipboardContent = "Text",
+        )
+    }
+
+    @Test
+    fun btf2_contextMenu_whenMouse_onClickCopy() = runTest {
+        runBtf2ClickContextMenuItemTest(
+            isMouse = true,
+            expectedSessionClosed = true,
+            itemToInvoke = TextContextMenuItems.Copy,
+            expectedText = "Text Text Text",
+            expectedSelection = TextRange(5, 9),
+            expectedClipboardContent = "Text",
+        )
+    }
+
+    @Test
+    fun btf2_contextMenu_whenMouse_onClickPaste() = runTest {
+        runBtf2ClickContextMenuItemTest(
+            isMouse = true,
+            expectedSessionClosed = true,
+            itemToInvoke = TextContextMenuItems.Paste,
+            expectedText = "Text clip Text",
+            expectedSelection = TextRange(9),
+            expectedClipboardContent = "clip",
+        )
+    }
+
+    @Test
+    fun btf2_contextMenu_whenMouse_onClickSelectAll() = runTest {
+        runBtf2ClickContextMenuItemTest(
+            isMouse = true,
+            expectedSessionClosed = true,
+            itemToInvoke = TextContextMenuItems.SelectAll,
+            expectedText = "Text Text Text",
+            expectedSelection = TextRange(0, 14),
+            expectedClipboardContent = "clip",
+        )
+    }
+
+    @Test
+    fun btf2_contextMenu_whenTouch_onClickCut() = runTest {
+        runBtf2ClickContextMenuItemTest(
+            isMouse = false,
+            expectedSessionClosed = true,
+            itemToInvoke = TextContextMenuItems.Cut,
+            expectedText = "Text  Text",
+            expectedSelection = TextRange(5),
+            expectedClipboardContent = "Text",
+        )
+    }
+
+    @Test
+    fun btf2_contextMenu_whenTouch_onClickCopy() = runTest {
+        runBtf2ClickContextMenuItemTest(
+            isMouse = false,
+            expectedSessionClosed = true,
+            itemToInvoke = TextContextMenuItems.Copy,
+            expectedText = "Text Text Text",
+            expectedSelection = TextRange(9),
+            expectedClipboardContent = "Text",
+        )
+    }
+
+    @Test
+    fun btf2_contextMenu_whenTouch_onClickPaste() = runTest {
+        runBtf2ClickContextMenuItemTest(
+            isMouse = false,
+            expectedSessionClosed = true,
+            itemToInvoke = TextContextMenuItems.Paste,
+            expectedText = "Text clip Text",
+            expectedSelection = TextRange(9),
+            expectedClipboardContent = "clip",
+        )
+    }
+
+    @Test
+    fun btf2_contextMenu_whenTouch_onClickSelectAll() = runTest {
+        runBtf2ClickContextMenuItemTest(
+            isMouse = false,
+            expectedSessionClosed = false,
+            itemToInvoke = TextContextMenuItems.SelectAll,
+            expectedText = "Text Text Text",
+            expectedSelection = TextRange(0, 14),
+            expectedClipboardContent = "clip",
+        )
+    }
+
+    private suspend fun runBtf2ClickContextMenuItemTest(
+        isMouse: Boolean,
+        expectedSessionClosed: Boolean,
+        itemToInvoke: TextContextMenuItems,
+        expectedText: String,
+        expectedSelection: TextRange,
+        expectedClipboardContent: String,
+    ) {
+        val initialText = "Text Text Text"
+        val initialClipboardText = "clip"
+
+        val state = TextFieldState(initialText)
+
+        val clipboard =
+            FakeClipboard(
+                initialText = initialClipboardText,
+                supportsClipEntry = true,
+            )
+
+        var sessionClosed = false
+        val fakeSession =
+            object : TextContextMenuSession {
+                override fun close() {
+                    sessionClosed = true
+                }
+            }
+
+        val reader = TestTextContextMenuDataInvoker()
+        rule.setTextFieldTestContent {
+            CompositionLocalProvider(LocalClipboard provides clipboard) {
+                BasicTextField(
+                    state = state,
+                    modifier = Modifier.testTag(textFieldTag),
+                    decorator = { innerTextField ->
+                        Box(
+                            propagateMinConstraints = true,
+                            modifier = Modifier.testTextContextMenuDataReader(reader)
+                        ) {
+                            innerTextField()
+                        }
+                    }
+                )
+            }
+        }
+
+        // start selection of middle word
+        if (isMouse) {
+            rule.onNodeWithTag(textFieldTag).performMouseInput { repeat(2) { click() } }
+        } else {
+            rule.onNodeWithTag(textFieldTag).performTouchInput { longClick() }
+        }
+
+        // collect our context menu items.
+        val data = reader.invokeTraversal()
+
+        // get and verify component
+        val component = data.components.singleOrNull { it.key == itemToInvoke.key }
+        assertWithMessage("Component with key %s not found", itemToInvoke.key)
+            .that(component)
+            .isNotNull()
+        assertThat(component).isInstanceOf(TextContextMenuItem::class.java)
+        val item = component as TextContextMenuItem
+
+        // simulate clicking the item.
+        rule.runOnUiThread { item.onClick(fakeSession) }
+
+        // verify whether close called
+        if (expectedSessionClosed) {
+            assertThat(sessionClosed).isTrue()
+        } else {
+            assertThat(sessionClosed).isFalse()
+        }
+
+        // Operation was applied
+        assertThat(state.text).isEqualTo(expectedText)
+        assertThat(state.selection).isEqualTo(expectedSelection)
+        val clipboardContent = clipboard.getClipEntry()?.readText()
+        assertThat(clipboardContent).isNotNull()
+        assertThat(clipboardContent!!).isEqualTo(expectedClipboardContent)
+    }
+
+    // endregion BTF2 Context Menu Item Action Tests
+
+    // region BTF2 Context Menu Correct Item Tests
+    @Test
+    @SdkSuppress(maxSdkVersion = 25)
+    fun btf2_contextMenu_emptyClipboard_noSelection_itemsMatch_beforeApi26() =
+        runBtf2CorrectItemsTest(
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.NONE,
+            expectedItems = listOf(SelectAllKey),
+        )
+
+    @Test
+    @SdkSuppress(minSdkVersion = 26)
+    fun btf2_contextMenu_emptyClipboard_noSelection_itemsMatch_afterApi26() =
+        runBtf2CorrectItemsTest(
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.NONE,
+            expectedItems = listOf(SelectAllKey, AutofillKey),
+        )
+
+    @Test
+    fun btf2_contextMenu_emptyClipboard_partialSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.PARTIAL,
+            expectedItems = listOf(CutKey, CopyKey, SelectAllKey),
+        )
+
+    @Test
+    fun btf2_contextMenu_emptyClipboard_fullSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.ALL,
+            expectedItems = listOf(CutKey, CopyKey),
+        )
+
+    @Test
+    @SdkSuppress(maxSdkVersion = 25)
+    fun btf2_contextMenu_nonEmptyClipboard_noSelection_itemsMatch_beforeApi26() =
+        runBtf2CorrectItemsTest(
+            isEmptyClipboard = false,
+            selectionAmount = SelectionAmount.NONE,
+            expectedItems = listOf(PasteKey, SelectAllKey),
+        )
+
+    @Test
+    @SdkSuppress(minSdkVersion = 26)
+    fun btf2_contextMenu_nonEmptyClipboard_noSelection_itemsMatch_afterApi26() =
+        runBtf2CorrectItemsTest(
+            isEmptyClipboard = false,
+            selectionAmount = SelectionAmount.NONE,
+            expectedItems = listOf(PasteKey, SelectAllKey, AutofillKey),
+        )
+
+    @Test
+    fun btf2_contextMenu_nonEmptyClipboard_partialSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isEmptyClipboard = false,
+            selectionAmount = SelectionAmount.PARTIAL,
+            expectedItems = listOf(CutKey, CopyKey, PasteKey, SelectAllKey),
+        )
+
+    @Test
+    fun btf2_contextMenu_nonEmptyClipboard_fullSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isEmptyClipboard = false,
+            selectionAmount = SelectionAmount.ALL,
+            expectedItems = listOf(CutKey, CopyKey, PasteKey),
+        )
+
+    @Test
+    @SdkSuppress(maxSdkVersion = 25)
+    fun btf2_contextMenu_password_noSelection_itemsMatch_beforeApi26() =
+        runBtf2CorrectItemsTest(
+            isPassword = true,
+            selectionAmount = SelectionAmount.NONE,
+            expectedItems = listOf(PasteKey, SelectAllKey),
+        )
+
+    @Test
+    @SdkSuppress(minSdkVersion = 26)
+    fun btf2_contextMenu_password_noSelection_itemsMatch_afterApi26() =
+        runBtf2CorrectItemsTest(
+            isPassword = true,
+            selectionAmount = SelectionAmount.NONE,
+            expectedItems = listOf(PasteKey, SelectAllKey, AutofillKey),
+        )
+
+    @Test
+    fun btf2_contextMenu_password_partialSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isPassword = true,
+            selectionAmount = SelectionAmount.PARTIAL,
+            expectedItems = listOf(PasteKey, SelectAllKey),
+        )
+
+    @Test
+    fun btf2_contextMenu_password_fullSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isPassword = true,
+            selectionAmount = SelectionAmount.ALL,
+            expectedItems = listOf(PasteKey),
+        )
+
+    @Test
+    fun btf2_contextMenu_readOnly_noSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isReadOnly = true,
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.NONE,
+            expectedItems = listOf(SelectAllKey),
+        )
+
+    @Test
+    fun btf2_contextMenu_readOnly_partialSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isReadOnly = true,
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.PARTIAL,
+            expectedItems = listOf(CopyKey, SelectAllKey),
+        )
+
+    @Test
+    fun btf2_contextMenu_readOnly_fullSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isReadOnly = true,
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.ALL,
+            expectedItems = listOf(CopyKey),
+        )
+
+    private fun runBtf2CorrectItemsTest(
+        isPassword: Boolean = false,
+        isReadOnly: Boolean = false,
+        isEmptyClipboard: Boolean = false,
+        selectionAmount: SelectionAmount = SelectionAmount.PARTIAL,
+        expectedItems: List<Any>,
+    ) = runTest {
+        check(!(isPassword && isReadOnly)) { "Can't be a password field and read-only." }
+
+        val initialText = "Text Text Text"
+        val state =
+            TextFieldState(
+                initialText = initialText,
+                initialSelection =
+                    when (selectionAmount) {
+                        SelectionAmount.NONE -> TextRange.Zero
+                        SelectionAmount.PARTIAL -> TextRange(5, 9)
+                        SelectionAmount.ALL -> TextRange(0, 14)
+                    }
+            )
+
+        val clipboard =
+            FakeClipboard(supportsClipEntry = true).apply {
+                if (isEmptyClipboard) {
+                    setClipEntry(null)
+                } else {
+                    setClipEntry(AnnotatedString("Clipboard Text").toClipEntry())
+                }
+            }
+
+        val reader = TestTextContextMenuDataInvoker()
+        val decorator = TextFieldDecorator { innerTextField ->
+            Box(
+                propagateMinConstraints = true,
+                modifier = Modifier.testTextContextMenuDataReader(reader)
+            ) {
+                innerTextField()
+            }
+        }
+
+        rule.setTextFieldTestContent {
+            CompositionLocalProvider(LocalClipboard provides clipboard) {
+                if (isPassword) {
+                    BasicSecureTextField(
+                        state = state,
+                        decorator = decorator,
+                        modifier = Modifier.testTag(textFieldTag)
+                    )
+                } else {
+                    BasicTextField(
+                        state = state,
+                        decorator = decorator,
+                        readOnly = isReadOnly,
+                        modifier = Modifier.testTag(textFieldTag)
+                    )
+                }
+            }
+        }
+
+        val data = reader.invokeTraversal()
+        data.assertItems(expectedItems)
+    }
+    // endregion BTF2 Context Menu Correct Item Tests
+}
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldContextMenuFlagFlippedTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldContextMenuFlagFlippedTest.kt
deleted file mode 100644
index 4dc1054..0000000
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldContextMenuFlagFlippedTest.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.textfield
-
-import androidx.compose.foundation.ComposeFoundationFlags
-import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.test.filters.MediumTest
-import org.junit.After
-import org.junit.Before
-
-/**
- * We expect the [TextFieldContextMenuTest] to succeed no matter how the
- * [ComposeFoundationFlags.isNewContextMenuEnabled] is flipped.
- *
- * When the [ComposeFoundationFlags.isNewContextMenuEnabled] flag is removed, this test should be
- * removed and the [TextFieldContextMenuTest] class should have its `open` keyword removed.
- */
-@OptIn(ExperimentalFoundationApi::class)
-@MediumTest
-class TextFieldContextMenuFlagFlippedTest : TextFieldContextMenuTest() {
-    private var initialFlag = ComposeFoundationFlags.isNewContextMenuEnabled
-
-    @Before
-    fun setup() {
-        ComposeFoundationFlags.isNewContextMenuEnabled = !initialFlag
-    }
-
-    @After
-    fun cleanup() {
-        ComposeFoundationFlags.isNewContextMenuEnabled = initialFlag
-    }
-}
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldContextMenuTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldContextMenuTest.kt
index 6b855c5..1b6fad3 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldContextMenuTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldContextMenuTest.kt
@@ -61,7 +61,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-open class TextFieldContextMenuTest : FocusedWindowTest {
+class TextFieldContextMenuTest : FocusedWindowTest {
     @get:Rule val rule = createComposeRule()
 
     private val textFieldTag = "BTF"
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestures.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestures.android.kt
index bef0aaf..05b3084 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestures.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestures.android.kt
@@ -16,11 +16,19 @@
 
 package androidx.compose.foundation.contextmenu
 
+import androidx.annotation.VisibleForTesting
 import androidx.compose.foundation.contextmenu.ContextMenuState.Status
-import androidx.compose.foundation.text.contextmenu.gestures.onRightClickDown
+import androidx.compose.foundation.gestures.awaitEachGesture
+import androidx.compose.foundation.gestures.waitForUpOrCancellation
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.input.pointer.AwaitPointerEventScope
+import androidx.compose.ui.input.pointer.PointerInputChange
+import androidx.compose.ui.input.pointer.PointerInputScope
+import androidx.compose.ui.input.pointer.changedToDown
+import androidx.compose.ui.input.pointer.isSecondaryPressed
 import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.util.fastAll
 
 /** Unique key to avoid [Unit] clashes in [pointerInput]. */
 private object ContextMenuKey
@@ -42,3 +50,27 @@
  */
 internal fun Modifier.contextMenuGestures(onOpenGesture: (Offset) -> Unit): Modifier =
     pointerInput(ContextMenuKey) { onRightClickDown(onOpenGesture) }
+
+/** Similar to PointerInputScope.detectTapAndPress, but for right clicks. */
+@VisibleForTesting
+internal suspend fun PointerInputScope.onRightClickDown(onDown: (Offset) -> Unit) {
+    awaitEachGesture {
+        val down = awaitFirstRightClickDown()
+        down.consume()
+        onDown(down.position)
+        waitForUpOrCancellation()?.consume()
+    }
+}
+
+/**
+ * Similar to AwaitPointerEventScope.awaitFirstDown, but with an additional check to ensure it is a
+ * right click.
+ */
+private suspend fun AwaitPointerEventScope.awaitFirstRightClickDown(): PointerInputChange {
+    while (true) {
+        val event = awaitPointerEvent()
+        if (event.buttons.isSecondaryPressed && event.changes.fastAll { it.changedToDown() }) {
+            return event.changes[0]
+        }
+    }
+}
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/ContextMenu.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/ContextMenu.android.kt
index 6b9763d..169162b 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/ContextMenu.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/ContextMenu.android.kt
@@ -18,8 +18,6 @@
 
 import android.content.res.Resources
 import android.os.Build
-import androidx.compose.foundation.ComposeFoundationFlags
-import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.R
 import androidx.compose.foundation.contextmenu.ContextMenuScope
 import androidx.compose.foundation.contextmenu.ContextMenuState
@@ -27,8 +25,6 @@
 import androidx.compose.foundation.text.contextmenu.builder.TextContextMenuBuilderScope
 import androidx.compose.foundation.text.contextmenu.data.TextContextMenuKeys
 import androidx.compose.foundation.text.contextmenu.data.TextContextMenuSession
-import androidx.compose.foundation.text.contextmenu.internal.ProvideDefaultTextContextMenuDropdown
-import androidx.compose.foundation.text.contextmenu.modifier.textContextMenuGestures
 import androidx.compose.foundation.text.input.internal.selection.TextFieldSelectionState
 import androidx.compose.foundation.text.input.internal.selection.contextMenuBuilder
 import androidx.compose.foundation.text.selection.SelectionManager
@@ -39,114 +35,82 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
-import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.stringResource
 import kotlinx.coroutines.CoroutineStart
 import kotlinx.coroutines.launch
 
-@OptIn(ExperimentalFoundationApi::class)
 @Composable
 internal actual fun ContextMenuArea(
     manager: TextFieldSelectionManager,
     content: @Composable () -> Unit
 ) {
-    if (ComposeFoundationFlags.isNewContextMenuEnabled) {
-        val modifier =
-            if (manager.enabled) {
-                Modifier.textContextMenuGestures(
-                    onPreShowContextMenu = { manager.updateClipboardEntry() }
-                )
-            } else {
-                Modifier
-            }
-        ProvideDefaultTextContextMenuDropdown(modifier, content)
-    } else {
-        val state = remember { ContextMenuState() }
-        val coroutineScope = rememberCoroutineScope()
-        val menuItemsAvailability = remember { mutableStateOf(MenuItemsAvailability.None) }
+    val state = remember { ContextMenuState() }
+    val coroutineScope = rememberCoroutineScope()
+    val menuItemsAvailability = remember { mutableStateOf(MenuItemsAvailability.None) }
 
-        androidx.compose.foundation.contextmenu.ContextMenuArea(
-            state = state,
-            onDismiss = { state.close() },
-            contextMenuBuilderBlock = manager.contextMenuBuilder(state, menuItemsAvailability),
-            enabled = manager.enabled,
-            onOpenGesture = {
-                coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) {
-                    menuItemsAvailability.value = manager.getContextMenuItemsAvailability()
-                }
-            },
-            content = content,
-        )
-    }
+    androidx.compose.foundation.contextmenu.ContextMenuArea(
+        state = state,
+        onDismiss = { state.close() },
+        contextMenuBuilderBlock = manager.contextMenuBuilder(state, menuItemsAvailability),
+        enabled = manager.enabled,
+        onOpenGesture = {
+            coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) {
+                menuItemsAvailability.value = manager.getContextMenuItemsAvailability()
+            }
+        },
+        content = content,
+    )
 }
 
-@OptIn(ExperimentalFoundationApi::class)
 @Composable
 internal actual fun ContextMenuArea(
     selectionState: TextFieldSelectionState,
     enabled: Boolean,
     content: @Composable () -> Unit
 ) {
-    if (ComposeFoundationFlags.isNewContextMenuEnabled) {
-        val modifier =
-            if (enabled) {
-                Modifier.textContextMenuGestures(
-                    onPreShowContextMenu = { selectionState.updateClipboardEntry() }
-                )
-            } else {
-                Modifier
-            }
-        ProvideDefaultTextContextMenuDropdown(modifier, content)
-    } else {
-        val state = remember { ContextMenuState() }
-        val coroutineScope = rememberCoroutineScope()
-        val menuItemsAvailability = remember { mutableStateOf(MenuItemsAvailability.None) }
-        val menuBuilder =
-            selectionState.contextMenuBuilder(
-                state = state,
-                itemsAvailability = menuItemsAvailability,
-                onMenuItemClicked = { item ->
-                    coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) {
-                        when (item) {
-                            TextContextMenuItems.Cut -> cut()
-                            TextContextMenuItems.Copy -> copy(false)
-                            TextContextMenuItems.Paste -> paste()
-                            TextContextMenuItems.SelectAll -> selectAll()
-                            TextContextMenuItems.Autofill -> autofill()
-                        }
+    val state = remember { ContextMenuState() }
+    val coroutineScope = rememberCoroutineScope()
+    val menuItemsAvailability = remember { mutableStateOf(MenuItemsAvailability.None) }
+    val menuBuilder =
+        selectionState.contextMenuBuilder(
+            state = state,
+            itemsAvailability = menuItemsAvailability,
+            onMenuItemClicked = { item ->
+                coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) {
+                    when (item) {
+                        TextContextMenuItems.Cut -> cut()
+                        TextContextMenuItems.Copy -> copy(false)
+                        TextContextMenuItems.Paste -> paste()
+                        TextContextMenuItems.SelectAll -> selectAll()
+                        TextContextMenuItems.Autofill -> autofill()
                     }
                 }
-            )
-
-        androidx.compose.foundation.contextmenu.ContextMenuArea(
-            state = state,
-            onDismiss = { state.close() },
-            contextMenuBuilderBlock = menuBuilder,
-            enabled = enabled,
-            onOpenGesture = {
-                coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) {
-                    menuItemsAvailability.value = selectionState.getContextMenuItemsAvailability()
-                }
-            },
-            content = content,
+            }
         )
-    }
+
+    androidx.compose.foundation.contextmenu.ContextMenuArea(
+        state = state,
+        onDismiss = { state.close() },
+        contextMenuBuilderBlock = menuBuilder,
+        enabled = enabled,
+        onOpenGesture = {
+            coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) {
+                menuItemsAvailability.value = selectionState.getContextMenuItemsAvailability()
+            }
+        },
+        content = content,
+    )
 }
 
-@OptIn(ExperimentalFoundationApi::class)
 @Composable
 internal actual fun ContextMenuArea(manager: SelectionManager, content: @Composable () -> Unit) {
-    if (ComposeFoundationFlags.isNewContextMenuEnabled) {
-        ProvideDefaultTextContextMenuDropdown(Modifier.textContextMenuGestures(), content)
-    } else {
-        val state = remember { ContextMenuState() }
-        androidx.compose.foundation.contextmenu.ContextMenuArea(
-            state = state,
-            onDismiss = { state.close() },
-            contextMenuBuilderBlock = manager.contextMenuBuilder(state),
-            content = content,
-        )
-    }
+    val state = remember { ContextMenuState() }
+    androidx.compose.foundation.contextmenu.ContextMenuArea(
+        state = state,
+        onDismiss = { state.close() },
+        contextMenuBuilderBlock = manager.contextMenuBuilder(state),
+        content = content,
+    )
 }
 
 /**
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/contextmenu/internal/DefaultTextContextMenuDropdownProvider.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/contextmenu/internal/DefaultTextContextMenuDropdownProvider.android.kt
index 63475f7..7af0df3 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/contextmenu/internal/DefaultTextContextMenuDropdownProvider.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/contextmenu/internal/DefaultTextContextMenuDropdownProvider.android.kt
@@ -33,6 +33,7 @@
 import androidx.compose.runtime.derivedStateOf
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberUpdatedState
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.paint
 import androidx.compose.ui.graphics.Color
@@ -40,7 +41,6 @@
 import androidx.compose.ui.graphics.isUnspecified
 import androidx.compose.ui.layout.ContentScale
 import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntRect
@@ -64,34 +64,20 @@
     )
 }
 
-@Composable
-internal fun ProvideDefaultTextContextMenuDropdown(
-    modifier: Modifier,
-    content: @Composable () -> Unit
-) {
-    ProvideBasicTextContextMenu(
-        modifier = modifier,
-        providableCompositionLocal = LocalTextContextMenuDropdownProvider,
-        contextMenu = { session, dataProvider, anchorLayoutCoordinates ->
-            OpenContextMenu(session, dataProvider, anchorLayoutCoordinates)
-        },
-        content = content
-    )
-}
-
 private val DefaultPopupProperties = PopupProperties(focusable = true)
 
 @Composable
 private fun OpenContextMenu(
     session: TextContextMenuSession,
     dataProvider: TextContextMenuDataProvider,
-    anchorLayoutCoordinates: () -> LayoutCoordinates,
+    anchorLayoutCoordinates: LayoutCoordinates,
 ) {
+    val updatedAnchorLayoutCoordinates by rememberUpdatedState(anchorLayoutCoordinates)
     val popupPositionProvider =
         remember(dataProvider) {
             MaintainWindowPositionPopupPositionProvider(
                 ContextMenuPopupPositionProvider({
-                    dataProvider.position(anchorLayoutCoordinates()).round()
+                    dataProvider.position(updatedAnchorLayoutCoordinates).round()
                 })
             )
         }
@@ -135,17 +121,8 @@
 // Lift of relevant M3 Icon parts.
 @Composable
 private fun IconBox(@DrawableRes resId: Int, tint: Color) {
-    val context = LocalContext.current
-    val drawableResourceId =
-        remember(context, resId) {
-            context
-                .obtainStyledAttributes(intArrayOf(resId))
-                .getResourceId(/* index= */ 0, /* defValue= */ -1)
-        }
-    if (drawableResourceId == -1) return
-
-    val painter = painterResource(drawableResourceId)
     val colorFilter = remember(tint) { if (tint.isUnspecified) null else ColorFilter.tint(tint) }
+    val painter = painterResource(resId)
     Box(
         Modifier.size(ContextMenuSpec.IconSize)
             .paint(painter, colorFilter = colorFilter, contentScale = ContentScale.Fit)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/CacheWindowLogic.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyLayoutCacheWindowStrategy.kt
similarity index 75%
rename from compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/CacheWindowLogic.kt
rename to compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyLayoutCacheWindowStrategy.kt
index 6e2c61f..82f13e4 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/CacheWindowLogic.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyLayoutCacheWindowStrategy.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2025 The Android Open Source Project
+ * Copyright 2024 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,24 +14,30 @@
  * limitations under the License.
  */
 
-package androidx.compose.foundation.lazy.layout
+package androidx.compose.foundation.lazy
 
 import androidx.collection.mutableIntIntMapOf
 import androidx.collection.mutableIntObjectMapOf
 import androidx.collection.mutableIntSetOf
 import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.gestures.snapping.singleAxisViewportSize
+import androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow
 import androidx.compose.foundation.lazy.layout.LazyLayoutPrefetchState.PrefetchHandle
-import androidx.compose.ui.unit.Density
+import androidx.compose.foundation.lazy.layout.NestedPrefetchScope
+import androidx.compose.ui.util.fastForEach
 import androidx.compose.ui.util.traceValue
 import kotlin.math.absoluteValue
 import kotlin.math.roundToInt
 import kotlin.math.sign
 
-/** Implements the logic for [LazyLayoutCacheWindow] prefetching and item preservation. */
+/**
+ * This is a transition class based on [LazyListPrefetchStrategy] where we will perform a window
+ * based prefetching for items in the direction of the scroll movement (ahead).
+ */
 @OptIn(ExperimentalFoundationApi::class)
-internal abstract class CacheWindowLogic(
+internal class CacheWindowListPrefetchStrategy(
     private val cacheWindow: LazyLayoutCacheWindow,
-) {
+) : LazyListPrefetchStrategy {
 
     /** Handles for prefetched items in the current forward window. */
     private val prefetchWindowHandles = mutableIntObjectMapOf<PrefetchHandle>()
@@ -44,7 +50,7 @@
     private val windowCache = mutableIntIntMapOf()
     private var previousPassDelta = 0f
 
-    protected var nestedPrefetchItemCount: Int = 2
+    private var nestedPrefetchItemCount: Int = 2
 
     /**
      * Indices for the start and end of the cache window. The items between
@@ -74,9 +80,9 @@
     /** Keep the latest item count where it can be used more easily. */
     private var itemsCount = 0
 
-    fun CacheWindowScope.onScroll(delta: Float) {
+    override fun LazyListPrefetchScope.onScroll(delta: Float, layoutInfo: LazyListLayoutInfo) {
         traceWindowInfo()
-        updateCacheWindow(delta)
+        updateCacheWindow(delta, layoutInfo)
         previousPassDelta = delta
         traceWindowInfo()
     }
@@ -88,16 +94,16 @@
         traceValue("prefetchWindowEndIndex", prefetchWindowEndIndex.toLong())
     }
 
-    fun CacheWindowScope.onVisibleItemsUpdated() {
-        itemsCount = totalItemsCount
+    override fun LazyListPrefetchScope.onVisibleItemsUpdated(layoutInfo: LazyListLayoutInfo) {
+        itemsCount = layoutInfo.totalItemsCount
         // If visible items changed, update cached information. Any items that were visible
         // and became out of bounds will either count for the cache window or be cancelled/removed
         // by [cancelOutOfBounds]. If any items changed sizes we re-trigger the window filling
         // update.
-        if (hasVisibleItems) {
-            forEachVisibleItem { index, mainAxisSize -> cacheVisibleItemsInfo(index, mainAxisSize) }
+        if (layoutInfo.visibleItemsInfo.isNotEmpty()) {
+            layoutInfo.visibleItemsInfo.fastForEach { cacheVisibleItemsInfo(it.index, it.size) }
             if (shouldRefillWindow) {
-                updateCacheWindow(0.0f)
+                updateCacheWindow(0.0f, layoutInfo)
                 shouldRefillWindow = false
             }
         } else {
@@ -107,39 +113,65 @@
         }
     }
 
+    override fun NestedPrefetchScope.onNestedPrefetch(firstVisibleItemIndex: Int) {
+        repeat(nestedPrefetchItemCount) { schedulePrecomposition(firstVisibleItemIndex + it) }
+    }
+
     fun hasValidBounds() =
         prefetchWindowStartIndex != Int.MAX_VALUE && prefetchWindowEndIndex != Int.MIN_VALUE
 
-    private fun CacheWindowScope.updateCacheWindow(delta: Float) {
-        if (hasVisibleItems) {
-            val viewport = mainAxisViewportSize
+    private fun LazyListPrefetchScope.updateCacheWindow(
+        delta: Float,
+        layoutInfo: LazyListLayoutInfo
+    ) {
+        with(layoutInfo) {
+            if (visibleItemsInfo.isNotEmpty()) {
+                val firstVisibleItem = visibleItemsInfo.first()
+                val lastVisibleItem = visibleItemsInfo.last()
 
-            val prefetchForwardWindow =
-                with(cacheWindow) { density?.calculateAheadWindow(viewport) ?: 0 }
-            val keepAroundWindow =
-                with(cacheWindow) { density?.calculateBehindWindow(viewport) ?: 0 }
+                val viewport = singleAxisViewportSize
+                // how much of the first item is peeking out of view at the start of the layout.
+                val firstItemOverflowOffset =
+                    (firstVisibleItem.offset + beforeContentPadding).coerceAtMost(0)
 
-            // save latest item count
-            itemsCount = totalItemsCount
+                // how much of the last item is peeking out of view at the end of the layout
+                val lastItemOverflowOffset =
+                    lastVisibleItem.offset + lastVisibleItem.size + mainAxisItemSpacing
 
-            onKeepAround(
-                visibleWindowStart = firstVisibleItemIndex,
-                visibleWindowEnd = lastVisibleItemIndex,
-                keepAroundWindow = keepAroundWindow,
-                scrollDelta = delta,
-                itemsCount = totalItemsCount,
-                mainAxisExtraSpaceStart = mainAxisExtraSpaceStart,
-                mainAxisExtraSpaceEnd = mainAxisExtraSpaceEnd,
-            )
+                // extra space is always positive in this context
+                val mainAxisExtraSpaceStart = firstItemOverflowOffset.absoluteValue
 
-            onPrefetchForward(
-                visibleWindowStart = firstVisibleItemIndex,
-                visibleWindowEnd = lastVisibleItemIndex,
-                prefetchForwardWindow = prefetchForwardWindow,
-                scrollDelta = delta,
-                mainAxisExtraSpaceStart = mainAxisExtraSpaceStart,
-                mainAxisExtraSpaceEnd = mainAxisExtraSpaceEnd
-            )
+                // extra space is always positive in this context
+                val mainAxisExtraSpaceEnd =
+                    (lastItemOverflowOffset - viewportEndOffset).absoluteValue
+                val density = (layoutInfo as? LazyListMeasureResult)?.density
+                val prefetchForwardWindow =
+                    with(cacheWindow) { density?.calculateAheadWindow(viewport) ?: 0 }
+                val keepAroundWindow =
+                    with(cacheWindow) { density?.calculateBehindWindow(viewport) ?: 0 }
+
+                // save latest item count
+                itemsCount = totalItemsCount
+
+                onKeepAround(
+                    visibleWindowStart = firstVisibleItem.index,
+                    visibleWindowEnd = lastVisibleItem.index,
+                    keepAroundWindow = keepAroundWindow,
+                    scrollDelta = delta,
+                    itemsCount = totalItemsCount,
+                    mainAxisExtraSpaceStart = mainAxisExtraSpaceStart,
+                    mainAxisExtraSpaceEnd = mainAxisExtraSpaceEnd,
+                )
+
+                onPrefetchForward(
+                    visibleWindowStart = firstVisibleItem.index,
+                    visibleWindowEnd = lastVisibleItem.index,
+                    prefetchForwardWindow = prefetchForwardWindow,
+                    scrollDelta = delta,
+                    mainAxisExtraSpaceStart = mainAxisExtraSpaceStart,
+                    mainAxisExtraSpaceEnd = mainAxisExtraSpaceEnd
+                )
+            }
         }
     }
 
@@ -162,7 +194,7 @@
      * prefetch returns, we check if the window is filled and if not we schedule the next
      * prefetching.
      */
-    private fun CacheWindowScope.onPrefetchForward(
+    private fun LazyListPrefetchScope.onPrefetchForward(
         visibleWindowStart: Int,
         visibleWindowEnd: Int,
         prefetchForwardWindow: Int,
@@ -278,7 +310,7 @@
         }
     }
 
-    private fun CacheWindowScope.getItemSizeOrPrefetch(index: Int, isUrgent: Boolean): Int {
+    private fun LazyListPrefetchScope.getItemSizeOrPrefetch(index: Int, isUrgent: Boolean): Int {
         return if (windowCache.containsKey(index)) {
             windowCache[index]
         } else if (prefetchWindowHandles.containsKey(index)) {
@@ -339,13 +371,13 @@
      * Item prefetching finished, we can cache its information and schedule the next prefetching if
      * needed.
      */
-    private fun CacheWindowScope.onItemPrefetched(index: Int, itemSize: Int) {
+    private fun LazyListPrefetchScope.onItemPrefetched(index: Int, itemSize: Int) {
         cachePrefetchedItem(index, itemSize)
         scheduleNextItemIfNeeded()
         traceWindowInfo()
     }
 
-    private fun CacheWindowScope.scheduleNextItemIfNeeded() {
+    private fun LazyListPrefetchScope.scheduleNextItemIfNeeded() {
         var nextPrefetchableIndex: Int = -1
         // if was scrolling forward
         if (previousPassDelta.sign <= 0) {
@@ -364,30 +396,4 @@
     }
 }
 
-@OptIn(ExperimentalFoundationApi::class)
-/** Bridge between LazyLayout and its implementation. */
-internal interface CacheWindowScope {
-    val totalItemsCount: Int
-    val visibleItemCount: Int
-    val hasVisibleItems: Boolean
-    val mainAxisExtraSpaceStart: Int
-    val mainAxisExtraSpaceEnd: Int
-    val firstVisibleItemIndex: Int
-    val lastVisibleItemIndex: Int
-    val mainAxisViewportSize: Int
-    val density: Density?
-
-    fun schedulePrefetch(laneIndex: Int, onItemPrefetched: (Int) -> Unit): PrefetchHandle
-
-    fun getVisibleItemSize(indexInVisibleItems: Int): Int
-
-    fun getVisibleItemIndex(indexInVisibleItems: Int): Int
-}
-
-internal inline fun CacheWindowScope.forEachVisibleItem(
-    action: (itemIndex: Int, mainAxisSize: Int) -> Unit
-) {
-    repeat(visibleItemCount) { action(getVisibleItemIndex(it), getVisibleItemSize(it)) }
-}
-
 private const val InvalidItemSize = -1
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
index 9124c52..6916d42a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
@@ -26,7 +26,6 @@
 import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.calculateEndPadding
 import androidx.compose.foundation.layout.calculateStartPadding
-import androidx.compose.foundation.lazy.layout.CacheWindowLogic
 import androidx.compose.foundation.lazy.layout.LazyLayout
 import androidx.compose.foundation.lazy.layout.LazyLayoutMeasureScope
 import androidx.compose.foundation.lazy.layout.StickyItemsPlacement
@@ -390,7 +389,7 @@
 
             state.applyMeasureResult(measureResult, isLookingAhead)
             // apply keep around after updating the strategy with measure result.
-            (state.prefetchStrategy as? CacheWindowLogic)?.keepAroundItems(
+            (state.prefetchStrategy as? CacheWindowListPrefetchStrategy)?.keepAroundItems(
                 measureResult.visibleItemsInfo,
                 measuredItemProvider
             )
@@ -399,7 +398,7 @@
     }
 
 @OptIn(ExperimentalFoundationApi::class)
-private fun CacheWindowLogic.keepAroundItems(
+private fun CacheWindowListPrefetchStrategy.keepAroundItems(
     visibleItemsList: List<LazyListMeasuredItem>,
     measuredItemProvider: LazyListMeasuredItemProvider
 ) {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListCacheWindowStrategy.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListCacheWindowStrategy.kt
deleted file mode 100644
index 5129ecd..0000000
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListCacheWindowStrategy.kt
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.foundation.lazy
-
-import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.foundation.gestures.snapping.singleAxisViewportSize
-import androidx.compose.foundation.lazy.layout.CacheWindowLogic
-import androidx.compose.foundation.lazy.layout.CacheWindowScope
-import androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow
-import androidx.compose.foundation.lazy.layout.LazyLayoutPrefetchState.PrefetchHandle
-import androidx.compose.foundation.lazy.layout.NestedPrefetchScope
-import androidx.compose.ui.unit.Density
-import kotlin.math.absoluteValue
-
-/**
- * This is a transition class based on [androidx.compose.foundation.lazy.LazyListPrefetchStrategy]
- * where we will perform a window based prefetching for items in the direction of the scroll
- * movement (ahead).
- */
-@OptIn(ExperimentalFoundationApi::class)
-internal class LazyListCacheWindowStrategy(cacheWindow: LazyLayoutCacheWindow) :
-    CacheWindowLogic(cacheWindow), LazyListPrefetchStrategy {
-    private val cacheWindowScope = LazyListCacheWindowScope()
-
-    override fun LazyListPrefetchScope.onScroll(delta: Float, layoutInfo: LazyListLayoutInfo) {
-        applyWindowScope(layoutInfo) { onScroll(delta) }
-    }
-
-    override fun LazyListPrefetchScope.onVisibleItemsUpdated(layoutInfo: LazyListLayoutInfo) {
-        applyWindowScope(layoutInfo) { onVisibleItemsUpdated() }
-    }
-
-    override fun NestedPrefetchScope.onNestedPrefetch(firstVisibleItemIndex: Int) {
-        repeat(nestedPrefetchItemCount) { schedulePrecomposition(firstVisibleItemIndex + it) }
-    }
-
-    /** Adapts the LazyListPrefetchScope and LazyListLayoutInfo to a single scope. */
-    private inline fun LazyListPrefetchScope.applyWindowScope(
-        layoutInfo: LazyListLayoutInfo,
-        block: CacheWindowScope.() -> Unit
-    ) {
-        cacheWindowScope.layoutInfo = layoutInfo
-        cacheWindowScope.prefetchScope = this
-        block(cacheWindowScope)
-    }
-}
-
-@OptIn(ExperimentalFoundationApi::class)
-internal class LazyListCacheWindowScope() : CacheWindowScope {
-    lateinit var layoutInfo: LazyListLayoutInfo
-    lateinit var prefetchScope: LazyListPrefetchScope
-
-    override val totalItemsCount: Int
-        get() = layoutInfo.totalItemsCount
-
-    override val hasVisibleItems: Boolean
-        get() = layoutInfo.visibleItemsInfo.isNotEmpty()
-
-    override val mainAxisExtraSpaceStart: Int
-        get() {
-            val firstVisibleItem = layoutInfo.visibleItemsInfo.first()
-            // how much of the first item is peeking out of view at the start of the layout.
-            val firstItemOverflowOffset =
-                (firstVisibleItem.offset + layoutInfo.beforeContentPadding).coerceAtMost(0)
-            // extra space is always positive in this context
-            return firstItemOverflowOffset.absoluteValue
-        }
-
-    override val mainAxisExtraSpaceEnd: Int
-        get() {
-            val lastVisibleItem = layoutInfo.visibleItemsInfo.last()
-            // how much of the last item is peeking out of view at the end of the layout
-            val lastItemOverflowOffset =
-                lastVisibleItem.offset + lastVisibleItem.size + layoutInfo.mainAxisItemSpacing
-
-            // extra space is always positive in this context
-            return (lastItemOverflowOffset - layoutInfo.viewportEndOffset).absoluteValue
-        }
-
-    override val firstVisibleItemIndex: Int
-        get() = layoutInfo.visibleItemsInfo.first().index
-
-    override val lastVisibleItemIndex: Int
-        get() = layoutInfo.visibleItemsInfo.last().index
-
-    override val mainAxisViewportSize: Int
-        get() = layoutInfo.singleAxisViewportSize
-
-    override val density: Density?
-        get() = (layoutInfo as? LazyListMeasureResult)?.density
-
-    override fun schedulePrefetch(laneIndex: Int, onItemPrefetched: (Int) -> Unit): PrefetchHandle {
-        return prefetchScope.schedulePrefetch(laneIndex, onItemPrefetched)
-    }
-
-    override val visibleItemCount: Int
-        get() = layoutInfo.visibleItemsInfo.size
-
-    override fun getVisibleItemSize(indexInVisibleItems: Int): Int =
-        layoutInfo.visibleItemsInfo[indexInVisibleItems].size
-
-    override fun getVisibleItemIndex(indexInVisibleItems: Int): Int =
-        layoutInfo.visibleItemsInfo[indexInVisibleItems].index
-}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
index 5cb8856..bd97653 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
@@ -130,7 +130,7 @@
         LazyListState(
             initialFirstVisibleItemIndex,
             initialFirstVisibleItemScrollOffset,
-            prefetchStrategy = LazyListCacheWindowStrategy(cacheWindow)
+            prefetchStrategy = CacheWindowListPrefetchStrategy(cacheWindow)
         )
     }
 }
@@ -171,7 +171,7 @@
     ) : this(
         firstVisibleItemIndex,
         firstVisibleItemScrollOffset,
-        LazyListCacheWindowStrategy(cacheWindow)
+        CacheWindowListPrefetchStrategy(cacheWindow)
     )
 
     /**
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt
index aa08c14..9880185 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt
@@ -89,7 +89,7 @@
 
     override fun getSlotsToRetain(slotIds: SubcomposeSlotReusePolicy.SlotIdsSet) {
         countPerType.clear()
-        slotIds.fastForEach { slotId ->
+        slotIds.forEach { slotId ->
             val type = factory.getContentType(slotId)
             val currentCount = countPerType.getOrDefault(type, 0)
             if (currentCount == MaxItemsToRetainForReuse) {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutCacheWindow.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutCacheWindow.kt
index bc53149..155be34 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutCacheWindow.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutCacheWindow.kt
@@ -16,7 +16,6 @@
 
 package androidx.compose.foundation.lazy.layout
 
-import androidx.annotation.FloatRange
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.runtime.Stable
 import androidx.compose.ui.unit.Density
@@ -33,20 +32,16 @@
 interface LazyLayoutCacheWindow {
 
     /**
-     * Calculates the prefetch window area in pixels for prefetching on the scroll direction, "ahead
-     * window". The prefetch window strategy will prepare items in the ahead area in advance s they
-     * are ready to be used when they become visible.
-     *
-     * @param viewport The size of the viewport in this Lazy Layout in pixels.
+     * Calculates the prefetch window area for prefetching on the scroll direction, "ahead window".
+     * The prefetch window strategy will prepare items in the ahead area in advance so they're ready
+     * to be used when they become visible.
      */
     fun Density.calculateAheadWindow(viewport: Int): Int = 0
 
     /**
-     * Calculates the window area in pixels for keeping items in the scroll counter direction,
-     * "behind window". Items in the behind window will not be disposed and can be accessed more
-     * quickly if they become visible again.
-     *
-     * @param viewport The size of the viewport in this Lazy Layout in pixels.
+     * Calculates the window area for keeping items in the scroll counter direction, "behind
+     * window". Items in the behind window will not be disposed and can be accessed more quickly if
+     * they become visible again.
      */
     fun Density.calculateBehindWindow(viewport: Int): Int = 0
 }
@@ -91,8 +86,8 @@
  */
 @ExperimentalFoundationApi
 fun LazyLayoutCacheWindow(
-    @FloatRange(from = 0.0) aheadFraction: Float = 0.0f,
-    @FloatRange(from = 0.0) behindFraction: Float = 0.0f
+    aheadFraction: Float = 0.0f,
+    behindFraction: Float = 0.0f
 ): LazyLayoutCacheWindow = FractionLazyLayoutCacheWindow(aheadFraction, behindFraction)
 
 @OptIn(ExperimentalFoundationApi::class)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState.kt
index e37bf5f..d58d3e4 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState.kt
@@ -166,11 +166,8 @@
         /** The amount of placeables composed into this item. */
         val placeablesCount: Int
 
-        /** The index of the prefetched item. */
-        val index: Int
-
-        /** Retrieves the latest measured size for a given placeable [placeableIndex] in pixels. */
-        fun getSize(placeableIndex: Int): IntSize
+        /** Retrieves the latest measured size for a given placeable [index] in pixels. */
+        fun getSize(index: Int): IntSize
     }
 
     private inner class NestedPrefetchScopeImpl : NestedPrefetchScope {
@@ -287,10 +284,6 @@
 internal class Averages {
     /** Average time the full composition phase has taken. */
     var compositionTimeNanos: Long = 0L
-    /** Average time needed to resume the pausable composition until the next interruption. */
-    var resumeTimeNanos: Long = 0L
-    /** Average time needed to pause the pausable composition. */
-    var pauseTimeNanos: Long = 0L
     /** Average time the apply phase has taken. */
     var applyTimeNanos: Long = 0L
     /** Average time the measure phase has taken. */
@@ -300,14 +293,6 @@
         compositionTimeNanos = calculateAverageTime(timeNanos, compositionTimeNanos)
     }
 
-    fun saveResumeTimeNanos(timeNanos: Long) {
-        resumeTimeNanos = calculateAverageTime(timeNanos, resumeTimeNanos)
-    }
-
-    fun savePauseTimeNanos(timeNanos: Long) {
-        pauseTimeNanos = calculateAverageTime(timeNanos, pauseTimeNanos)
-    }
-
     fun saveApplyTimeNanos(timeNanos: Long) {
         applyTimeNanos = calculateAverageTime(timeNanos, applyTimeNanos)
     }
@@ -382,7 +367,7 @@
 
     @ExperimentalFoundationApi
     private inner class HandleAndRequestImpl(
-        override val index: Int,
+        private val index: Int,
         private val prefetchMetrics: PrefetchMetrics,
         private val onItemPremeasured: (LazyLayoutPrefetchResultScope.() -> Unit)?
     ) : PrefetchHandle, PrefetchRequest, LazyLayoutPrefetchResultScope {
@@ -422,8 +407,8 @@
         override val placeablesCount: Int
             get() = (precomposeHandle?.placeablesCount ?: 0)
 
-        override fun getSize(placeableIndex: Int): IntSize {
-            return (precomposeHandle?.getSize(placeableIndex) ?: IntSize.Zero)
+        override fun getSize(index: Int): IntSize {
+            return (precomposeHandle?.getSize(index) ?: IntSize.Zero)
         }
 
         private fun shouldExecute(available: Long, average: Long): Boolean {
@@ -478,27 +463,17 @@
             // and manually update it later by calling updateElapsedAndAvailableTime()
             resetAvailableTimeTo(availableTimeNanos())
             if (!isComposed) {
-                if (ComposeFoundationFlags.isPausableCompositionInPrefetchEnabled) {
-                    if (
-                        shouldExecute(
-                            availableTimeNanos,
-                            average.resumeTimeNanos + average.pauseTimeNanos
-                        )
-                    ) {
-                        trace("compose:lazy:prefetch:compose") {
-                            performPausableComposition(itemProvider, contentType, average)
-                        }
-                    }
-                } else {
-                    if (shouldExecute(availableTimeNanos, average.compositionTimeNanos)) {
-                        trace("compose:lazy:prefetch:compose") {
+                if (shouldExecute(availableTimeNanos, average.compositionTimeNanos)) {
+                    trace("compose:lazy:prefetch:compose") {
+                        if (ComposeFoundationFlags.isPausableCompositionInPrefetchEnabled) {
+                            performPausableComposition(itemProvider, contentType)
+                        } else {
                             performFullComposition(itemProvider, contentType)
                         }
-                        updateElapsedAndAvailableTime()
-                        average.saveCompositionTimeNanos(elapsedTimeNanos)
                     }
-                }
-                if (!isComposed) {
+                    updateElapsedAndAvailableTime()
+                    average.saveCompositionTimeNanos(elapsedTimeNanos)
+                } else {
                     return true
                 }
             }
@@ -559,46 +534,24 @@
             return false
         }
 
-        private var pauseRequested = false
-
         private fun performPausableComposition(
             itemProvider: LazyLayoutItemProvider,
-            contentType: Any?,
-            averages: Averages
+            contentType: Any?
         ) {
-            val composition =
-                pausedPrecomposition
-                    ?: run {
-                        val key = itemProvider.getKey(index)
-                        val content = itemContentFactory.getContent(index, key, contentType)
-                        subcomposeLayoutState.createPausedPrecomposition(key, content).also {
-                            pausedPrecomposition = it
-                        }
-                    }
-
-            pauseRequested = false
-
-            composition.resume {
-                if (!pauseRequested) {
-                    updateElapsedAndAvailableTime()
-                    averages.saveResumeTimeNanos(elapsedTimeNanos)
-                    pauseRequested =
-                        !shouldExecute(
-                            availableTimeNanos,
-                            averages.resumeTimeNanos + averages.pauseTimeNanos
-                        )
+            requirePrecondition(precomposeHandle == null) { "Request was already composed!" }
+            val key = itemProvider.getKey(index)
+            val content = itemContentFactory.getContent(index, key, contentType)
+            val pausedPrecomposition =
+                subcomposeLayoutState.createPausedPrecomposition(key, content)
+            while (!pausedPrecomposition.isComplete) {
+                // as a first step we don't really pause the composition, but we split the
+                // whole composition and the apply step.
+                pausedPrecomposition.resume { /*should never pause*/
+                    false
                 }
-                pauseRequested
             }
-
-            updateElapsedAndAvailableTime()
-            if (pauseRequested) {
-                averages.savePauseTimeNanos(elapsedTimeNanos)
-            } else {
-                averages.saveResumeTimeNanos(elapsedTimeNanos)
-            }
-
-            isComposed = composition.isComplete
+            this.pausedPrecomposition = pausedPrecomposition
+            isComposed = true
         }
 
         private fun performFullComposition(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicTextField.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicTextField.kt
index f030605..0186f5698 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicTextField.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicTextField.kt
@@ -369,7 +369,13 @@
         )
     }
 
-    DisposableEffect(textFieldSelectionState) { onDispose { textFieldSelectionState.dispose() } }
+    DisposableEffect(textFieldSelectionState) {
+        // This runs before the above SideEffect, but we need to ensure the clipboard is updated
+        // before updateClipboardEntry is called, so set it here as well.
+        textFieldSelectionState.updateClipboard(currentClipboard)
+        coroutineScope.launch { textFieldSelectionState.updateClipboardEntry() }
+        onDispose { textFieldSelectionState.dispose() }
+    }
 
     val handwritingEnabled =
         !isPassword &&
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 69d6e5e..bc03131 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
@@ -473,7 +473,10 @@
     val showCursor = enabled && !readOnly && windowInfo.isWindowFocused && !state.hasHighlight()
     val cursorModifier = Modifier.cursor(state, value, offsetMapping, cursorBrush, showCursor)
 
-    DisposableEffect(manager) { onDispose { manager.hideSelectionToolbar() } }
+    DisposableEffect(manager) {
+        coroutineScope.launch { manager.updateClipboardEntry() }
+        onDispose { manager.hideSelectionToolbar() }
+    }
 
     DisposableEffect(imeOptions) {
         if (state.hasFocus) {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/contextmenu/gestures/RightClickGestures.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/contextmenu/gestures/RightClickGestures.kt
deleted file mode 100644
index 6fdd1e5..0000000
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/contextmenu/gestures/RightClickGestures.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.foundation.text.contextmenu.gestures
-
-import androidx.compose.foundation.gestures.awaitEachGesture
-import androidx.compose.foundation.gestures.waitForUpOrCancellation
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.input.pointer.AwaitPointerEventScope
-import androidx.compose.ui.input.pointer.PointerInputChange
-import androidx.compose.ui.input.pointer.PointerInputScope
-import androidx.compose.ui.input.pointer.changedToDown
-import androidx.compose.ui.input.pointer.isSecondaryPressed
-import androidx.compose.ui.util.fastAll
-
-/** Similar to PointerInputScope.detectTapAndPress, but for right clicks. */
-internal suspend fun PointerInputScope.onRightClickDown(onDown: (Offset) -> Unit) {
-    awaitEachGesture {
-        val down = awaitFirstRightClickDown()
-        down.consume()
-        onDown(down.position)
-        waitForUpOrCancellation()?.consume()
-    }
-}
-
-/**
- * Similar to AwaitPointerEventScope.awaitFirstDown, but with an additional check to ensure it is a
- * right click.
- */
-private suspend fun AwaitPointerEventScope.awaitFirstRightClickDown(): PointerInputChange {
-    while (true) {
-        val event = awaitPointerEvent()
-        if (event.buttons.isSecondaryPressed && event.changes.fastAll { it.changedToDown() }) {
-            return event.changes[0]
-        }
-    }
-}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/contextmenu/modifier/TextContextMenuGesturesModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/contextmenu/modifier/TextContextMenuGesturesModifier.kt
deleted file mode 100644
index d323377..0000000
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/contextmenu/modifier/TextContextMenuGesturesModifier.kt
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.foundation.text.contextmenu.modifier
-
-import androidx.compose.foundation.internal.checkPreconditionNotNull
-import androidx.compose.foundation.text.contextmenu.data.TextContextMenuData
-import androidx.compose.foundation.text.contextmenu.gestures.onRightClickDown
-import androidx.compose.foundation.text.contextmenu.provider.LocalTextContextMenuDropdownProvider
-import androidx.compose.foundation.text.contextmenu.provider.TextContextMenuDataProvider
-import androidx.compose.foundation.text.contextmenu.provider.TextContextMenuProvider
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.neverEqualPolicy
-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.geometry.Size
-import androidx.compose.ui.input.pointer.SuspendingPointerInputModifierNode
-import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.node.CompositionLocalConsumerModifierNode
-import androidx.compose.ui.node.DelegatingNode
-import androidx.compose.ui.node.GlobalPositionAwareModifierNode
-import androidx.compose.ui.node.ModifierNodeElement
-import androidx.compose.ui.node.currentValueOf
-import androidx.compose.ui.platform.InspectorInfo
-import kotlinx.coroutines.launch
-
-/**
- * Shows the dropdown context menu (via [LocalTextContextMenuDropdownProvider]) when a right click
- * is received.
- *
- * @param onPreShowContextMenu A lambda that will be invoked right before
- *   [TextContextMenuProvider.showTextContextMenu].
- */
-internal fun Modifier.textContextMenuGestures(
-    onPreShowContextMenu: (suspend () -> Unit)? = null,
-): Modifier = this then TextContextMenuGestureElement(onPreShowContextMenu)
-
-private class TextContextMenuGestureElement(
-    private val onPreShowContextMenu: (suspend () -> Unit)?,
-) : ModifierNodeElement<TextContextMenuGestureNode>() {
-    override fun create(): TextContextMenuGestureNode =
-        TextContextMenuGestureNode(onPreShowContextMenu)
-
-    override fun update(node: TextContextMenuGestureNode) {
-        node.update(onPreShowContextMenu)
-    }
-
-    override fun InspectorInfo.inspectableProperties() {
-        name = "TextContextMenuGestures"
-        properties["onPreShowContextMenu"] = onPreShowContextMenu
-    }
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is TextContextMenuGestureElement) return false
-
-        if (onPreShowContextMenu !== other.onPreShowContextMenu) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int = onPreShowContextMenu.hashCode()
-}
-
-private class TextContextMenuGestureNode(
-    private var onPreShowContextMenu: (suspend () -> Unit)?,
-) : DelegatingNode(), CompositionLocalConsumerModifierNode, GlobalPositionAwareModifierNode {
-
-    private companion object {
-        private const val MESSAGE = "Tried to open context menu before the anchor was placed."
-    }
-
-    private var localCoordinates: LayoutCoordinates? by mutableStateOf(null, neverEqualPolicy())
-
-    init {
-        delegate(SuspendingPointerInputModifierNode { onRightClickDown(::tryShowContextMenu) })
-    }
-
-    fun update(
-        onPreShowContextMenu: (suspend () -> Unit)?,
-    ) {
-        this.onPreShowContextMenu = onPreShowContextMenu
-    }
-
-    override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
-        this.localCoordinates = coordinates
-    }
-
-    private fun tryShowContextMenu(localClickOffset: Offset) {
-        val provider = currentValueOf(LocalTextContextMenuDropdownProvider) ?: return
-        val dataProvider = ClickTextContextMenuDataProvider(localClickOffset)
-        coroutineScope.launch {
-            onPreShowContextMenu?.invoke()
-            provider.showTextContextMenu(dataProvider)
-        }
-    }
-
-    private inner class ClickTextContextMenuDataProvider(
-        private val localClickOffset: Offset,
-    ) : TextContextMenuDataProvider {
-        override fun position(destinationCoordinates: LayoutCoordinates): Offset {
-            val localCoordinates = checkPreconditionNotNull(localCoordinates) { MESSAGE }
-            return destinationCoordinates.localPositionOf(localCoordinates, localClickOffset)
-        }
-
-        override fun contentBounds(destinationCoordinates: LayoutCoordinates): Rect =
-            Rect(position(destinationCoordinates), Size.Zero)
-
-        override fun data(): TextContextMenuData = collectTextContextMenuData()
-    }
-}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/contextmenu/provider/BasicTextContextMenuProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/contextmenu/provider/BasicTextContextMenuProvider.kt
index 027412f..afc5b9c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/contextmenu/provider/BasicTextContextMenuProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/contextmenu/provider/BasicTextContextMenuProvider.kt
@@ -16,8 +16,8 @@
 
 package androidx.compose.foundation.text.contextmenu.provider
 
+import androidx.annotation.VisibleForTesting
 import androidx.compose.foundation.MutatorMutex
-import androidx.compose.foundation.internal.checkPreconditionNotNull
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.text.contextmenu.data.TextContextMenuSession
 import androidx.compose.runtime.Composable
@@ -27,7 +27,6 @@
 import androidx.compose.runtime.ProvidableCompositionLocal
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.neverEqualPolicy
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
@@ -59,13 +58,14 @@
         (
             session: TextContextMenuSession,
             dataProvider: TextContextMenuDataProvider,
-            anchorLayoutCoordinates: () -> LayoutCoordinates,
+            anchorLayoutCoordinates: LayoutCoordinates,
         ) -> Unit,
     content: @Composable () -> Unit
 ) {
     ProvideBasicTextContextMenu(Modifier, providableCompositionLocal, contextMenu, content)
 }
 
+@VisibleForTesting
 @Composable
 internal fun ProvideBasicTextContextMenu(
     modifier: Modifier,
@@ -75,24 +75,21 @@
         (
             session: TextContextMenuSession,
             dataProvider: TextContextMenuDataProvider,
-            anchorLayoutCoordinates: () -> LayoutCoordinates,
+            anchorLayoutCoordinates: LayoutCoordinates,
         ) -> Unit,
     content: @Composable () -> Unit
 ) {
     val provider = remember(contextMenu) { BasicTextContextMenuProvider(contextMenu) }
     DisposableEffect(provider) { onDispose { provider.cancel() } }
 
-    var layoutCoordinates: LayoutCoordinates? by remember {
-        mutableStateOf(null, neverEqualPolicy())
-    }
-
-    CompositionLocalProvider(providableCompositionLocal provides provider) {
-        Box(
-            propagateMinConstraints = true,
-            modifier = modifier.onGloballyPositioned { layoutCoordinates = it }
-        ) {
+    var layoutCoordinates by remember { mutableStateOf<LayoutCoordinates?>(null) }
+    Box(
+        propagateMinConstraints = true,
+        modifier = modifier.onGloballyPositioned { layoutCoordinates = it }
+    ) {
+        CompositionLocalProvider(providableCompositionLocal provides provider) {
             content()
-            provider.ContextMenu { checkPreconditionNotNull(layoutCoordinates) }
+            provider.ContextMenu(layoutCoordinates)
         }
     }
 }
@@ -103,7 +100,7 @@
         (
             session: TextContextMenuSession,
             dataProvider: TextContextMenuDataProvider,
-            anchorLayoutCoordinates: () -> LayoutCoordinates,
+            anchorLayoutCoordinates: LayoutCoordinates,
         ) -> Unit
 ) : TextContextMenuProvider {
     private val mutatorMutex = MutatorMutex()
@@ -122,7 +119,8 @@
     }
 
     @Composable
-    fun ContextMenu(anchorLayoutCoordinates: () -> LayoutCoordinates) {
+    fun ContextMenu(anchorLayoutCoordinates: LayoutCoordinates?) {
+        anchorLayoutCoordinates ?: return
         val session = session ?: return
         contextMenuBlock(session, session.dataProvider, anchorLayoutCoordinates)
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionState.kt
index 486925a..a61bbbe 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionState.kt
@@ -373,6 +373,10 @@
         this.isPassword = isPassword
     }
 
+    fun updateClipboard(clipboard: Clipboard) {
+        this.clipboard = clipboard
+    }
+
     /** Implements the complete set of gestures supported by the cursor handle. */
     suspend fun PointerInputScope.cursorHandleGestures() {
         coroutineScope {
diff --git a/compose/integration-tests/hero/jetsnack/jetsnack-implementation/build.gradle b/compose/integration-tests/hero/jetsnack/jetsnack-implementation/build.gradle
index 6a77c78..f36383c 100644
--- a/compose/integration-tests/hero/jetsnack/jetsnack-implementation/build.gradle
+++ b/compose/integration-tests/hero/jetsnack/jetsnack-implementation/build.gradle
@@ -46,7 +46,7 @@
     implementation("androidx.cardview:cardview:1.0.0")
 
     implementation(libs.kotlinStdlib)
-    implementation("androidx.activity:activity-compose:1.10.1")
+    implementation(project(":activity:activity-compose"))
     implementation(project(":compose:foundation:foundation-layout"))
     implementation(project(":compose:foundation:foundation"))
     implementation(project(":compose:material:material"))
diff --git a/compose/integration-tests/macrobenchmark-target/build.gradle b/compose/integration-tests/macrobenchmark-target/build.gradle
index 67b66ab..0181c01 100644
--- a/compose/integration-tests/macrobenchmark-target/build.gradle
+++ b/compose/integration-tests/macrobenchmark-target/build.gradle
@@ -53,7 +53,7 @@
 
     implementation(libs.kotlinStdlib)
     implementation(libs.material)
-    implementation("androidx.activity:activity-compose:1.10.1")
+    implementation(project(":activity:activity-compose"))
     implementation("androidx.appcompat:appcompat:1.4.1")
     implementation("androidx.cardview:cardview:1.0.0")
     // old version of common-java8 conflicts with newer version, because both have
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 526f5a8..644965f 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
@@ -47,7 +47,7 @@
         lerp(
             MaterialTheme.colorScheme.surface,
             MaterialTheme.colorScheme.surfaceColorAtElevation(elevation = 3.dp),
-            FastOutLinearInEasing.transform(scrollBehavior?.state?.overlappedFraction() ?: 0f)
+            FastOutLinearInEasing.transform(scrollBehavior?.state?.overlappedFraction ?: 0f)
         )
 
     val foregroundColors =
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
index 9ff33dd..00cf2d9 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
@@ -1412,23 +1412,6 @@
     }
 
     @Test
-    fun outlinedTextField_withTrailingIcon_inIntrinsicHeight_andTooShortWidth_doesNotCrash() {
-        // Regression test for b/328954156
-        rule.setContent {
-            Box(Modifier.width(200.dp)) {
-                Box(Modifier.height(IntrinsicSize.Min)) {
-                    OutlinedTextField(
-                        state = rememberTextFieldState(),
-                        modifier = Modifier.padding(100.dp),
-                        trailingIcon = { Box(Modifier.size(20.dp)) },
-                    )
-                }
-            }
-        }
-        // Nothing to assert; just make sure it doesn't crash
-    }
-
-    @Test
     fun outlinedTextField_stringOverload_doesNotCallOnValueChange_whenCompositionUpdatesOnly() {
         var callbackCounter = 0
 
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
index 20e1e91..8136e1b 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
@@ -1478,23 +1478,6 @@
     }
 
     @Test
-    fun textField_withTrailingIcon_inIntrinsicHeight_andTooShortWidth_doesNotCrash() {
-        // Regression test for b/328954156
-        rule.setContent {
-            Box(Modifier.width(200.dp)) {
-                Box(Modifier.height(IntrinsicSize.Min)) {
-                    TextField(
-                        state = rememberTextFieldState(),
-                        modifier = Modifier.padding(100.dp),
-                        trailingIcon = { Box(Modifier.size(20.dp)) },
-                    )
-                }
-            }
-        }
-        // Nothing to assert; just make sure it doesn't crash
-    }
-
-    @Test
     fun textField_stringOverload_doesNotCallOnValueChange_whenCompositionUpdatesOnly() {
         var callbackCounter = 0
 
diff --git a/compose/material/material/src/androidMain/res/values-af/strings.xml b/compose/material/material/src/androidMain/res/values-af/strings.xml
index ddce6af..eede087 100644
--- a/compose/material/material/src/androidMain/res/values-af/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-af/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Opletberig"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Opletberig"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-am/strings.xml b/compose/material/material/src/androidMain/res/values-am/strings.xml
index cce41be..ec8e8e7 100644
--- a/compose/material/material/src/androidMain/res/values-am/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-am/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"ማንቂያ"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"ማንቂያ"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-ar/strings.xml b/compose/material/material/src/androidMain/res/values-ar/strings.xml
index 5aeebd9..4db049a 100644
--- a/compose/material/material/src/androidMain/res/values-ar/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-ar/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"تنبيه"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"تنبيه"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-as/strings.xml b/compose/material/material/src/androidMain/res/values-as/strings.xml
index e240e78..c5a47f6 100644
--- a/compose/material/material/src/androidMain/res/values-as/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-as/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"সতৰ্কবাৰ্তা"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"সতৰ্কবাৰ্তা"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-az/strings.xml b/compose/material/material/src/androidMain/res/values-az/strings.xml
index 59ebe11..0018239 100644
--- a/compose/material/material/src/androidMain/res/values-az/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-az/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Xəbərdarlıq"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Xəbərdarlıq"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-b+sr+Latn/strings.xml b/compose/material/material/src/androidMain/res/values-b+sr+Latn/strings.xml
index d84faa9..bc20a68 100644
--- a/compose/material/material/src/androidMain/res/values-b+sr+Latn/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-b+sr+Latn/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Obaveštenje"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Obaveštenje"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-be/strings.xml b/compose/material/material/src/androidMain/res/values-be/strings.xml
index 1c8125a..561925b 100644
--- a/compose/material/material/src/androidMain/res/values-be/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-be/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Абвестка"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Абвестка"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-bg/strings.xml b/compose/material/material/src/androidMain/res/values-bg/strings.xml
index 001b32a1..4134707 100644
--- a/compose/material/material/src/androidMain/res/values-bg/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-bg/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Сигнал"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Сигнал"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-bn/strings.xml b/compose/material/material/src/androidMain/res/values-bn/strings.xml
index 1c3087e..7968901 100644
--- a/compose/material/material/src/androidMain/res/values-bn/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-bn/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"সতর্কতা"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"সতর্কতা"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-bs/strings.xml b/compose/material/material/src/androidMain/res/values-bs/strings.xml
index a66b1c9..d7fc77e 100644
--- a/compose/material/material/src/androidMain/res/values-bs/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-bs/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Obavještenje"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Obavještenje"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-ca/strings.xml b/compose/material/material/src/androidMain/res/values-ca/strings.xml
index a80146fe..a6f7596 100644
--- a/compose/material/material/src/androidMain/res/values-ca/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-ca/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alerta"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alerta"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-cs/strings.xml b/compose/material/material/src/androidMain/res/values-cs/strings.xml
index f1407da..9e57e65 100644
--- a/compose/material/material/src/androidMain/res/values-cs/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-cs/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Upozornění"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Upozornění"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-da/strings.xml b/compose/material/material/src/androidMain/res/values-da/strings.xml
index dfddac3..3fe0251 100644
--- a/compose/material/material/src/androidMain/res/values-da/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-da/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Underretning"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Underretning"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-de/strings.xml b/compose/material/material/src/androidMain/res/values-de/strings.xml
index 3847958..c0ea84d 100644
--- a/compose/material/material/src/androidMain/res/values-de/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-de/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Warnmeldung"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Warnmeldung"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-el/strings.xml b/compose/material/material/src/androidMain/res/values-el/strings.xml
index 3dfa9e1..4971504 100644
--- a/compose/material/material/src/androidMain/res/values-el/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-el/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Ειδοποίηση"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Ειδοποίηση"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-en-rAU/strings.xml b/compose/material/material/src/androidMain/res/values-en-rAU/strings.xml
index d07e701..593990b 100644
--- a/compose/material/material/src/androidMain/res/values-en-rAU/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-en-rAU/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alert"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alert"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-en-rCA/strings.xml b/compose/material/material/src/androidMain/res/values-en-rCA/strings.xml
index d07e701..593990b 100644
--- a/compose/material/material/src/androidMain/res/values-en-rCA/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-en-rCA/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alert"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alert"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-en-rGB/strings.xml b/compose/material/material/src/androidMain/res/values-en-rGB/strings.xml
index d07e701..593990b 100644
--- a/compose/material/material/src/androidMain/res/values-en-rGB/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-en-rGB/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alert"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alert"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-en-rIN/strings.xml b/compose/material/material/src/androidMain/res/values-en-rIN/strings.xml
index d07e701..593990b 100644
--- a/compose/material/material/src/androidMain/res/values-en-rIN/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-en-rIN/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alert"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alert"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-en-rXC/strings.xml b/compose/material/material/src/androidMain/res/values-en-rXC/strings.xml
index 6958dbe..9c6c290 100644
--- a/compose/material/material/src/androidMain/res/values-en-rXC/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-en-rXC/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‏‎‎‎‏‏‎‏‎‎‎‎‎‏‏‎‎‎‏‎‎‎‎‏‏‏‎‎‎‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎‎Alert‎‏‎‎‏‎"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‏‎‎‏‏‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‏‎‎‏‏‏‎‎‏‎‎‎‎Alert‎‏‎‎‏‎"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-es-rUS/strings.xml b/compose/material/material/src/androidMain/res/values-es-rUS/strings.xml
index a80146fe..a6f7596 100644
--- a/compose/material/material/src/androidMain/res/values-es-rUS/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-es-rUS/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alerta"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alerta"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-es/strings.xml b/compose/material/material/src/androidMain/res/values-es/strings.xml
index a80146fe..a6f7596 100644
--- a/compose/material/material/src/androidMain/res/values-es/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-es/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alerta"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alerta"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-et/strings.xml b/compose/material/material/src/androidMain/res/values-et/strings.xml
index 51360d6..b266a52 100644
--- a/compose/material/material/src/androidMain/res/values-et/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-et/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Teatis"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Hoiatus"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-eu/strings.xml b/compose/material/material/src/androidMain/res/values-eu/strings.xml
index a80146fe..a6f7596 100644
--- a/compose/material/material/src/androidMain/res/values-eu/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-eu/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alerta"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alerta"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-fa/strings.xml b/compose/material/material/src/androidMain/res/values-fa/strings.xml
index 61919ca..090a977 100644
--- a/compose/material/material/src/androidMain/res/values-fa/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-fa/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"هشدار"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"هشدار"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-fi/strings.xml b/compose/material/material/src/androidMain/res/values-fi/strings.xml
index 9c526ac..2a27a70 100644
--- a/compose/material/material/src/androidMain/res/values-fi/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-fi/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Ilmoitus"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Ilmoitus"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-fr-rCA/strings.xml b/compose/material/material/src/androidMain/res/values-fr-rCA/strings.xml
index f0b6d97..9258586 100644
--- a/compose/material/material/src/androidMain/res/values-fr-rCA/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-fr-rCA/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alerte"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alerte"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-fr/strings.xml b/compose/material/material/src/androidMain/res/values-fr/strings.xml
index f0b6d97..9258586 100644
--- a/compose/material/material/src/androidMain/res/values-fr/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-fr/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alerte"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alerte"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-gl/strings.xml b/compose/material/material/src/androidMain/res/values-gl/strings.xml
index a80146fe..a6f7596 100644
--- a/compose/material/material/src/androidMain/res/values-gl/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-gl/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alerta"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alerta"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-gu/strings.xml b/compose/material/material/src/androidMain/res/values-gu/strings.xml
index 14fb7d8..f10fd0a 100644
--- a/compose/material/material/src/androidMain/res/values-gu/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-gu/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"અલર્ટ"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"અલર્ટ"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-hi/strings.xml b/compose/material/material/src/androidMain/res/values-hi/strings.xml
index f1e270e..4d36439 100644
--- a/compose/material/material/src/androidMain/res/values-hi/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-hi/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"सूचना"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"चेतावनी"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-hr/strings.xml b/compose/material/material/src/androidMain/res/values-hr/strings.xml
index 23b9180..6932e14 100644
--- a/compose/material/material/src/androidMain/res/values-hr/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-hr/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Upozorenje"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Upozorenje"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-hu/strings.xml b/compose/material/material/src/androidMain/res/values-hu/strings.xml
index 0725eda..5c340cc 100644
--- a/compose/material/material/src/androidMain/res/values-hu/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-hu/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Értesítés"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Figyelmeztetés"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-hy/strings.xml b/compose/material/material/src/androidMain/res/values-hy/strings.xml
index 031375c..ddefc83 100644
--- a/compose/material/material/src/androidMain/res/values-hy/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-hy/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Ծանուցում"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Ծանուցում"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-in/strings.xml b/compose/material/material/src/androidMain/res/values-in/strings.xml
index b67c9fb..0cf4690 100644
--- a/compose/material/material/src/androidMain/res/values-in/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-in/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Pemberitahuan"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Pemberitahuan"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-is/strings.xml b/compose/material/material/src/androidMain/res/values-is/strings.xml
index 5bc5962..1f62303 100644
--- a/compose/material/material/src/androidMain/res/values-is/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-is/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Viðvörun"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Viðvörun"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-it/strings.xml b/compose/material/material/src/androidMain/res/values-it/strings.xml
index 8b2d15d..70cafc0 100644
--- a/compose/material/material/src/androidMain/res/values-it/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-it/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Avviso"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Avviso"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-iw/strings.xml b/compose/material/material/src/androidMain/res/values-iw/strings.xml
index e801b30..5b67aea 100644
--- a/compose/material/material/src/androidMain/res/values-iw/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-iw/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"התראה"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"התראה"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-ja/strings.xml b/compose/material/material/src/androidMain/res/values-ja/strings.xml
index ff305fd..10085f624 100644
--- a/compose/material/material/src/androidMain/res/values-ja/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-ja/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"警告"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"アラート"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-ka/strings.xml b/compose/material/material/src/androidMain/res/values-ka/strings.xml
index 9258d77..427c375 100644
--- a/compose/material/material/src/androidMain/res/values-ka/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-ka/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"გაფრთხილება"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"გაფრთხილება"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-kk/strings.xml b/compose/material/material/src/androidMain/res/values-kk/strings.xml
index 1587aa9..ee437b9 100644
--- a/compose/material/material/src/androidMain/res/values-kk/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-kk/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Хабарландыру"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Ескерту"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-km/strings.xml b/compose/material/material/src/androidMain/res/values-km/strings.xml
index b574edf..77a002a 100644
--- a/compose/material/material/src/androidMain/res/values-km/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-km/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"ជូន​ដំណឹង"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"ជូន​ដំណឹង"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-kn/strings.xml b/compose/material/material/src/androidMain/res/values-kn/strings.xml
index cd1c91d..203a2fd 100644
--- a/compose/material/material/src/androidMain/res/values-kn/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-kn/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"ಎಚ್ಚರಿಕೆ"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"ಎಚ್ಚರಿಕೆ"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-ko/strings.xml b/compose/material/material/src/androidMain/res/values-ko/strings.xml
index 4fb0854..bd259b1 100644
--- a/compose/material/material/src/androidMain/res/values-ko/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-ko/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"주의"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"주의"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-ky/strings.xml b/compose/material/material/src/androidMain/res/values-ky/strings.xml
index 8febd8a..0e0c075 100644
--- a/compose/material/material/src/androidMain/res/values-ky/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-ky/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Эскертүү"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Эскертүү"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-lo/strings.xml b/compose/material/material/src/androidMain/res/values-lo/strings.xml
index 0f6adba..02341ad 100644
--- a/compose/material/material/src/androidMain/res/values-lo/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-lo/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"ແຈ້ງເຕືອນ"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"ແຈ້ງເຕືອນ"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-lt/strings.xml b/compose/material/material/src/androidMain/res/values-lt/strings.xml
index ae00034..2376e71 100644
--- a/compose/material/material/src/androidMain/res/values-lt/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-lt/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Įspėjimas"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Įspėjimas"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-lv/strings.xml b/compose/material/material/src/androidMain/res/values-lv/strings.xml
index f7e38b7..824500c 100644
--- a/compose/material/material/src/androidMain/res/values-lv/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-lv/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Brīdinājums"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Brīdinājums"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-mk/strings.xml b/compose/material/material/src/androidMain/res/values-mk/strings.xml
index d4c9c2b..bf6f4e7 100644
--- a/compose/material/material/src/androidMain/res/values-mk/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-mk/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Известување"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Предупредување"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-ml/strings.xml b/compose/material/material/src/androidMain/res/values-ml/strings.xml
index 55ca822..0fbc905 100644
--- a/compose/material/material/src/androidMain/res/values-ml/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-ml/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"മുന്നറിയിപ്പ്"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"മുന്നറിയിപ്പ്"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-mn/strings.xml b/compose/material/material/src/androidMain/res/values-mn/strings.xml
index 351378a..349fbd9 100644
--- a/compose/material/material/src/androidMain/res/values-mn/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-mn/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Дохио"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Сэрэмжлүүлэг"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-mr/strings.xml b/compose/material/material/src/androidMain/res/values-mr/strings.xml
index f1e270e..e0cbcf4 100644
--- a/compose/material/material/src/androidMain/res/values-mr/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-mr/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"सूचना"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"सूचना"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-ms/strings.xml b/compose/material/material/src/androidMain/res/values-ms/strings.xml
index 81d062b..0981ad0 100644
--- a/compose/material/material/src/androidMain/res/values-ms/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-ms/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Makluman"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Makluman"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-my/strings.xml b/compose/material/material/src/androidMain/res/values-my/strings.xml
index cad9dd5..0c202e3 100644
--- a/compose/material/material/src/androidMain/res/values-my/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-my/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"သတိပေးချက်"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"သတိပေးချက်"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-nb/strings.xml b/compose/material/material/src/androidMain/res/values-nb/strings.xml
index 24e670d..bc0d3fc 100644
--- a/compose/material/material/src/androidMain/res/values-nb/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-nb/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Varsel"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Varsel"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-ne/strings.xml b/compose/material/material/src/androidMain/res/values-ne/strings.xml
index d56474a..4ab15ca 100644
--- a/compose/material/material/src/androidMain/res/values-ne/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-ne/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"अलर्ट"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"अलर्ट"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-nl/strings.xml b/compose/material/material/src/androidMain/res/values-nl/strings.xml
index b1a9178..4becfb85 100644
--- a/compose/material/material/src/androidMain/res/values-nl/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-nl/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Waarschuwing"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Melding"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-or/strings.xml b/compose/material/material/src/androidMain/res/values-or/strings.xml
index 8400a76..c172b1c 100644
--- a/compose/material/material/src/androidMain/res/values-or/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-or/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"ଆଲର୍ଟ"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"ଆଲର୍ଟ"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-pa/strings.xml b/compose/material/material/src/androidMain/res/values-pa/strings.xml
index 508a843..7c0941e 100644
--- a/compose/material/material/src/androidMain/res/values-pa/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-pa/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"ਅਲਰਟ"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"ਅਲਰਟ"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-pl/strings.xml b/compose/material/material/src/androidMain/res/values-pl/strings.xml
index d07e701..593990b 100644
--- a/compose/material/material/src/androidMain/res/values-pl/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-pl/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alert"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alert"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-pt-rBR/strings.xml b/compose/material/material/src/androidMain/res/values-pt-rBR/strings.xml
index a80146fe..a6f7596 100644
--- a/compose/material/material/src/androidMain/res/values-pt-rBR/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-pt-rBR/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alerta"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alerta"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-pt-rPT/strings.xml b/compose/material/material/src/androidMain/res/values-pt-rPT/strings.xml
index a80146fe..a6f7596 100644
--- a/compose/material/material/src/androidMain/res/values-pt-rPT/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-pt-rPT/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alerta"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alerta"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-pt/strings.xml b/compose/material/material/src/androidMain/res/values-pt/strings.xml
index a80146fe..a6f7596 100644
--- a/compose/material/material/src/androidMain/res/values-pt/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-pt/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alerta"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alerta"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-ro/strings.xml b/compose/material/material/src/androidMain/res/values-ro/strings.xml
index c5fe68f..5289b85 100644
--- a/compose/material/material/src/androidMain/res/values-ro/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-ro/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alertă"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alertă"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-ru/strings.xml b/compose/material/material/src/androidMain/res/values-ru/strings.xml
index 34b4a0a..ee37a75 100644
--- a/compose/material/material/src/androidMain/res/values-ru/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-ru/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Оповещение"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Оповещение"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-si/strings.xml b/compose/material/material/src/androidMain/res/values-si/strings.xml
index e47df95..4c32b49 100644
--- a/compose/material/material/src/androidMain/res/values-si/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-si/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"ඇඟවීම"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"ඇඟවීම"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-sk/strings.xml b/compose/material/material/src/androidMain/res/values-sk/strings.xml
index 4714d82..4d6ad34 100644
--- a/compose/material/material/src/androidMain/res/values-sk/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-sk/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Upozornenie"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Upozornenie"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-sl/strings.xml b/compose/material/material/src/androidMain/res/values-sl/strings.xml
index 1690f6f..dc20efe 100644
--- a/compose/material/material/src/androidMain/res/values-sl/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-sl/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Opozorilo"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Opozorilo"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-sq/strings.xml b/compose/material/material/src/androidMain/res/values-sq/strings.xml
index ae90d01..9ffe4d8 100644
--- a/compose/material/material/src/androidMain/res/values-sq/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-sq/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Sinjalizim"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Sinjalizim"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-sr/strings.xml b/compose/material/material/src/androidMain/res/values-sr/strings.xml
index 1744b1f..cb5dd4b 100644
--- a/compose/material/material/src/androidMain/res/values-sr/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-sr/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Обавештење"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Обавештење"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-sv/strings.xml b/compose/material/material/src/androidMain/res/values-sv/strings.xml
index eb0973b..0a54abb 100644
--- a/compose/material/material/src/androidMain/res/values-sv/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-sv/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Varning"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Varning"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-sw/strings.xml b/compose/material/material/src/androidMain/res/values-sw/strings.xml
index 9c0c367..71dbff20 100644
--- a/compose/material/material/src/androidMain/res/values-sw/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-sw/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Arifa"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Arifa"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-ta/strings.xml b/compose/material/material/src/androidMain/res/values-ta/strings.xml
index de4221b..838deae 100644
--- a/compose/material/material/src/androidMain/res/values-ta/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-ta/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"விழிப்பூட்டல்"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"விழிப்பூட்டல்"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-te/strings.xml b/compose/material/material/src/androidMain/res/values-te/strings.xml
index 2c92062..a22e1e3 100644
--- a/compose/material/material/src/androidMain/res/values-te/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-te/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"అలర్ట్"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"హెచ్చరిక"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-th/strings.xml b/compose/material/material/src/androidMain/res/values-th/strings.xml
index b93fa36..01548a3 100644
--- a/compose/material/material/src/androidMain/res/values-th/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-th/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"การแจ้งเตือน"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"การแจ้งเตือน"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-tl/strings.xml b/compose/material/material/src/androidMain/res/values-tl/strings.xml
index 027f449..8e0e6a1 100644
--- a/compose/material/material/src/androidMain/res/values-tl/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-tl/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Alerto"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Alerto"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-tr/strings.xml b/compose/material/material/src/androidMain/res/values-tr/strings.xml
index 09a273c..673d3be 100644
--- a/compose/material/material/src/androidMain/res/values-tr/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-tr/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Uyarı"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Uyarı"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-uk/strings.xml b/compose/material/material/src/androidMain/res/values-uk/strings.xml
index 0149517..1d6b358 100644
--- a/compose/material/material/src/androidMain/res/values-uk/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-uk/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Сповіщення"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Сповіщення"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-ur/strings.xml b/compose/material/material/src/androidMain/res/values-ur/strings.xml
index 4e3bcd8de..4985a53 100644
--- a/compose/material/material/src/androidMain/res/values-ur/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-ur/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"الرٹ"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"الرٹ"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-uz/strings.xml b/compose/material/material/src/androidMain/res/values-uz/strings.xml
index 8509571..7d49ab63 100644
--- a/compose/material/material/src/androidMain/res/values-uz/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-uz/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Ogohlantirish"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Signal"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-vi/strings.xml b/compose/material/material/src/androidMain/res/values-vi/strings.xml
index 8bb11c0..dca5b9c 100644
--- a/compose/material/material/src/androidMain/res/values-vi/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-vi/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Cảnh báo"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Cảnh báo"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-zh-rCN/strings.xml b/compose/material/material/src/androidMain/res/values-zh-rCN/strings.xml
index ce65453..98d4cfe 100644
--- a/compose/material/material/src/androidMain/res/values-zh-rCN/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-zh-rCN/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"提醒"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"提醒"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-zh-rHK/strings.xml b/compose/material/material/src/androidMain/res/values-zh-rHK/strings.xml
index ffd6df0..c8fdec1 100644
--- a/compose/material/material/src/androidMain/res/values-zh-rHK/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-zh-rHK/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"警示"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"警示"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-zh-rTW/strings.xml b/compose/material/material/src/androidMain/res/values-zh-rTW/strings.xml
index bfc3c16..b02cdec 100644
--- a/compose/material/material/src/androidMain/res/values-zh-rTW/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-zh-rTW/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"快訊"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"快訊"</string>
 </resources>
diff --git a/compose/material/material/src/androidMain/res/values-zu/strings.xml b/compose/material/material/src/androidMain/res/values-zu/strings.xml
index 2e902b0..b297877 100644
--- a/compose/material/material/src/androidMain/res/values-zu/strings.xml
+++ b/compose/material/material/src/androidMain/res/values-zu/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  Copyright 2021 The Android Open Source Project
+<!--
+  Copyright 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mc2_snackbar_pane_title" msgid="8471891128988107974">"Isexwayiso"</string>
+    <string name="mc2_snackbar_pane_title" msgid="2792228137354697160">"Isexwayiso"</string>
 </resources>
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
index 8cd017c..1f88099 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
@@ -37,7 +37,6 @@
 import androidx.compose.foundation.text.input.TextFieldLineLimits.MultiLine
 import androidx.compose.foundation.text.input.TextFieldLineLimits.SingleLine
 import androidx.compose.foundation.text.input.TextFieldState
-import androidx.compose.material.internal.subtractConstraintSafely
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Alignment
@@ -964,7 +963,7 @@
                 .fastFirstOrNull { it.layoutId == LeadingId }
                 ?.let {
                     remainingWidth =
-                        remainingWidth.subtractConstraintSafely(
+                        remainingWidth.substractConstraintSafely(
                             it.maxIntrinsicWidth(Constraints.Infinity)
                         )
                     intrinsicMeasurer(it, width)
@@ -974,7 +973,7 @@
                 .fastFirstOrNull { it.layoutId == TrailingId }
                 ?.let {
                     remainingWidth =
-                        remainingWidth.subtractConstraintSafely(
+                        remainingWidth.substractConstraintSafely(
                             it.maxIntrinsicWidth(Constraints.Infinity)
                         )
                     intrinsicMeasurer(it, width)
@@ -1006,6 +1005,13 @@
     }
 }
 
+private fun Int.substractConstraintSafely(from: Int): Int {
+    if (this == Constraints.Infinity) {
+        return this
+    }
+    return this - from
+}
+
 /**
  * Calculate the width of the [OutlinedTextField] given all elements that should be placed inside
  */
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
index 7955eae..65f98c6 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
@@ -40,7 +40,6 @@
 import androidx.compose.foundation.text.input.TextFieldLineLimits.SingleLine
 import androidx.compose.foundation.text.input.TextFieldState
 import androidx.compose.material.TextFieldDefaults.indicatorLine
-import androidx.compose.material.internal.subtractConstraintSafely
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Alignment
@@ -912,7 +911,7 @@
                 .fastFirstOrNull { it.layoutId == LeadingId }
                 ?.let {
                     remainingWidth =
-                        remainingWidth.subtractConstraintSafely(
+                        remainingWidth.substractConstraintSafely(
                             it.maxIntrinsicWidth(Constraints.Infinity)
                         )
                     intrinsicMeasurer(it, width)
@@ -922,7 +921,7 @@
                 .fastFirstOrNull { it.layoutId == TrailingId }
                 ?.let {
                     remainingWidth =
-                        remainingWidth.subtractConstraintSafely(
+                        remainingWidth.substractConstraintSafely(
                             it.maxIntrinsicWidth(Constraints.Infinity)
                         )
                     intrinsicMeasurer(it, width)
@@ -954,6 +953,13 @@
     }
 }
 
+private fun Int.substractConstraintSafely(from: Int): Int {
+    if (this == Constraints.Infinity) {
+        return this
+    }
+    return this - from
+}
+
 private fun calculateWidth(
     leadingWidth: Int,
     trailingWidth: Int,
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/internal/LayoutUtil.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/internal/LayoutUtil.kt
deleted file mode 100644
index 7f795b3..0000000
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/internal/LayoutUtil.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.material.internal
-
-import androidx.compose.ui.unit.Constraints
-
-/**
- * Subtracts one value from another, where both values represent constraints used in layout.
- *
- * Notably:
- * - if [this] is [Constraints.Infinity], the result stays [Constraints.Infinity]
- * - the result is coerced to be non-negative
- */
-internal fun Int.subtractConstraintSafely(other: Int): Int {
-    if (this == Constraints.Infinity) {
-        return this
-    }
-    return (this - other).coerceAtLeast(0)
-}
diff --git a/compose/material3/adaptive/adaptive-layout/api/1.1.0-beta02.txt b/compose/material3/adaptive/adaptive-layout/api/1.1.0-beta02.txt
index 8facd95..e21acb7 100644
--- a/compose/material3/adaptive/adaptive-layout/api/1.1.0-beta02.txt
+++ b/compose/material3/adaptive/adaptive-layout/api/1.1.0-beta02.txt
@@ -8,7 +8,7 @@
 
   public static final class AdaptStrategy.Companion {
     method public androidx.compose.material3.adaptive.layout.AdaptStrategy getHide();
-    property public final androidx.compose.material3.adaptive.layout.AdaptStrategy Hide;
+    property public androidx.compose.material3.adaptive.layout.AdaptStrategy Hide;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public interface AnimatedPaneOverride {
@@ -22,12 +22,12 @@
     method public androidx.compose.animation.ExitTransition getExitTransition();
     method public androidx.compose.ui.Modifier getModifier();
     method public androidx.compose.material3.adaptive.layout.ExtendedPaneScaffoldPaneScope<S,T> getScope();
-    property public final androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntRect> boundsAnimationSpec;
-    property public final kotlin.jvm.functions.Function1<androidx.compose.material3.adaptive.layout.AnimatedPaneScope,kotlin.Unit> content;
-    property public final androidx.compose.animation.EnterTransition enterTransition;
-    property public final androidx.compose.animation.ExitTransition exitTransition;
-    property public final androidx.compose.ui.Modifier modifier;
-    property public final androidx.compose.material3.adaptive.layout.ExtendedPaneScaffoldPaneScope<S,T> scope;
+    property public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntRect> boundsAnimationSpec;
+    property public kotlin.jvm.functions.Function1<androidx.compose.material3.adaptive.layout.AnimatedPaneScope,kotlin.Unit> content;
+    property public androidx.compose.animation.EnterTransition enterTransition;
+    property public androidx.compose.animation.ExitTransition exitTransition;
+    property public androidx.compose.ui.Modifier modifier;
+    property public androidx.compose.material3.adaptive.layout.ExtendedPaneScaffoldPaneScope<S,T> scope;
   }
 
   public sealed interface AnimatedPaneScope extends androidx.compose.animation.AnimatedVisibilityScope {
@@ -53,10 +53,10 @@
     method public int getAvoidOccluding();
     method public int getAvoidSeparating();
     method public int getNeverAvoid();
-    property public final int AlwaysAvoid;
-    property public final int AvoidOccluding;
-    property public final int AvoidSeparating;
-    property public final int NeverAvoid;
+    property public int AlwaysAvoid;
+    property public int AvoidOccluding;
+    property public int AvoidSeparating;
+    property public int NeverAvoid;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi public final class ListDetailPaneScaffoldDefaults {
@@ -73,9 +73,9 @@
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole getDetail();
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole getExtra();
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole getList();
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Detail;
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Extra;
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole List;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Detail;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Extra;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole List;
     field public static final androidx.compose.material3.adaptive.layout.ListDetailPaneScaffoldRole INSTANCE;
   }
 
@@ -101,8 +101,8 @@
   public static final class PaneAdaptedValue.Companion {
     method public String getExpanded();
     method public String getHidden();
-    property public final String Expanded;
-    property public final String Hidden;
+    property public String Expanded;
+    property public String Hidden;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi public abstract sealed class PaneExpansionAnchor {
@@ -130,8 +130,8 @@
   public static final class PaneExpansionAnchor.Offset.Direction.Companion {
     method public int getFromEnd();
     method public int getFromStart();
-    property public final int FromEnd;
-    property public final int FromStart;
+    property public int FromEnd;
+    property public int FromStart;
   }
 
   public static final class PaneExpansionAnchor.Proportion extends androidx.compose.material3.adaptive.layout.PaneExpansionAnchor {
@@ -139,7 +139,7 @@
     method @androidx.compose.runtime.Composable public String getDescription();
     method public float getProportion();
     property @androidx.compose.runtime.Composable public String description;
-    property @FloatRange(from=0.0, to=1.0) public final float proportion;
+    property @FloatRange(from=0.0, to=1.0) public float proportion;
   }
 
   public final class PaneExpansionDraggableModifierKt {
@@ -153,13 +153,13 @@
     method public boolean isUnspecified();
     method public void setFirstPaneProportion(@FloatRange(from=0.0, to=1.0) float firstPaneProportion);
     method public void setFirstPaneWidth(int firstPaneWidth);
-    property public final androidx.compose.material3.adaptive.layout.PaneExpansionAnchor? currentAnchor;
+    property public androidx.compose.material3.adaptive.layout.PaneExpansionAnchor? currentAnchor;
     field public static final androidx.compose.material3.adaptive.layout.PaneExpansionState.Companion Companion;
     field public static final int Unspecified = -1; // 0xffffffff
   }
 
   public static final class PaneExpansionState.Companion {
-    property public static final int Unspecified;
+    property public static int Unspecified;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Immutable public sealed interface PaneExpansionStateKey {
@@ -168,7 +168,7 @@
 
   public static final class PaneExpansionStateKey.Companion {
     method public androidx.compose.material3.adaptive.layout.PaneExpansionStateKey getDefault();
-    property public final androidx.compose.material3.adaptive.layout.PaneExpansionStateKey Default;
+    property public androidx.compose.material3.adaptive.layout.PaneExpansionStateKey Default;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Stable public sealed interface PaneExpansionStateKeyProvider {
@@ -184,7 +184,7 @@
   public final class PaneKt {
     method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Composable public static <S, T extends androidx.compose.material3.adaptive.layout.PaneScaffoldValue<S>> void AnimatedPane(androidx.compose.material3.adaptive.layout.ExtendedPaneScaffoldPaneScope<S,T>, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enterTransition, optional androidx.compose.animation.ExitTransition exitTransition, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntRect> boundsAnimationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.material3.adaptive.layout.AnimatedPaneScope,kotlin.Unit> content);
     method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.adaptive.layout.AnimatedPaneOverride> getLocalAnimatedPaneOverride();
-    property @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.adaptive.layout.AnimatedPaneOverride> LocalAnimatedPaneOverride;
+    property @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.adaptive.layout.AnimatedPaneOverride> LocalAnimatedPaneOverride;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Stable public sealed interface PaneMotion {
@@ -204,21 +204,21 @@
     method public androidx.compose.material3.adaptive.layout.PaneMotion getExitToRight();
     method public androidx.compose.material3.adaptive.layout.PaneMotion getExitWithShrink();
     method public androidx.compose.material3.adaptive.layout.PaneMotion getNoMotion();
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion AnimateBounds;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion EnterFromLeft;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion EnterFromLeftDelayed;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion EnterFromRight;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion EnterFromRightDelayed;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion EnterWithExpand;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion ExitToLeft;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion ExitToRight;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion ExitWithShrink;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion NoMotion;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion AnimateBounds;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion EnterFromLeft;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion EnterFromLeftDelayed;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion EnterFromRight;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion EnterFromRightDelayed;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion EnterWithExpand;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion ExitToLeft;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion ExitToRight;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion ExitWithShrink;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion NoMotion;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @kotlin.jvm.JvmInline public static final value class PaneMotion.Type {
     method public int getValue();
-    property public final int value;
+    property public int value;
     field public static final androidx.compose.material3.adaptive.layout.PaneMotion.Type.Companion Companion;
   }
 
@@ -227,10 +227,10 @@
     method public int getExiting();
     method public int getHidden();
     method public int getShown();
-    property public final int Entering;
-    property public final int Exiting;
-    property public final int Hidden;
-    property public final int Shown;
+    property public int Entering;
+    property public int Exiting;
+    property public int Hidden;
+    property public int Shown;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi public final class PaneMotionData {
@@ -239,11 +239,11 @@
     method public long getOriginSize();
     method public long getTargetPosition();
     method public long getTargetSize();
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion motion;
-    property public final long originPosition;
-    property public final long originSize;
-    property public final long targetPosition;
-    property public final long targetSize;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion motion;
+    property public long originPosition;
+    property public long originSize;
+    property public long targetPosition;
+    property public long targetSize;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi public final class PaneMotionDefaults {
@@ -253,12 +253,12 @@
     method public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> getDelayedSizeAnimationSpec();
     method public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> getOffsetAnimationSpec();
     method public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> getSizeAnimationSpec();
-    property public final androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntRect> AnimationSpec;
-    property public final androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntRect> DelayedAnimationSpec;
-    property public final androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> DelayedOffsetAnimationSpec;
-    property public final androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> DelayedSizeAnimationSpec;
-    property public final androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> OffsetAnimationSpec;
-    property public final androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> SizeAnimationSpec;
+    property public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntRect> AnimationSpec;
+    property public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntRect> DelayedAnimationSpec;
+    property public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> DelayedOffsetAnimationSpec;
+    property public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> DelayedSizeAnimationSpec;
+    property public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> OffsetAnimationSpec;
+    property public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> SizeAnimationSpec;
     field public static final androidx.compose.material3.adaptive.layout.PaneMotionDefaults INSTANCE;
   }
 
@@ -278,18 +278,18 @@
     method public int getMaxHorizontalPartitions();
     method public int getMaxVerticalPartitions();
     method public float getVerticalPartitionSpacerSize();
-    property public final float defaultPanePreferredWidth;
-    property public final java.util.List<androidx.compose.ui.geometry.Rect> excludedBounds;
-    property public final float horizontalPartitionSpacerSize;
-    property public final int maxHorizontalPartitions;
-    property public final int maxVerticalPartitions;
-    property public final float verticalPartitionSpacerSize;
+    property public float defaultPanePreferredWidth;
+    property public java.util.List<androidx.compose.ui.geometry.Rect> excludedBounds;
+    property public float horizontalPartitionSpacerSize;
+    property public int maxHorizontalPartitions;
+    property public int maxVerticalPartitions;
+    property public float verticalPartitionSpacerSize;
     field public static final androidx.compose.material3.adaptive.layout.PaneScaffoldDirective.Companion Companion;
   }
 
   public static final class PaneScaffoldDirective.Companion {
     method public androidx.compose.material3.adaptive.layout.PaneScaffoldDirective getDefault();
-    property public final androidx.compose.material3.adaptive.layout.PaneScaffoldDirective Default;
+    property public androidx.compose.material3.adaptive.layout.PaneScaffoldDirective Default;
   }
 
   public final class PaneScaffoldDirectiveKt {
@@ -355,9 +355,9 @@
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole getExtra();
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole getMain();
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole getSupporting();
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Extra;
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Main;
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Supporting;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Extra;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Main;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Supporting;
     field public static final androidx.compose.material3.adaptive.layout.SupportingPaneScaffoldRole INSTANCE;
   }
 
@@ -368,7 +368,7 @@
 
   public static final class ThreePaneMotion.Companion {
     method public androidx.compose.material3.adaptive.layout.ThreePaneMotion getNoMotion();
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneMotion NoMotion;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneMotion NoMotion;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi public final class ThreePaneScaffoldAdaptStrategies {
@@ -380,8 +380,8 @@
     ctor public ThreePaneScaffoldDestinationItem(androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole pane, optional T? contentKey);
     method public T? getContentKey();
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole getPane();
-    property public final T? contentKey;
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole pane;
+    property public T? contentKey;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole pane;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Immutable public final class ThreePaneScaffoldHorizontalOrder {
@@ -396,7 +396,7 @@
 
   public final class ThreePaneScaffoldKt {
     method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.adaptive.layout.ThreePaneScaffoldOverride> getLocalThreePaneScaffoldOverride();
-    property @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.adaptive.layout.ThreePaneScaffoldOverride> LocalThreePaneScaffoldOverride;
+    property @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.adaptive.layout.ThreePaneScaffoldOverride> LocalThreePaneScaffoldOverride;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public interface ThreePaneScaffoldOverride {
@@ -413,15 +413,15 @@
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldState getScaffoldState();
     method public kotlin.jvm.functions.Function0<kotlin.Unit> getSecondaryPane();
     method public kotlin.jvm.functions.Function0<kotlin.Unit>? getTertiaryPane();
-    property public final androidx.compose.ui.Modifier modifier;
-    property public final kotlin.jvm.functions.Function1<androidx.compose.material3.adaptive.layout.PaneExpansionState,kotlin.Unit>? paneExpansionDragHandle;
-    property public final androidx.compose.material3.adaptive.layout.PaneExpansionState paneExpansionState;
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldHorizontalOrder paneOrder;
-    property public final kotlin.jvm.functions.Function0<kotlin.Unit> primaryPane;
-    property public final androidx.compose.material3.adaptive.layout.PaneScaffoldDirective scaffoldDirective;
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldState scaffoldState;
-    property public final kotlin.jvm.functions.Function0<kotlin.Unit> secondaryPane;
-    property public final kotlin.jvm.functions.Function0<kotlin.Unit>? tertiaryPane;
+    property public androidx.compose.ui.Modifier modifier;
+    property public kotlin.jvm.functions.Function1<androidx.compose.material3.adaptive.layout.PaneExpansionState,kotlin.Unit>? paneExpansionDragHandle;
+    property public androidx.compose.material3.adaptive.layout.PaneExpansionState paneExpansionState;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldHorizontalOrder paneOrder;
+    property public kotlin.jvm.functions.Function0<kotlin.Unit> primaryPane;
+    property public androidx.compose.material3.adaptive.layout.PaneScaffoldDirective scaffoldDirective;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldState scaffoldState;
+    property public kotlin.jvm.functions.Function0<kotlin.Unit> secondaryPane;
+    property public kotlin.jvm.functions.Function0<kotlin.Unit>? tertiaryPane;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi public sealed interface ThreePaneScaffoldPaneScope extends androidx.compose.material3.adaptive.layout.ThreePaneScaffoldScope androidx.compose.material3.adaptive.layout.ExtendedPaneScaffoldPaneScope<androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole,androidx.compose.material3.adaptive.layout.ThreePaneScaffoldValue> {
@@ -455,9 +455,9 @@
     method public String getSecondary();
     method public String getTertiary();
     property public androidx.compose.material3.adaptive.layout.PaneExpansionStateKey paneExpansionStateKey;
-    property public final String primary;
-    property public final String secondary;
-    property public final String tertiary;
+    property public String primary;
+    property public String secondary;
+    property public String tertiary;
   }
 
   public final class ThreePaneScaffoldValueKt {
diff --git a/compose/material3/adaptive/adaptive-layout/api/restricted_1.1.0-beta02.txt b/compose/material3/adaptive/adaptive-layout/api/restricted_1.1.0-beta02.txt
index 8facd95..e21acb7 100644
--- a/compose/material3/adaptive/adaptive-layout/api/restricted_1.1.0-beta02.txt
+++ b/compose/material3/adaptive/adaptive-layout/api/restricted_1.1.0-beta02.txt
@@ -8,7 +8,7 @@
 
   public static final class AdaptStrategy.Companion {
     method public androidx.compose.material3.adaptive.layout.AdaptStrategy getHide();
-    property public final androidx.compose.material3.adaptive.layout.AdaptStrategy Hide;
+    property public androidx.compose.material3.adaptive.layout.AdaptStrategy Hide;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public interface AnimatedPaneOverride {
@@ -22,12 +22,12 @@
     method public androidx.compose.animation.ExitTransition getExitTransition();
     method public androidx.compose.ui.Modifier getModifier();
     method public androidx.compose.material3.adaptive.layout.ExtendedPaneScaffoldPaneScope<S,T> getScope();
-    property public final androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntRect> boundsAnimationSpec;
-    property public final kotlin.jvm.functions.Function1<androidx.compose.material3.adaptive.layout.AnimatedPaneScope,kotlin.Unit> content;
-    property public final androidx.compose.animation.EnterTransition enterTransition;
-    property public final androidx.compose.animation.ExitTransition exitTransition;
-    property public final androidx.compose.ui.Modifier modifier;
-    property public final androidx.compose.material3.adaptive.layout.ExtendedPaneScaffoldPaneScope<S,T> scope;
+    property public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntRect> boundsAnimationSpec;
+    property public kotlin.jvm.functions.Function1<androidx.compose.material3.adaptive.layout.AnimatedPaneScope,kotlin.Unit> content;
+    property public androidx.compose.animation.EnterTransition enterTransition;
+    property public androidx.compose.animation.ExitTransition exitTransition;
+    property public androidx.compose.ui.Modifier modifier;
+    property public androidx.compose.material3.adaptive.layout.ExtendedPaneScaffoldPaneScope<S,T> scope;
   }
 
   public sealed interface AnimatedPaneScope extends androidx.compose.animation.AnimatedVisibilityScope {
@@ -53,10 +53,10 @@
     method public int getAvoidOccluding();
     method public int getAvoidSeparating();
     method public int getNeverAvoid();
-    property public final int AlwaysAvoid;
-    property public final int AvoidOccluding;
-    property public final int AvoidSeparating;
-    property public final int NeverAvoid;
+    property public int AlwaysAvoid;
+    property public int AvoidOccluding;
+    property public int AvoidSeparating;
+    property public int NeverAvoid;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi public final class ListDetailPaneScaffoldDefaults {
@@ -73,9 +73,9 @@
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole getDetail();
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole getExtra();
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole getList();
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Detail;
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Extra;
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole List;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Detail;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Extra;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole List;
     field public static final androidx.compose.material3.adaptive.layout.ListDetailPaneScaffoldRole INSTANCE;
   }
 
@@ -101,8 +101,8 @@
   public static final class PaneAdaptedValue.Companion {
     method public String getExpanded();
     method public String getHidden();
-    property public final String Expanded;
-    property public final String Hidden;
+    property public String Expanded;
+    property public String Hidden;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi public abstract sealed class PaneExpansionAnchor {
@@ -130,8 +130,8 @@
   public static final class PaneExpansionAnchor.Offset.Direction.Companion {
     method public int getFromEnd();
     method public int getFromStart();
-    property public final int FromEnd;
-    property public final int FromStart;
+    property public int FromEnd;
+    property public int FromStart;
   }
 
   public static final class PaneExpansionAnchor.Proportion extends androidx.compose.material3.adaptive.layout.PaneExpansionAnchor {
@@ -139,7 +139,7 @@
     method @androidx.compose.runtime.Composable public String getDescription();
     method public float getProportion();
     property @androidx.compose.runtime.Composable public String description;
-    property @FloatRange(from=0.0, to=1.0) public final float proportion;
+    property @FloatRange(from=0.0, to=1.0) public float proportion;
   }
 
   public final class PaneExpansionDraggableModifierKt {
@@ -153,13 +153,13 @@
     method public boolean isUnspecified();
     method public void setFirstPaneProportion(@FloatRange(from=0.0, to=1.0) float firstPaneProportion);
     method public void setFirstPaneWidth(int firstPaneWidth);
-    property public final androidx.compose.material3.adaptive.layout.PaneExpansionAnchor? currentAnchor;
+    property public androidx.compose.material3.adaptive.layout.PaneExpansionAnchor? currentAnchor;
     field public static final androidx.compose.material3.adaptive.layout.PaneExpansionState.Companion Companion;
     field public static final int Unspecified = -1; // 0xffffffff
   }
 
   public static final class PaneExpansionState.Companion {
-    property public static final int Unspecified;
+    property public static int Unspecified;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Immutable public sealed interface PaneExpansionStateKey {
@@ -168,7 +168,7 @@
 
   public static final class PaneExpansionStateKey.Companion {
     method public androidx.compose.material3.adaptive.layout.PaneExpansionStateKey getDefault();
-    property public final androidx.compose.material3.adaptive.layout.PaneExpansionStateKey Default;
+    property public androidx.compose.material3.adaptive.layout.PaneExpansionStateKey Default;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Stable public sealed interface PaneExpansionStateKeyProvider {
@@ -184,7 +184,7 @@
   public final class PaneKt {
     method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Composable public static <S, T extends androidx.compose.material3.adaptive.layout.PaneScaffoldValue<S>> void AnimatedPane(androidx.compose.material3.adaptive.layout.ExtendedPaneScaffoldPaneScope<S,T>, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enterTransition, optional androidx.compose.animation.ExitTransition exitTransition, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntRect> boundsAnimationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.material3.adaptive.layout.AnimatedPaneScope,kotlin.Unit> content);
     method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.adaptive.layout.AnimatedPaneOverride> getLocalAnimatedPaneOverride();
-    property @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.adaptive.layout.AnimatedPaneOverride> LocalAnimatedPaneOverride;
+    property @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.adaptive.layout.AnimatedPaneOverride> LocalAnimatedPaneOverride;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Stable public sealed interface PaneMotion {
@@ -204,21 +204,21 @@
     method public androidx.compose.material3.adaptive.layout.PaneMotion getExitToRight();
     method public androidx.compose.material3.adaptive.layout.PaneMotion getExitWithShrink();
     method public androidx.compose.material3.adaptive.layout.PaneMotion getNoMotion();
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion AnimateBounds;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion EnterFromLeft;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion EnterFromLeftDelayed;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion EnterFromRight;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion EnterFromRightDelayed;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion EnterWithExpand;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion ExitToLeft;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion ExitToRight;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion ExitWithShrink;
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion NoMotion;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion AnimateBounds;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion EnterFromLeft;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion EnterFromLeftDelayed;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion EnterFromRight;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion EnterFromRightDelayed;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion EnterWithExpand;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion ExitToLeft;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion ExitToRight;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion ExitWithShrink;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion NoMotion;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @kotlin.jvm.JvmInline public static final value class PaneMotion.Type {
     method public int getValue();
-    property public final int value;
+    property public int value;
     field public static final androidx.compose.material3.adaptive.layout.PaneMotion.Type.Companion Companion;
   }
 
@@ -227,10 +227,10 @@
     method public int getExiting();
     method public int getHidden();
     method public int getShown();
-    property public final int Entering;
-    property public final int Exiting;
-    property public final int Hidden;
-    property public final int Shown;
+    property public int Entering;
+    property public int Exiting;
+    property public int Hidden;
+    property public int Shown;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi public final class PaneMotionData {
@@ -239,11 +239,11 @@
     method public long getOriginSize();
     method public long getTargetPosition();
     method public long getTargetSize();
-    property public final androidx.compose.material3.adaptive.layout.PaneMotion motion;
-    property public final long originPosition;
-    property public final long originSize;
-    property public final long targetPosition;
-    property public final long targetSize;
+    property public androidx.compose.material3.adaptive.layout.PaneMotion motion;
+    property public long originPosition;
+    property public long originSize;
+    property public long targetPosition;
+    property public long targetSize;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi public final class PaneMotionDefaults {
@@ -253,12 +253,12 @@
     method public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> getDelayedSizeAnimationSpec();
     method public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> getOffsetAnimationSpec();
     method public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> getSizeAnimationSpec();
-    property public final androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntRect> AnimationSpec;
-    property public final androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntRect> DelayedAnimationSpec;
-    property public final androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> DelayedOffsetAnimationSpec;
-    property public final androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> DelayedSizeAnimationSpec;
-    property public final androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> OffsetAnimationSpec;
-    property public final androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> SizeAnimationSpec;
+    property public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntRect> AnimationSpec;
+    property public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntRect> DelayedAnimationSpec;
+    property public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> DelayedOffsetAnimationSpec;
+    property public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> DelayedSizeAnimationSpec;
+    property public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> OffsetAnimationSpec;
+    property public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> SizeAnimationSpec;
     field public static final androidx.compose.material3.adaptive.layout.PaneMotionDefaults INSTANCE;
   }
 
@@ -278,18 +278,18 @@
     method public int getMaxHorizontalPartitions();
     method public int getMaxVerticalPartitions();
     method public float getVerticalPartitionSpacerSize();
-    property public final float defaultPanePreferredWidth;
-    property public final java.util.List<androidx.compose.ui.geometry.Rect> excludedBounds;
-    property public final float horizontalPartitionSpacerSize;
-    property public final int maxHorizontalPartitions;
-    property public final int maxVerticalPartitions;
-    property public final float verticalPartitionSpacerSize;
+    property public float defaultPanePreferredWidth;
+    property public java.util.List<androidx.compose.ui.geometry.Rect> excludedBounds;
+    property public float horizontalPartitionSpacerSize;
+    property public int maxHorizontalPartitions;
+    property public int maxVerticalPartitions;
+    property public float verticalPartitionSpacerSize;
     field public static final androidx.compose.material3.adaptive.layout.PaneScaffoldDirective.Companion Companion;
   }
 
   public static final class PaneScaffoldDirective.Companion {
     method public androidx.compose.material3.adaptive.layout.PaneScaffoldDirective getDefault();
-    property public final androidx.compose.material3.adaptive.layout.PaneScaffoldDirective Default;
+    property public androidx.compose.material3.adaptive.layout.PaneScaffoldDirective Default;
   }
 
   public final class PaneScaffoldDirectiveKt {
@@ -355,9 +355,9 @@
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole getExtra();
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole getMain();
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole getSupporting();
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Extra;
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Main;
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Supporting;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Extra;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Main;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole Supporting;
     field public static final androidx.compose.material3.adaptive.layout.SupportingPaneScaffoldRole INSTANCE;
   }
 
@@ -368,7 +368,7 @@
 
   public static final class ThreePaneMotion.Companion {
     method public androidx.compose.material3.adaptive.layout.ThreePaneMotion getNoMotion();
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneMotion NoMotion;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneMotion NoMotion;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi public final class ThreePaneScaffoldAdaptStrategies {
@@ -380,8 +380,8 @@
     ctor public ThreePaneScaffoldDestinationItem(androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole pane, optional T? contentKey);
     method public T? getContentKey();
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole getPane();
-    property public final T? contentKey;
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole pane;
+    property public T? contentKey;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole pane;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Immutable public final class ThreePaneScaffoldHorizontalOrder {
@@ -396,7 +396,7 @@
 
   public final class ThreePaneScaffoldKt {
     method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.adaptive.layout.ThreePaneScaffoldOverride> getLocalThreePaneScaffoldOverride();
-    property @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.adaptive.layout.ThreePaneScaffoldOverride> LocalThreePaneScaffoldOverride;
+    property @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.adaptive.layout.ThreePaneScaffoldOverride> LocalThreePaneScaffoldOverride;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveComponentOverrideApi public interface ThreePaneScaffoldOverride {
@@ -413,15 +413,15 @@
     method public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldState getScaffoldState();
     method public kotlin.jvm.functions.Function0<kotlin.Unit> getSecondaryPane();
     method public kotlin.jvm.functions.Function0<kotlin.Unit>? getTertiaryPane();
-    property public final androidx.compose.ui.Modifier modifier;
-    property public final kotlin.jvm.functions.Function1<androidx.compose.material3.adaptive.layout.PaneExpansionState,kotlin.Unit>? paneExpansionDragHandle;
-    property public final androidx.compose.material3.adaptive.layout.PaneExpansionState paneExpansionState;
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldHorizontalOrder paneOrder;
-    property public final kotlin.jvm.functions.Function0<kotlin.Unit> primaryPane;
-    property public final androidx.compose.material3.adaptive.layout.PaneScaffoldDirective scaffoldDirective;
-    property public final androidx.compose.material3.adaptive.layout.ThreePaneScaffoldState scaffoldState;
-    property public final kotlin.jvm.functions.Function0<kotlin.Unit> secondaryPane;
-    property public final kotlin.jvm.functions.Function0<kotlin.Unit>? tertiaryPane;
+    property public androidx.compose.ui.Modifier modifier;
+    property public kotlin.jvm.functions.Function1<androidx.compose.material3.adaptive.layout.PaneExpansionState,kotlin.Unit>? paneExpansionDragHandle;
+    property public androidx.compose.material3.adaptive.layout.PaneExpansionState paneExpansionState;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldHorizontalOrder paneOrder;
+    property public kotlin.jvm.functions.Function0<kotlin.Unit> primaryPane;
+    property public androidx.compose.material3.adaptive.layout.PaneScaffoldDirective scaffoldDirective;
+    property public androidx.compose.material3.adaptive.layout.ThreePaneScaffoldState scaffoldState;
+    property public kotlin.jvm.functions.Function0<kotlin.Unit> secondaryPane;
+    property public kotlin.jvm.functions.Function0<kotlin.Unit>? tertiaryPane;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi public sealed interface ThreePaneScaffoldPaneScope extends androidx.compose.material3.adaptive.layout.ThreePaneScaffoldScope androidx.compose.material3.adaptive.layout.ExtendedPaneScaffoldPaneScope<androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole,androidx.compose.material3.adaptive.layout.ThreePaneScaffoldValue> {
@@ -455,9 +455,9 @@
     method public String getSecondary();
     method public String getTertiary();
     property public androidx.compose.material3.adaptive.layout.PaneExpansionStateKey paneExpansionStateKey;
-    property public final String primary;
-    property public final String secondary;
-    property public final String tertiary;
+    property public String primary;
+    property public String secondary;
+    property public String tertiary;
   }
 
   public final class ThreePaneScaffoldValueKt {
diff --git a/compose/material3/adaptive/adaptive-navigation/api/1.1.0-beta02.txt b/compose/material3/adaptive/adaptive-navigation/api/1.1.0-beta02.txt
index 0e485ac..53814cd 100644
--- a/compose/material3/adaptive/adaptive-navigation/api/1.1.0-beta02.txt
+++ b/compose/material3/adaptive/adaptive-navigation/api/1.1.0-beta02.txt
@@ -15,10 +15,10 @@
     method public String getPopUntilContentChange();
     method public String getPopUntilCurrentDestinationChange();
     method public String getPopUntilScaffoldValueChange();
-    property public final String PopLatest;
-    property public final String PopUntilContentChange;
-    property public final String PopUntilCurrentDestinationChange;
-    property public final String PopUntilScaffoldValueChange;
+    property public String PopLatest;
+    property public String PopUntilContentChange;
+    property public String PopUntilCurrentDestinationChange;
+    property public String PopUntilScaffoldValueChange;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Stable public interface ThreePaneScaffoldNavigator<T> {
diff --git a/compose/material3/adaptive/adaptive-navigation/api/restricted_1.1.0-beta02.txt b/compose/material3/adaptive/adaptive-navigation/api/restricted_1.1.0-beta02.txt
index 0e485ac..53814cd 100644
--- a/compose/material3/adaptive/adaptive-navigation/api/restricted_1.1.0-beta02.txt
+++ b/compose/material3/adaptive/adaptive-navigation/api/restricted_1.1.0-beta02.txt
@@ -15,10 +15,10 @@
     method public String getPopUntilContentChange();
     method public String getPopUntilCurrentDestinationChange();
     method public String getPopUntilScaffoldValueChange();
-    property public final String PopLatest;
-    property public final String PopUntilContentChange;
-    property public final String PopUntilCurrentDestinationChange;
-    property public final String PopUntilScaffoldValueChange;
+    property public String PopLatest;
+    property public String PopUntilContentChange;
+    property public String PopUntilCurrentDestinationChange;
+    property public String PopUntilScaffoldValueChange;
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Stable public interface ThreePaneScaffoldNavigator<T> {
diff --git a/compose/material3/adaptive/adaptive/api/1.1.0-beta02.txt b/compose/material3/adaptive/adaptive/api/1.1.0-beta02.txt
index 7dc7be8..3f44ac2 100644
--- a/compose/material3/adaptive/adaptive/api/1.1.0-beta02.txt
+++ b/compose/material3/adaptive/adaptive/api/1.1.0-beta02.txt
@@ -25,11 +25,11 @@
     method public boolean isOccluding();
     method public boolean isSeparating();
     method public boolean isVertical();
-    property public final androidx.compose.ui.geometry.Rect bounds;
-    property public final boolean isFlat;
-    property public final boolean isOccluding;
-    property public final boolean isSeparating;
-    property public final boolean isVertical;
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public boolean isFlat;
+    property public boolean isOccluding;
+    property public boolean isSeparating;
+    property public boolean isVertical;
   }
 
   @androidx.compose.runtime.Immutable public final class Posture {
@@ -37,8 +37,8 @@
     ctor public Posture(optional boolean isTabletop, optional java.util.List<androidx.compose.material3.adaptive.HingeInfo> hingeList);
     method public java.util.List<androidx.compose.material3.adaptive.HingeInfo> getHingeList();
     method public boolean isTabletop();
-    property public final java.util.List<androidx.compose.material3.adaptive.HingeInfo> hingeList;
-    property public final boolean isTabletop;
+    property public java.util.List<androidx.compose.material3.adaptive.HingeInfo> hingeList;
+    property public boolean isTabletop;
   }
 
   public final class PostureKt {
@@ -48,14 +48,20 @@
     method public static java.util.List<androidx.compose.ui.geometry.Rect> getOccludingVerticalHingeBounds(androidx.compose.material3.adaptive.Posture);
     method public static java.util.List<androidx.compose.ui.geometry.Rect> getSeparatingHorizontalHingeBounds(androidx.compose.material3.adaptive.Posture);
     method public static java.util.List<androidx.compose.ui.geometry.Rect> getSeparatingVerticalHingeBounds(androidx.compose.material3.adaptive.Posture);
+    property public static java.util.List<androidx.compose.ui.geometry.Rect> allHorizontalHingeBounds;
+    property public static java.util.List<androidx.compose.ui.geometry.Rect> allVerticalHingeBounds;
+    property public static java.util.List<androidx.compose.ui.geometry.Rect> occludingHorizontalHingeBounds;
+    property public static java.util.List<androidx.compose.ui.geometry.Rect> occludingVerticalHingeBounds;
+    property public static java.util.List<androidx.compose.ui.geometry.Rect> separatingHorizontalHingeBounds;
+    property public static java.util.List<androidx.compose.ui.geometry.Rect> separatingVerticalHingeBounds;
   }
 
   @androidx.compose.runtime.Immutable public final class WindowAdaptiveInfo {
     ctor public WindowAdaptiveInfo(androidx.window.core.layout.WindowSizeClass windowSizeClass, androidx.compose.material3.adaptive.Posture windowPosture);
     method public androidx.compose.material3.adaptive.Posture getWindowPosture();
     method public androidx.window.core.layout.WindowSizeClass getWindowSizeClass();
-    property public final androidx.compose.material3.adaptive.Posture windowPosture;
-    property public final androidx.window.core.layout.WindowSizeClass windowSizeClass;
+    property public androidx.compose.material3.adaptive.Posture windowPosture;
+    property public androidx.window.core.layout.WindowSizeClass windowSizeClass;
   }
 
 }
diff --git a/compose/material3/adaptive/adaptive/api/restricted_1.1.0-beta02.txt b/compose/material3/adaptive/adaptive/api/restricted_1.1.0-beta02.txt
index 7dc7be8..3f44ac2 100644
--- a/compose/material3/adaptive/adaptive/api/restricted_1.1.0-beta02.txt
+++ b/compose/material3/adaptive/adaptive/api/restricted_1.1.0-beta02.txt
@@ -25,11 +25,11 @@
     method public boolean isOccluding();
     method public boolean isSeparating();
     method public boolean isVertical();
-    property public final androidx.compose.ui.geometry.Rect bounds;
-    property public final boolean isFlat;
-    property public final boolean isOccluding;
-    property public final boolean isSeparating;
-    property public final boolean isVertical;
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public boolean isFlat;
+    property public boolean isOccluding;
+    property public boolean isSeparating;
+    property public boolean isVertical;
   }
 
   @androidx.compose.runtime.Immutable public final class Posture {
@@ -37,8 +37,8 @@
     ctor public Posture(optional boolean isTabletop, optional java.util.List<androidx.compose.material3.adaptive.HingeInfo> hingeList);
     method public java.util.List<androidx.compose.material3.adaptive.HingeInfo> getHingeList();
     method public boolean isTabletop();
-    property public final java.util.List<androidx.compose.material3.adaptive.HingeInfo> hingeList;
-    property public final boolean isTabletop;
+    property public java.util.List<androidx.compose.material3.adaptive.HingeInfo> hingeList;
+    property public boolean isTabletop;
   }
 
   public final class PostureKt {
@@ -48,14 +48,20 @@
     method public static java.util.List<androidx.compose.ui.geometry.Rect> getOccludingVerticalHingeBounds(androidx.compose.material3.adaptive.Posture);
     method public static java.util.List<androidx.compose.ui.geometry.Rect> getSeparatingHorizontalHingeBounds(androidx.compose.material3.adaptive.Posture);
     method public static java.util.List<androidx.compose.ui.geometry.Rect> getSeparatingVerticalHingeBounds(androidx.compose.material3.adaptive.Posture);
+    property public static java.util.List<androidx.compose.ui.geometry.Rect> allHorizontalHingeBounds;
+    property public static java.util.List<androidx.compose.ui.geometry.Rect> allVerticalHingeBounds;
+    property public static java.util.List<androidx.compose.ui.geometry.Rect> occludingHorizontalHingeBounds;
+    property public static java.util.List<androidx.compose.ui.geometry.Rect> occludingVerticalHingeBounds;
+    property public static java.util.List<androidx.compose.ui.geometry.Rect> separatingHorizontalHingeBounds;
+    property public static java.util.List<androidx.compose.ui.geometry.Rect> separatingVerticalHingeBounds;
   }
 
   @androidx.compose.runtime.Immutable public final class WindowAdaptiveInfo {
     ctor public WindowAdaptiveInfo(androidx.window.core.layout.WindowSizeClass windowSizeClass, androidx.compose.material3.adaptive.Posture windowPosture);
     method public androidx.compose.material3.adaptive.Posture getWindowPosture();
     method public androidx.window.core.layout.WindowSizeClass getWindowSizeClass();
-    property public final androidx.compose.material3.adaptive.Posture windowPosture;
-    property public final androidx.window.core.layout.WindowSizeClass windowSizeClass;
+    property public androidx.compose.material3.adaptive.Posture windowPosture;
+    property public androidx.window.core.layout.WindowSizeClass windowSizeClass;
   }
 
 }
diff --git a/compose/material3/integration-tests/macrobenchmark-target/build.gradle b/compose/material3/integration-tests/macrobenchmark-target/build.gradle
index 2a69104..47c6f31 100644
--- a/compose/material3/integration-tests/macrobenchmark-target/build.gradle
+++ b/compose/material3/integration-tests/macrobenchmark-target/build.gradle
@@ -18,7 +18,7 @@
 }
 
 dependencies {
-    implementation("androidx.activity:activity-compose:1.10.1")
+    implementation(project(":activity:activity-compose"))
     implementation(project(":compose:material3:material3"))
     implementation("androidx.compose.material:material-icons-core:1.6.8")
 }
diff --git a/compose/material3/material3/api/current.txt b/compose/material3/material3/api/current.txt
index 904aa89..f179e71 100644
--- a/compose/material3/material3/api/current.txt
+++ b/compose/material3/material3/api/current.txt
@@ -214,7 +214,6 @@
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors buttonColors();
     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 @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public androidx.compose.foundation.layout.PaddingValues contentPaddingFor(float buttonHeight);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors elevatedButtonColors();
     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);
@@ -224,16 +223,6 @@
     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 @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getExtraLargeContainerHeight();
-    method public androidx.compose.foundation.layout.PaddingValues getExtraLargeContentPadding();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getExtraLargeIconSize();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getExtraLargeIconSpacing();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraLargePressedShape();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getExtraSmallContainerHeight();
-    method public androidx.compose.foundation.layout.PaddingValues getExtraSmallContentPadding();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getExtraSmallIconSize();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getExtraSmallIconSpacing();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraSmallPressedShape();
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFilledTonalShape();
     method public float getIconSize();
     method public float getIconSpacing();
@@ -241,12 +230,10 @@
     method public androidx.compose.foundation.layout.PaddingValues getLargeContentPadding();
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getLargeIconSize();
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getLargeIconSpacing();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getLargePressedShape();
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getMediumContainerHeight();
     method public androidx.compose.foundation.layout.PaddingValues getMediumContentPadding();
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getMediumIconSize();
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getMediumIconSpacing();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getMediumPressedShape();
     method public float getMinHeight();
     method public float getMinWidth();
     method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedButtonBorder();
@@ -255,32 +242,26 @@
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
     method @Deprecated public androidx.compose.foundation.layout.PaddingValues getSmallButtonContentPadding();
     method public androidx.compose.foundation.layout.PaddingValues getSmallContentPadding();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getSmallIconSize();
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getSquareShape();
     method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
     method public androidx.compose.foundation.layout.PaddingValues getTextButtonWithIconContentPadding();
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getTextShape();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float iconSizeFor(float buttonHeight);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float iconSpacingFor(float buttonHeight);
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getXLargeContainerHeight();
+    method public androidx.compose.foundation.layout.PaddingValues getXLargeContentPadding();
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getXLargeIconSize();
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getXLargeIconSpacing();
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getXSmallContainerHeight();
+    method public androidx.compose.foundation.layout.PaddingValues getXSmallContentPadding();
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getXSmallIconSize();
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getXSmallIconSpacing();
     method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke outlinedButtonBorder(optional boolean enabled);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors outlinedButtonColors();
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors outlinedButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonShapes shapes();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonShapes shapes(optional androidx.compose.ui.graphics.Shape? shape, optional androidx.compose.ui.graphics.Shape? pressedShape);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonShapes shapesFor(float buttonHeight);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors textButtonColors();
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors textButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.text.TextStyle textStyleFor(float buttonHeight);
     property public androidx.compose.foundation.layout.PaddingValues ButtonWithIconContentPadding;
     property public androidx.compose.foundation.layout.PaddingValues ContentPadding;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float ExtraLargeContainerHeight;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public androidx.compose.foundation.layout.PaddingValues ExtraLargeContentPadding;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float ExtraLargeIconSize;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float ExtraLargeIconSpacing;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float ExtraSmallContainerHeight;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public androidx.compose.foundation.layout.PaddingValues ExtraSmallContentPadding;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float ExtraSmallIconSize;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float ExtraSmallIconSpacing;
     property public float IconSize;
     property public float IconSpacing;
     property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float LargeContainerHeight;
@@ -295,15 +276,18 @@
     property public float MinWidth;
     property @Deprecated @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public androidx.compose.foundation.layout.PaddingValues SmallButtonContentPadding;
     property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public androidx.compose.foundation.layout.PaddingValues SmallContentPadding;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float SmallIconSize;
     property public androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
     property public androidx.compose.foundation.layout.PaddingValues TextButtonWithIconContentPadding;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float XLargeContainerHeight;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public androidx.compose.foundation.layout.PaddingValues XLargeContentPadding;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float XLargeIconSize;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float XLargeIconSpacing;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float XSmallContainerHeight;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public androidx.compose.foundation.layout.PaddingValues XSmallContentPadding;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float XSmallIconSize;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float XSmallIconSpacing;
     property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape elevatedShape;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraLargePressedShape;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraSmallPressedShape;
     property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape filledTonalShape;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape largePressedShape;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape mediumPressedShape;
     property @Deprecated @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke outlinedButtonBorder;
     property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape outlinedShape;
     property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape pressedShape;
@@ -3097,12 +3081,6 @@
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ToggleButtonColors elevatedToggleButtonColors(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 getCheckedShape();
     method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
-    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraLargeCheckedSquareShape();
-    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraLargePressedShape();
-    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraLargeSquareShape();
-    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraSmallCheckedSquareShape();
-    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraSmallPressedShape();
-    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraSmallSquareShape();
     method public float getIconSize();
     method public float getIconSpacing();
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getLargeCheckedSquareShape();
@@ -3116,11 +3094,16 @@
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getRoundShape();
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getSquareShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getXLargeCheckedSquareShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getXLargePressedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getXLargeSquareShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getXSmallCheckedSquareShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getXSmallPressedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getXSmallSquareShape();
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ToggleButtonColors outlinedToggleButtonColors();
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ToggleButtonColors outlinedToggleButtonColors(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.ToggleButtonShapes shapes();
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ToggleButtonShapes shapes(optional androidx.compose.ui.graphics.Shape? shape, optional androidx.compose.ui.graphics.Shape? pressedShape, optional androidx.compose.ui.graphics.Shape? checkedShape);
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.ToggleButtonShapes shapesFor(float buttonHeight);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ToggleButtonColors toggleButtonColors();
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ToggleButtonColors toggleButtonColors(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.ToggleButtonColors tonalToggleButtonColors();
@@ -3128,20 +3111,20 @@
     property public androidx.compose.foundation.layout.PaddingValues ContentPadding;
     property public float IconSize;
     property public float IconSpacing;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape LargeCheckedSquareShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape LargePressedShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape LargeSquareShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape MediumCheckedSquareShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape MediumPressedShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape MediumSquareShape;
     property public float MinHeight;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape XLargeCheckedSquareShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape XLargePressedShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape XLargeSquareShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape XSmallCheckedSquareShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape XSmallPressedShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape XSmallSquareShape;
     property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape checkedShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraLargeCheckedSquareShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraLargePressedShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraLargeSquareShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraSmallCheckedSquareShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraSmallPressedShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraSmallSquareShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape largeCheckedSquareShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape largePressedShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape largeSquareShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape mediumCheckedSquareShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape mediumPressedShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape mediumSquareShape;
     property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape pressedShape;
     property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape roundShape;
     property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape shape;
@@ -3284,8 +3267,7 @@
     method @Deprecated @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 @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors mediumTopAppBarColors();
     method @Deprecated @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 @Deprecated @SuppressCompatibility @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.TopAppBarScrollBehavior pinnedScrollBehavior(optional androidx.compose.material3.TopAppBarState state, optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll, optional boolean reverseLayout);
+    method @SuppressCompatibility @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 topAppBarColors();
     method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors topAppBarColors(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 topAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor, optional long subtitleContentColor);
@@ -3305,14 +3287,12 @@
   @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public interface TopAppBarScrollBehavior {
     method public androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float>? getFlingAnimationSpec();
     method public androidx.compose.ui.input.nestedscroll.NestedScrollConnection getNestedScrollConnection();
-    method public boolean getReverseLayout();
     method public androidx.compose.animation.core.AnimationSpec<java.lang.Float>? getSnapAnimationSpec();
     method public androidx.compose.material3.TopAppBarState getState();
     method public boolean isPinned();
     property public abstract androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float>? flingAnimationSpec;
     property public abstract boolean isPinned;
     property public abstract androidx.compose.ui.input.nestedscroll.NestedScrollConnection nestedScrollConnection;
-    property public abstract boolean reverseLayout;
     property public abstract androidx.compose.animation.core.AnimationSpec<java.lang.Float>? snapAnimationSpec;
     property public abstract androidx.compose.material3.TopAppBarState state;
   }
@@ -3323,8 +3303,7 @@
     method public float getContentOffset();
     method public float getHeightOffset();
     method public float getHeightOffsetLimit();
-    method @Deprecated public float getOverlappedFraction();
-    method public float overlappedFraction(optional boolean reverseLayout);
+    method public float getOverlappedFraction();
     method public void setContentOffset(float);
     method public void setHeightOffset(float);
     method public void setHeightOffsetLimit(float);
@@ -3332,7 +3311,7 @@
     property public float contentOffset;
     property public float heightOffset;
     property public float heightOffsetLimit;
-    property @Deprecated public float overlappedFraction;
+    property public float overlappedFraction;
     field public static final androidx.compose.material3.TopAppBarState.Companion Companion;
   }
 
diff --git a/compose/material3/material3/api/restricted_current.txt b/compose/material3/material3/api/restricted_current.txt
index 904aa89..f179e71 100644
--- a/compose/material3/material3/api/restricted_current.txt
+++ b/compose/material3/material3/api/restricted_current.txt
@@ -214,7 +214,6 @@
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors buttonColors();
     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 @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public androidx.compose.foundation.layout.PaddingValues contentPaddingFor(float buttonHeight);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors elevatedButtonColors();
     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);
@@ -224,16 +223,6 @@
     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 @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getExtraLargeContainerHeight();
-    method public androidx.compose.foundation.layout.PaddingValues getExtraLargeContentPadding();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getExtraLargeIconSize();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getExtraLargeIconSpacing();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraLargePressedShape();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getExtraSmallContainerHeight();
-    method public androidx.compose.foundation.layout.PaddingValues getExtraSmallContentPadding();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getExtraSmallIconSize();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getExtraSmallIconSpacing();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraSmallPressedShape();
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFilledTonalShape();
     method public float getIconSize();
     method public float getIconSpacing();
@@ -241,12 +230,10 @@
     method public androidx.compose.foundation.layout.PaddingValues getLargeContentPadding();
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getLargeIconSize();
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getLargeIconSpacing();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getLargePressedShape();
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getMediumContainerHeight();
     method public androidx.compose.foundation.layout.PaddingValues getMediumContentPadding();
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getMediumIconSize();
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getMediumIconSpacing();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getMediumPressedShape();
     method public float getMinHeight();
     method public float getMinWidth();
     method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedButtonBorder();
@@ -255,32 +242,26 @@
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
     method @Deprecated public androidx.compose.foundation.layout.PaddingValues getSmallButtonContentPadding();
     method public androidx.compose.foundation.layout.PaddingValues getSmallContentPadding();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getSmallIconSize();
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getSquareShape();
     method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
     method public androidx.compose.foundation.layout.PaddingValues getTextButtonWithIconContentPadding();
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getTextShape();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float iconSizeFor(float buttonHeight);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float iconSpacingFor(float buttonHeight);
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getXLargeContainerHeight();
+    method public androidx.compose.foundation.layout.PaddingValues getXLargeContentPadding();
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getXLargeIconSize();
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getXLargeIconSpacing();
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getXSmallContainerHeight();
+    method public androidx.compose.foundation.layout.PaddingValues getXSmallContentPadding();
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getXSmallIconSize();
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float getXSmallIconSpacing();
     method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke outlinedButtonBorder(optional boolean enabled);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors outlinedButtonColors();
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors outlinedButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonShapes shapes();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonShapes shapes(optional androidx.compose.ui.graphics.Shape? shape, optional androidx.compose.ui.graphics.Shape? pressedShape);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonShapes shapesFor(float buttonHeight);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors textButtonColors();
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors textButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.text.TextStyle textStyleFor(float buttonHeight);
     property public androidx.compose.foundation.layout.PaddingValues ButtonWithIconContentPadding;
     property public androidx.compose.foundation.layout.PaddingValues ContentPadding;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float ExtraLargeContainerHeight;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public androidx.compose.foundation.layout.PaddingValues ExtraLargeContentPadding;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float ExtraLargeIconSize;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float ExtraLargeIconSpacing;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float ExtraSmallContainerHeight;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public androidx.compose.foundation.layout.PaddingValues ExtraSmallContentPadding;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float ExtraSmallIconSize;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float ExtraSmallIconSpacing;
     property public float IconSize;
     property public float IconSpacing;
     property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float LargeContainerHeight;
@@ -295,15 +276,18 @@
     property public float MinWidth;
     property @Deprecated @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public androidx.compose.foundation.layout.PaddingValues SmallButtonContentPadding;
     property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public androidx.compose.foundation.layout.PaddingValues SmallContentPadding;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float SmallIconSize;
     property public androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
     property public androidx.compose.foundation.layout.PaddingValues TextButtonWithIconContentPadding;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float XLargeContainerHeight;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public androidx.compose.foundation.layout.PaddingValues XLargeContentPadding;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float XLargeIconSize;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float XLargeIconSpacing;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float XSmallContainerHeight;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public androidx.compose.foundation.layout.PaddingValues XSmallContentPadding;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float XSmallIconSize;
+    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi public float XSmallIconSpacing;
     property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape elevatedShape;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraLargePressedShape;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraSmallPressedShape;
     property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape filledTonalShape;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape largePressedShape;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape mediumPressedShape;
     property @Deprecated @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke outlinedButtonBorder;
     property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape outlinedShape;
     property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape pressedShape;
@@ -3097,12 +3081,6 @@
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ToggleButtonColors elevatedToggleButtonColors(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 getCheckedShape();
     method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
-    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraLargeCheckedSquareShape();
-    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraLargePressedShape();
-    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraLargeSquareShape();
-    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraSmallCheckedSquareShape();
-    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraSmallPressedShape();
-    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtraSmallSquareShape();
     method public float getIconSize();
     method public float getIconSpacing();
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getLargeCheckedSquareShape();
@@ -3116,11 +3094,16 @@
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getRoundShape();
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getSquareShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getXLargeCheckedSquareShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getXLargePressedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getXLargeSquareShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getXSmallCheckedSquareShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getXSmallPressedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getXSmallSquareShape();
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ToggleButtonColors outlinedToggleButtonColors();
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ToggleButtonColors outlinedToggleButtonColors(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.ToggleButtonShapes shapes();
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ToggleButtonShapes shapes(optional androidx.compose.ui.graphics.Shape? shape, optional androidx.compose.ui.graphics.Shape? pressedShape, optional androidx.compose.ui.graphics.Shape? checkedShape);
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.ToggleButtonShapes shapesFor(float buttonHeight);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ToggleButtonColors toggleButtonColors();
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ToggleButtonColors toggleButtonColors(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.ToggleButtonColors tonalToggleButtonColors();
@@ -3128,20 +3111,20 @@
     property public androidx.compose.foundation.layout.PaddingValues ContentPadding;
     property public float IconSize;
     property public float IconSpacing;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape LargeCheckedSquareShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape LargePressedShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape LargeSquareShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape MediumCheckedSquareShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape MediumPressedShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape MediumSquareShape;
     property public float MinHeight;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape XLargeCheckedSquareShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape XLargePressedShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape XLargeSquareShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape XSmallCheckedSquareShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape XSmallPressedShape;
+    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape XSmallSquareShape;
     property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape checkedShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraLargeCheckedSquareShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraLargePressedShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraLargeSquareShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraSmallCheckedSquareShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraSmallPressedShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape extraSmallSquareShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape largeCheckedSquareShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape largePressedShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape largeSquareShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape mediumCheckedSquareShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape mediumPressedShape;
-    property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape mediumSquareShape;
     property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape pressedShape;
     property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape roundShape;
     property @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape shape;
@@ -3284,8 +3267,7 @@
     method @Deprecated @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 @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors mediumTopAppBarColors();
     method @Deprecated @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 @Deprecated @SuppressCompatibility @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.TopAppBarScrollBehavior pinnedScrollBehavior(optional androidx.compose.material3.TopAppBarState state, optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll, optional boolean reverseLayout);
+    method @SuppressCompatibility @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 topAppBarColors();
     method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors topAppBarColors(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 topAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor, optional long subtitleContentColor);
@@ -3305,14 +3287,12 @@
   @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public interface TopAppBarScrollBehavior {
     method public androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float>? getFlingAnimationSpec();
     method public androidx.compose.ui.input.nestedscroll.NestedScrollConnection getNestedScrollConnection();
-    method public boolean getReverseLayout();
     method public androidx.compose.animation.core.AnimationSpec<java.lang.Float>? getSnapAnimationSpec();
     method public androidx.compose.material3.TopAppBarState getState();
     method public boolean isPinned();
     property public abstract androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float>? flingAnimationSpec;
     property public abstract boolean isPinned;
     property public abstract androidx.compose.ui.input.nestedscroll.NestedScrollConnection nestedScrollConnection;
-    property public abstract boolean reverseLayout;
     property public abstract androidx.compose.animation.core.AnimationSpec<java.lang.Float>? snapAnimationSpec;
     property public abstract androidx.compose.material3.TopAppBarState state;
   }
@@ -3323,8 +3303,7 @@
     method public float getContentOffset();
     method public float getHeightOffset();
     method public float getHeightOffsetLimit();
-    method @Deprecated public float getOverlappedFraction();
-    method public float overlappedFraction(optional boolean reverseLayout);
+    method public float getOverlappedFraction();
     method public void setContentOffset(float);
     method public void setHeightOffset(float);
     method public void setHeightOffsetLimit(float);
@@ -3332,7 +3311,7 @@
     property public float contentOffset;
     property public float heightOffset;
     property public float heightOffsetLimit;
-    property @Deprecated public float overlappedFraction;
+    property public float overlappedFraction;
     field public static final androidx.compose.material3.TopAppBarState.Companion Companion;
   }
 
diff --git a/compose/material3/material3/bcv/native/current.txt b/compose/material3/material3/bcv/native/current.txt
index 2fcde27..089f483 100644
--- a/compose/material3/material3/bcv/native/current.txt
+++ b/compose/material3/material3/bcv/native/current.txt
@@ -341,8 +341,6 @@
         abstract fun <get-isPinned>(): kotlin/Boolean // androidx.compose.material3/TopAppBarScrollBehavior.isPinned.<get-isPinned>|<get-isPinned>(){}[0]
     abstract val nestedScrollConnection // androidx.compose.material3/TopAppBarScrollBehavior.nestedScrollConnection|{}nestedScrollConnection[0]
         abstract fun <get-nestedScrollConnection>(): androidx.compose.ui.input.nestedscroll/NestedScrollConnection // androidx.compose.material3/TopAppBarScrollBehavior.nestedScrollConnection.<get-nestedScrollConnection>|<get-nestedScrollConnection>(){}[0]
-    abstract val reverseLayout // androidx.compose.material3/TopAppBarScrollBehavior.reverseLayout|{}reverseLayout[0]
-        abstract fun <get-reverseLayout>(): kotlin/Boolean // androidx.compose.material3/TopAppBarScrollBehavior.reverseLayout.<get-reverseLayout>|<get-reverseLayout>(){}[0]
     abstract val snapAnimationSpec // androidx.compose.material3/TopAppBarScrollBehavior.snapAnimationSpec|{}snapAnimationSpec[0]
         abstract fun <get-snapAnimationSpec>(): androidx.compose.animation.core/AnimationSpec<kotlin/Float>? // androidx.compose.material3/TopAppBarScrollBehavior.snapAnimationSpec.<get-snapAnimationSpec>|<get-snapAnimationSpec>(){}[0]
     abstract val state // androidx.compose.material3/TopAppBarScrollBehavior.state|{}state[0]
@@ -1773,8 +1771,6 @@
         final fun <get-heightOffsetLimit>(): kotlin/Float // androidx.compose.material3/TopAppBarState.heightOffsetLimit.<get-heightOffsetLimit>|<get-heightOffsetLimit>(){}[0]
         final fun <set-heightOffsetLimit>(kotlin/Float) // androidx.compose.material3/TopAppBarState.heightOffsetLimit.<set-heightOffsetLimit>|<set-heightOffsetLimit>(kotlin.Float){}[0]
 
-    final fun overlappedFraction(kotlin/Boolean = ...): kotlin/Float // androidx.compose.material3/TopAppBarState.overlappedFraction|overlappedFraction(kotlin.Boolean){}[0]
-
     final object Companion { // androidx.compose.material3/TopAppBarState.Companion|null[0]
         final val Saver // androidx.compose.material3/TopAppBarState.Companion.Saver|{}Saver[0]
             final fun <get-Saver>(): androidx.compose.runtime.saveable/Saver<androidx.compose.material3/TopAppBarState, *> // androidx.compose.material3/TopAppBarState.Companion.Saver.<get-Saver>|<get-Saver>(){}[0]
@@ -2290,22 +2286,6 @@
         final fun <get-ButtonWithIconContentPadding>(): androidx.compose.foundation.layout/PaddingValues // androidx.compose.material3/ButtonDefaults.ButtonWithIconContentPadding.<get-ButtonWithIconContentPadding>|<get-ButtonWithIconContentPadding>(){}[0]
     final val ContentPadding // androidx.compose.material3/ButtonDefaults.ContentPadding|{}ContentPadding[0]
         final fun <get-ContentPadding>(): androidx.compose.foundation.layout/PaddingValues // androidx.compose.material3/ButtonDefaults.ContentPadding.<get-ContentPadding>|<get-ContentPadding>(){}[0]
-    final val ExtraLargeContainerHeight // androidx.compose.material3/ButtonDefaults.ExtraLargeContainerHeight|{}ExtraLargeContainerHeight[0]
-        final fun <get-ExtraLargeContainerHeight>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.ExtraLargeContainerHeight.<get-ExtraLargeContainerHeight>|<get-ExtraLargeContainerHeight>(){}[0]
-    final val ExtraLargeContentPadding // androidx.compose.material3/ButtonDefaults.ExtraLargeContentPadding|{}ExtraLargeContentPadding[0]
-        final fun <get-ExtraLargeContentPadding>(): androidx.compose.foundation.layout/PaddingValues // androidx.compose.material3/ButtonDefaults.ExtraLargeContentPadding.<get-ExtraLargeContentPadding>|<get-ExtraLargeContentPadding>(){}[0]
-    final val ExtraLargeIconSize // androidx.compose.material3/ButtonDefaults.ExtraLargeIconSize|{}ExtraLargeIconSize[0]
-        final fun <get-ExtraLargeIconSize>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.ExtraLargeIconSize.<get-ExtraLargeIconSize>|<get-ExtraLargeIconSize>(){}[0]
-    final val ExtraLargeIconSpacing // androidx.compose.material3/ButtonDefaults.ExtraLargeIconSpacing|{}ExtraLargeIconSpacing[0]
-        final fun <get-ExtraLargeIconSpacing>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.ExtraLargeIconSpacing.<get-ExtraLargeIconSpacing>|<get-ExtraLargeIconSpacing>(){}[0]
-    final val ExtraSmallContainerHeight // androidx.compose.material3/ButtonDefaults.ExtraSmallContainerHeight|{}ExtraSmallContainerHeight[0]
-        final fun <get-ExtraSmallContainerHeight>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.ExtraSmallContainerHeight.<get-ExtraSmallContainerHeight>|<get-ExtraSmallContainerHeight>(){}[0]
-    final val ExtraSmallContentPadding // androidx.compose.material3/ButtonDefaults.ExtraSmallContentPadding|{}ExtraSmallContentPadding[0]
-        final fun <get-ExtraSmallContentPadding>(): androidx.compose.foundation.layout/PaddingValues // androidx.compose.material3/ButtonDefaults.ExtraSmallContentPadding.<get-ExtraSmallContentPadding>|<get-ExtraSmallContentPadding>(){}[0]
-    final val ExtraSmallIconSize // androidx.compose.material3/ButtonDefaults.ExtraSmallIconSize|{}ExtraSmallIconSize[0]
-        final fun <get-ExtraSmallIconSize>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.ExtraSmallIconSize.<get-ExtraSmallIconSize>|<get-ExtraSmallIconSize>(){}[0]
-    final val ExtraSmallIconSpacing // androidx.compose.material3/ButtonDefaults.ExtraSmallIconSpacing|{}ExtraSmallIconSpacing[0]
-        final fun <get-ExtraSmallIconSpacing>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.ExtraSmallIconSpacing.<get-ExtraSmallIconSpacing>|<get-ExtraSmallIconSpacing>(){}[0]
     final val IconSize // androidx.compose.material3/ButtonDefaults.IconSize|{}IconSize[0]
         final fun <get-IconSize>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.IconSize.<get-IconSize>|<get-IconSize>(){}[0]
     final val IconSpacing // androidx.compose.material3/ButtonDefaults.IconSpacing|{}IconSpacing[0]
@@ -2334,24 +2314,30 @@
         final fun <get-SmallButtonContentPadding>(): androidx.compose.foundation.layout/PaddingValues // androidx.compose.material3/ButtonDefaults.SmallButtonContentPadding.<get-SmallButtonContentPadding>|<get-SmallButtonContentPadding>(){}[0]
     final val SmallContentPadding // androidx.compose.material3/ButtonDefaults.SmallContentPadding|{}SmallContentPadding[0]
         final fun <get-SmallContentPadding>(): androidx.compose.foundation.layout/PaddingValues // androidx.compose.material3/ButtonDefaults.SmallContentPadding.<get-SmallContentPadding>|<get-SmallContentPadding>(){}[0]
-    final val SmallIconSize // androidx.compose.material3/ButtonDefaults.SmallIconSize|{}SmallIconSize[0]
-        final fun <get-SmallIconSize>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.SmallIconSize.<get-SmallIconSize>|<get-SmallIconSize>(){}[0]
     final val TextButtonContentPadding // androidx.compose.material3/ButtonDefaults.TextButtonContentPadding|{}TextButtonContentPadding[0]
         final fun <get-TextButtonContentPadding>(): androidx.compose.foundation.layout/PaddingValues // androidx.compose.material3/ButtonDefaults.TextButtonContentPadding.<get-TextButtonContentPadding>|<get-TextButtonContentPadding>(){}[0]
     final val TextButtonWithIconContentPadding // androidx.compose.material3/ButtonDefaults.TextButtonWithIconContentPadding|{}TextButtonWithIconContentPadding[0]
         final fun <get-TextButtonWithIconContentPadding>(): androidx.compose.foundation.layout/PaddingValues // androidx.compose.material3/ButtonDefaults.TextButtonWithIconContentPadding.<get-TextButtonWithIconContentPadding>|<get-TextButtonWithIconContentPadding>(){}[0]
+    final val XLargeContainerHeight // androidx.compose.material3/ButtonDefaults.XLargeContainerHeight|{}XLargeContainerHeight[0]
+        final fun <get-XLargeContainerHeight>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.XLargeContainerHeight.<get-XLargeContainerHeight>|<get-XLargeContainerHeight>(){}[0]
+    final val XLargeContentPadding // androidx.compose.material3/ButtonDefaults.XLargeContentPadding|{}XLargeContentPadding[0]
+        final fun <get-XLargeContentPadding>(): androidx.compose.foundation.layout/PaddingValues // androidx.compose.material3/ButtonDefaults.XLargeContentPadding.<get-XLargeContentPadding>|<get-XLargeContentPadding>(){}[0]
+    final val XLargeIconSize // androidx.compose.material3/ButtonDefaults.XLargeIconSize|{}XLargeIconSize[0]
+        final fun <get-XLargeIconSize>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.XLargeIconSize.<get-XLargeIconSize>|<get-XLargeIconSize>(){}[0]
+    final val XLargeIconSpacing // androidx.compose.material3/ButtonDefaults.XLargeIconSpacing|{}XLargeIconSpacing[0]
+        final fun <get-XLargeIconSpacing>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.XLargeIconSpacing.<get-XLargeIconSpacing>|<get-XLargeIconSpacing>(){}[0]
+    final val XSmallContainerHeight // androidx.compose.material3/ButtonDefaults.XSmallContainerHeight|{}XSmallContainerHeight[0]
+        final fun <get-XSmallContainerHeight>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.XSmallContainerHeight.<get-XSmallContainerHeight>|<get-XSmallContainerHeight>(){}[0]
+    final val XSmallContentPadding // androidx.compose.material3/ButtonDefaults.XSmallContentPadding|{}XSmallContentPadding[0]
+        final fun <get-XSmallContentPadding>(): androidx.compose.foundation.layout/PaddingValues // androidx.compose.material3/ButtonDefaults.XSmallContentPadding.<get-XSmallContentPadding>|<get-XSmallContentPadding>(){}[0]
+    final val XSmallIconSize // androidx.compose.material3/ButtonDefaults.XSmallIconSize|{}XSmallIconSize[0]
+        final fun <get-XSmallIconSize>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.XSmallIconSize.<get-XSmallIconSize>|<get-XSmallIconSize>(){}[0]
+    final val XSmallIconSpacing // androidx.compose.material3/ButtonDefaults.XSmallIconSpacing|{}XSmallIconSpacing[0]
+        final fun <get-XSmallIconSpacing>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.XSmallIconSpacing.<get-XSmallIconSpacing>|<get-XSmallIconSpacing>(){}[0]
     final val elevatedShape // androidx.compose.material3/ButtonDefaults.elevatedShape|{}elevatedShape[0]
         final fun <get-elevatedShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ButtonDefaults.elevatedShape.<get-elevatedShape>|<get-elevatedShape>(){}[0]
-    final val extraLargePressedShape // androidx.compose.material3/ButtonDefaults.extraLargePressedShape|{}extraLargePressedShape[0]
-        final fun <get-extraLargePressedShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ButtonDefaults.extraLargePressedShape.<get-extraLargePressedShape>|<get-extraLargePressedShape>(){}[0]
-    final val extraSmallPressedShape // androidx.compose.material3/ButtonDefaults.extraSmallPressedShape|{}extraSmallPressedShape[0]
-        final fun <get-extraSmallPressedShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ButtonDefaults.extraSmallPressedShape.<get-extraSmallPressedShape>|<get-extraSmallPressedShape>(){}[0]
     final val filledTonalShape // androidx.compose.material3/ButtonDefaults.filledTonalShape|{}filledTonalShape[0]
         final fun <get-filledTonalShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ButtonDefaults.filledTonalShape.<get-filledTonalShape>|<get-filledTonalShape>(){}[0]
-    final val largePressedShape // androidx.compose.material3/ButtonDefaults.largePressedShape|{}largePressedShape[0]
-        final fun <get-largePressedShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ButtonDefaults.largePressedShape.<get-largePressedShape>|<get-largePressedShape>(){}[0]
-    final val mediumPressedShape // androidx.compose.material3/ButtonDefaults.mediumPressedShape|{}mediumPressedShape[0]
-        final fun <get-mediumPressedShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ButtonDefaults.mediumPressedShape.<get-mediumPressedShape>|<get-mediumPressedShape>(){}[0]
     final val outlinedButtonBorder // androidx.compose.material3/ButtonDefaults.outlinedButtonBorder|{}outlinedButtonBorder[0]
         final fun <get-outlinedButtonBorder>(): androidx.compose.foundation/BorderStroke // androidx.compose.material3/ButtonDefaults.outlinedButtonBorder.<get-outlinedButtonBorder>|<get-outlinedButtonBorder>(){}[0]
     final val outlinedShape // androidx.compose.material3/ButtonDefaults.outlinedShape|{}outlinedShape[0]
@@ -2368,24 +2354,18 @@
     final fun buttonColors(): androidx.compose.material3/ButtonColors // androidx.compose.material3/ButtonDefaults.buttonColors|buttonColors(){}[0]
     final fun buttonColors(androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ...): androidx.compose.material3/ButtonColors // androidx.compose.material3/ButtonDefaults.buttonColors|buttonColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0]
     final fun buttonElevation(androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ...): androidx.compose.material3/ButtonElevation // androidx.compose.material3/ButtonDefaults.buttonElevation|buttonElevation(androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp){}[0]
-    final fun contentPaddingFor(androidx.compose.ui.unit/Dp): androidx.compose.foundation.layout/PaddingValues // androidx.compose.material3/ButtonDefaults.contentPaddingFor|contentPaddingFor(androidx.compose.ui.unit.Dp){}[0]
     final fun elevatedButtonColors(): androidx.compose.material3/ButtonColors // androidx.compose.material3/ButtonDefaults.elevatedButtonColors|elevatedButtonColors(){}[0]
     final fun elevatedButtonColors(androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ...): androidx.compose.material3/ButtonColors // androidx.compose.material3/ButtonDefaults.elevatedButtonColors|elevatedButtonColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0]
     final fun elevatedButtonElevation(androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ...): androidx.compose.material3/ButtonElevation // androidx.compose.material3/ButtonDefaults.elevatedButtonElevation|elevatedButtonElevation(androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp){}[0]
     final fun filledTonalButtonColors(): androidx.compose.material3/ButtonColors // androidx.compose.material3/ButtonDefaults.filledTonalButtonColors|filledTonalButtonColors(){}[0]
     final fun filledTonalButtonColors(androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ...): androidx.compose.material3/ButtonColors // androidx.compose.material3/ButtonDefaults.filledTonalButtonColors|filledTonalButtonColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0]
     final fun filledTonalButtonElevation(androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ..., androidx.compose.ui.unit/Dp = ...): androidx.compose.material3/ButtonElevation // androidx.compose.material3/ButtonDefaults.filledTonalButtonElevation|filledTonalButtonElevation(androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp;androidx.compose.ui.unit.Dp){}[0]
-    final fun iconSizeFor(androidx.compose.ui.unit/Dp): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.iconSizeFor|iconSizeFor(androidx.compose.ui.unit.Dp){}[0]
-    final fun iconSpacingFor(androidx.compose.ui.unit/Dp): androidx.compose.ui.unit/Dp // androidx.compose.material3/ButtonDefaults.iconSpacingFor|iconSpacingFor(androidx.compose.ui.unit.Dp){}[0]
     final fun outlinedButtonBorder(kotlin/Boolean = ...): androidx.compose.foundation/BorderStroke // androidx.compose.material3/ButtonDefaults.outlinedButtonBorder|outlinedButtonBorder(kotlin.Boolean){}[0]
     final fun outlinedButtonColors(): androidx.compose.material3/ButtonColors // androidx.compose.material3/ButtonDefaults.outlinedButtonColors|outlinedButtonColors(){}[0]
     final fun outlinedButtonColors(androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ...): androidx.compose.material3/ButtonColors // androidx.compose.material3/ButtonDefaults.outlinedButtonColors|outlinedButtonColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0]
     final fun shapes(): androidx.compose.material3/ButtonShapes // androidx.compose.material3/ButtonDefaults.shapes|shapes(){}[0]
-    final fun shapes(androidx.compose.ui.graphics/Shape? = ..., androidx.compose.ui.graphics/Shape? = ...): androidx.compose.material3/ButtonShapes // androidx.compose.material3/ButtonDefaults.shapes|shapes(androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Shape?){}[0]
-    final fun shapesFor(androidx.compose.ui.unit/Dp): androidx.compose.material3/ButtonShapes // androidx.compose.material3/ButtonDefaults.shapesFor|shapesFor(androidx.compose.ui.unit.Dp){}[0]
     final fun textButtonColors(): androidx.compose.material3/ButtonColors // androidx.compose.material3/ButtonDefaults.textButtonColors|textButtonColors(){}[0]
     final fun textButtonColors(androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ...): androidx.compose.material3/ButtonColors // androidx.compose.material3/ButtonDefaults.textButtonColors|textButtonColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0]
-    final fun textStyleFor(androidx.compose.ui.unit/Dp): androidx.compose.ui.text/TextStyle // androidx.compose.material3/ButtonDefaults.textStyleFor|textStyleFor(androidx.compose.ui.unit.Dp){}[0]
 }
 
 final object androidx.compose.material3/ButtonGroupDefaults { // androidx.compose.material3/ButtonGroupDefaults|null[0]
@@ -3199,34 +3179,34 @@
         final fun <get-IconSize>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ToggleButtonDefaults.IconSize.<get-IconSize>|<get-IconSize>(){}[0]
     final val IconSpacing // androidx.compose.material3/ToggleButtonDefaults.IconSpacing|{}IconSpacing[0]
         final fun <get-IconSpacing>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ToggleButtonDefaults.IconSpacing.<get-IconSpacing>|<get-IconSpacing>(){}[0]
+    final val LargeCheckedSquareShape // androidx.compose.material3/ToggleButtonDefaults.LargeCheckedSquareShape|{}LargeCheckedSquareShape[0]
+        final fun <get-LargeCheckedSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.LargeCheckedSquareShape.<get-LargeCheckedSquareShape>|<get-LargeCheckedSquareShape>(){}[0]
+    final val LargePressedShape // androidx.compose.material3/ToggleButtonDefaults.LargePressedShape|{}LargePressedShape[0]
+        final fun <get-LargePressedShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.LargePressedShape.<get-LargePressedShape>|<get-LargePressedShape>(){}[0]
+    final val LargeSquareShape // androidx.compose.material3/ToggleButtonDefaults.LargeSquareShape|{}LargeSquareShape[0]
+        final fun <get-LargeSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.LargeSquareShape.<get-LargeSquareShape>|<get-LargeSquareShape>(){}[0]
+    final val MediumCheckedSquareShape // androidx.compose.material3/ToggleButtonDefaults.MediumCheckedSquareShape|{}MediumCheckedSquareShape[0]
+        final fun <get-MediumCheckedSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.MediumCheckedSquareShape.<get-MediumCheckedSquareShape>|<get-MediumCheckedSquareShape>(){}[0]
+    final val MediumPressedShape // androidx.compose.material3/ToggleButtonDefaults.MediumPressedShape|{}MediumPressedShape[0]
+        final fun <get-MediumPressedShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.MediumPressedShape.<get-MediumPressedShape>|<get-MediumPressedShape>(){}[0]
+    final val MediumSquareShape // androidx.compose.material3/ToggleButtonDefaults.MediumSquareShape|{}MediumSquareShape[0]
+        final fun <get-MediumSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.MediumSquareShape.<get-MediumSquareShape>|<get-MediumSquareShape>(){}[0]
     final val MinHeight // androidx.compose.material3/ToggleButtonDefaults.MinHeight|{}MinHeight[0]
         final fun <get-MinHeight>(): androidx.compose.ui.unit/Dp // androidx.compose.material3/ToggleButtonDefaults.MinHeight.<get-MinHeight>|<get-MinHeight>(){}[0]
+    final val XLargeCheckedSquareShape // androidx.compose.material3/ToggleButtonDefaults.XLargeCheckedSquareShape|{}XLargeCheckedSquareShape[0]
+        final fun <get-XLargeCheckedSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.XLargeCheckedSquareShape.<get-XLargeCheckedSquareShape>|<get-XLargeCheckedSquareShape>(){}[0]
+    final val XLargePressedShape // androidx.compose.material3/ToggleButtonDefaults.XLargePressedShape|{}XLargePressedShape[0]
+        final fun <get-XLargePressedShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.XLargePressedShape.<get-XLargePressedShape>|<get-XLargePressedShape>(){}[0]
+    final val XLargeSquareShape // androidx.compose.material3/ToggleButtonDefaults.XLargeSquareShape|{}XLargeSquareShape[0]
+        final fun <get-XLargeSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.XLargeSquareShape.<get-XLargeSquareShape>|<get-XLargeSquareShape>(){}[0]
+    final val XSmallCheckedSquareShape // androidx.compose.material3/ToggleButtonDefaults.XSmallCheckedSquareShape|{}XSmallCheckedSquareShape[0]
+        final fun <get-XSmallCheckedSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.XSmallCheckedSquareShape.<get-XSmallCheckedSquareShape>|<get-XSmallCheckedSquareShape>(){}[0]
+    final val XSmallPressedShape // androidx.compose.material3/ToggleButtonDefaults.XSmallPressedShape|{}XSmallPressedShape[0]
+        final fun <get-XSmallPressedShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.XSmallPressedShape.<get-XSmallPressedShape>|<get-XSmallPressedShape>(){}[0]
+    final val XSmallSquareShape // androidx.compose.material3/ToggleButtonDefaults.XSmallSquareShape|{}XSmallSquareShape[0]
+        final fun <get-XSmallSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.XSmallSquareShape.<get-XSmallSquareShape>|<get-XSmallSquareShape>(){}[0]
     final val checkedShape // androidx.compose.material3/ToggleButtonDefaults.checkedShape|{}checkedShape[0]
         final fun <get-checkedShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.checkedShape.<get-checkedShape>|<get-checkedShape>(){}[0]
-    final val extraLargeCheckedSquareShape // androidx.compose.material3/ToggleButtonDefaults.extraLargeCheckedSquareShape|{}extraLargeCheckedSquareShape[0]
-        final fun <get-extraLargeCheckedSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.extraLargeCheckedSquareShape.<get-extraLargeCheckedSquareShape>|<get-extraLargeCheckedSquareShape>(){}[0]
-    final val extraLargePressedShape // androidx.compose.material3/ToggleButtonDefaults.extraLargePressedShape|{}extraLargePressedShape[0]
-        final fun <get-extraLargePressedShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.extraLargePressedShape.<get-extraLargePressedShape>|<get-extraLargePressedShape>(){}[0]
-    final val extraLargeSquareShape // androidx.compose.material3/ToggleButtonDefaults.extraLargeSquareShape|{}extraLargeSquareShape[0]
-        final fun <get-extraLargeSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.extraLargeSquareShape.<get-extraLargeSquareShape>|<get-extraLargeSquareShape>(){}[0]
-    final val extraSmallCheckedSquareShape // androidx.compose.material3/ToggleButtonDefaults.extraSmallCheckedSquareShape|{}extraSmallCheckedSquareShape[0]
-        final fun <get-extraSmallCheckedSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.extraSmallCheckedSquareShape.<get-extraSmallCheckedSquareShape>|<get-extraSmallCheckedSquareShape>(){}[0]
-    final val extraSmallPressedShape // androidx.compose.material3/ToggleButtonDefaults.extraSmallPressedShape|{}extraSmallPressedShape[0]
-        final fun <get-extraSmallPressedShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.extraSmallPressedShape.<get-extraSmallPressedShape>|<get-extraSmallPressedShape>(){}[0]
-    final val extraSmallSquareShape // androidx.compose.material3/ToggleButtonDefaults.extraSmallSquareShape|{}extraSmallSquareShape[0]
-        final fun <get-extraSmallSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.extraSmallSquareShape.<get-extraSmallSquareShape>|<get-extraSmallSquareShape>(){}[0]
-    final val largeCheckedSquareShape // androidx.compose.material3/ToggleButtonDefaults.largeCheckedSquareShape|{}largeCheckedSquareShape[0]
-        final fun <get-largeCheckedSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.largeCheckedSquareShape.<get-largeCheckedSquareShape>|<get-largeCheckedSquareShape>(){}[0]
-    final val largePressedShape // androidx.compose.material3/ToggleButtonDefaults.largePressedShape|{}largePressedShape[0]
-        final fun <get-largePressedShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.largePressedShape.<get-largePressedShape>|<get-largePressedShape>(){}[0]
-    final val largeSquareShape // androidx.compose.material3/ToggleButtonDefaults.largeSquareShape|{}largeSquareShape[0]
-        final fun <get-largeSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.largeSquareShape.<get-largeSquareShape>|<get-largeSquareShape>(){}[0]
-    final val mediumCheckedSquareShape // androidx.compose.material3/ToggleButtonDefaults.mediumCheckedSquareShape|{}mediumCheckedSquareShape[0]
-        final fun <get-mediumCheckedSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.mediumCheckedSquareShape.<get-mediumCheckedSquareShape>|<get-mediumCheckedSquareShape>(){}[0]
-    final val mediumPressedShape // androidx.compose.material3/ToggleButtonDefaults.mediumPressedShape|{}mediumPressedShape[0]
-        final fun <get-mediumPressedShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.mediumPressedShape.<get-mediumPressedShape>|<get-mediumPressedShape>(){}[0]
-    final val mediumSquareShape // androidx.compose.material3/ToggleButtonDefaults.mediumSquareShape|{}mediumSquareShape[0]
-        final fun <get-mediumSquareShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.mediumSquareShape.<get-mediumSquareShape>|<get-mediumSquareShape>(){}[0]
     final val pressedShape // androidx.compose.material3/ToggleButtonDefaults.pressedShape|{}pressedShape[0]
         final fun <get-pressedShape>(): androidx.compose.ui.graphics/Shape // androidx.compose.material3/ToggleButtonDefaults.pressedShape.<get-pressedShape>|<get-pressedShape>(){}[0]
     final val roundShape // androidx.compose.material3/ToggleButtonDefaults.roundShape|{}roundShape[0]
@@ -3242,7 +3222,6 @@
     final fun outlinedToggleButtonColors(androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ...): androidx.compose.material3/ToggleButtonColors // androidx.compose.material3/ToggleButtonDefaults.outlinedToggleButtonColors|outlinedToggleButtonColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0]
     final fun shapes(): androidx.compose.material3/ToggleButtonShapes // androidx.compose.material3/ToggleButtonDefaults.shapes|shapes(){}[0]
     final fun shapes(androidx.compose.ui.graphics/Shape? = ..., androidx.compose.ui.graphics/Shape? = ..., androidx.compose.ui.graphics/Shape? = ...): androidx.compose.material3/ToggleButtonShapes // androidx.compose.material3/ToggleButtonDefaults.shapes|shapes(androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Shape?;androidx.compose.ui.graphics.Shape?){}[0]
-    final fun shapesFor(androidx.compose.ui.unit/Dp): androidx.compose.material3/ToggleButtonShapes // androidx.compose.material3/ToggleButtonDefaults.shapesFor|shapesFor(androidx.compose.ui.unit.Dp){}[0]
     final fun toggleButtonColors(): androidx.compose.material3/ToggleButtonColors // androidx.compose.material3/ToggleButtonDefaults.toggleButtonColors|toggleButtonColors(){}[0]
     final fun toggleButtonColors(androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ...): androidx.compose.material3/ToggleButtonColors // androidx.compose.material3/ToggleButtonDefaults.toggleButtonColors|toggleButtonColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0]
     final fun tonalToggleButtonColors(): androidx.compose.material3/ToggleButtonColors // androidx.compose.material3/ToggleButtonDefaults.tonalToggleButtonColors|tonalToggleButtonColors(){}[0]
@@ -3322,7 +3301,6 @@
     final fun mediumTopAppBarColors(): androidx.compose.material3/TopAppBarColors // androidx.compose.material3/TopAppBarDefaults.mediumTopAppBarColors|mediumTopAppBarColors(){}[0]
     final fun mediumTopAppBarColors(androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ...): androidx.compose.material3/TopAppBarColors // androidx.compose.material3/TopAppBarDefaults.mediumTopAppBarColors|mediumTopAppBarColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0]
     final fun pinnedScrollBehavior(androidx.compose.material3/TopAppBarState = ..., kotlin/Function0<kotlin/Boolean> = ...): androidx.compose.material3/TopAppBarScrollBehavior // androidx.compose.material3/TopAppBarDefaults.pinnedScrollBehavior|pinnedScrollBehavior(androidx.compose.material3.TopAppBarState;kotlin.Function0<kotlin.Boolean>){}[0]
-    final fun pinnedScrollBehavior(androidx.compose.material3/TopAppBarState = ..., kotlin/Function0<kotlin/Boolean> = ..., kotlin/Boolean = ...): androidx.compose.material3/TopAppBarScrollBehavior // androidx.compose.material3/TopAppBarDefaults.pinnedScrollBehavior|pinnedScrollBehavior(androidx.compose.material3.TopAppBarState;kotlin.Function0<kotlin.Boolean>;kotlin.Boolean){}[0]
     final fun topAppBarColors(): androidx.compose.material3/TopAppBarColors // androidx.compose.material3/TopAppBarDefaults.topAppBarColors|topAppBarColors(){}[0]
     final fun topAppBarColors(androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ...): androidx.compose.material3/TopAppBarColors // androidx.compose.material3/TopAppBarDefaults.topAppBarColors|topAppBarColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0]
     final fun topAppBarColors(androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ..., androidx.compose.ui.graphics/Color = ...): androidx.compose.material3/TopAppBarColors // androidx.compose.material3/TopAppBarDefaults.topAppBarColors|topAppBarColors(androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color;androidx.compose.ui.graphics.Color){}[0]
diff --git a/compose/material3/material3/integration-tests/material3-demos/build.gradle b/compose/material3/material3/integration-tests/material3-demos/build.gradle
index ae544ab..a0128d2 100644
--- a/compose/material3/material3/integration-tests/material3-demos/build.gradle
+++ b/compose/material3/material3/integration-tests/material3-demos/build.gradle
@@ -34,7 +34,7 @@
 
     implementation(libs.kotlinStdlib)
 
-    implementation("androidx.activity:activity-compose:1.10.1")
+    implementation(project(":activity:activity-compose"))
     implementation(project(":compose:animation:animation"))
     implementation(project(":compose:foundation:foundation"))
     implementation(project(":compose:foundation:foundation-layout"))
diff --git a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/ToggleButtonDemos.kt b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/ToggleButtonDemos.kt
index 85491f5..4ea8d32 100644
--- a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/ToggleButtonDemos.kt
+++ b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/ToggleButtonDemos.kt
@@ -35,6 +35,7 @@
 import androidx.compose.material3.ElevatedToggleButton
 import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
 import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.OutlinedToggleButton
 import androidx.compose.material3.Text
 import androidx.compose.material3.ToggleButton
@@ -82,7 +83,7 @@
                 Text("Large")
             }
             Box(
-                Modifier.heightIn(ButtonDefaults.ExtraLargeContainerHeight),
+                Modifier.heightIn(ButtonDefaults.XLargeContainerHeight),
                 contentAlignment = Alignment.Center
             ) {
                 Text("XLarge")
@@ -110,81 +111,95 @@
         ToggleButton(
             checked = checked[0],
             onCheckedChange = { checked[0] = it },
-            modifier = Modifier.heightIn(extraSmall),
-            shapes = ToggleButtonDefaults.shapesFor(extraSmall),
-            contentPadding = ButtonDefaults.contentPaddingFor(extraSmall)
+            modifier = Modifier.heightIn(ButtonDefaults.XSmallContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.XSmallPressedShape,
+                    ToggleButtonDefaults.XSmallCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.XSmallContentPadding
         ) {
             Icon(
                 if (checked[0]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(extraSmall))
+                modifier = Modifier.size(ButtonDefaults.XSmallIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(extraSmall)))
-            Text("Label", style = ButtonDefaults.textStyleFor(extraSmall))
+            Spacer(Modifier.size(ButtonDefaults.XSmallIconSpacing))
+            Text("Label")
         }
 
-        ToggleButton(
-            checked = checked[1],
-            onCheckedChange = { checked[1] = it },
-            modifier = Modifier.heightIn(small),
-            shapes = ToggleButtonDefaults.shapesFor(small),
-            contentPadding = ButtonDefaults.contentPaddingFor(small)
-        ) {
+        ToggleButton(checked = checked[1], onCheckedChange = { checked[1] = it }) {
             Icon(
                 if (checked[1]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(small))
+                modifier = Modifier.size(ButtonDefaults.IconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(small)))
-            Text("Label", style = ButtonDefaults.textStyleFor(small))
+            Spacer(Modifier.size(ButtonDefaults.IconSpacing))
+            Text("Label")
         }
 
         ToggleButton(
             checked = checked[2],
             onCheckedChange = { checked[2] = it },
-            modifier = Modifier.heightIn(medium),
-            shapes = ToggleButtonDefaults.shapesFor(medium),
-            contentPadding = ButtonDefaults.contentPaddingFor(medium)
+            modifier = Modifier.heightIn(ButtonDefaults.MediumContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.MediumPressedShape,
+                    ToggleButtonDefaults.MediumCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.MediumContentPadding
         ) {
             Icon(
                 if (checked[2]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(medium))
+                modifier = Modifier.size(ButtonDefaults.MediumIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(medium)))
-            Text("Label", style = ButtonDefaults.textStyleFor(medium))
+            Spacer(Modifier.size(ButtonDefaults.MediumIconSpacing))
+            Text(text = "Label", style = MaterialTheme.typography.titleMedium)
         }
 
         ToggleButton(
             checked = checked[3],
             onCheckedChange = { checked[3] = it },
-            modifier = Modifier.heightIn(large),
-            shapes = ToggleButtonDefaults.shapesFor(large),
-            contentPadding = ButtonDefaults.contentPaddingFor(large)
+            modifier = Modifier.heightIn(ButtonDefaults.LargeContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.LargePressedShape,
+                    ToggleButtonDefaults.LargeCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.LargeContentPadding
         ) {
             Icon(
                 if (checked[3]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(large))
+                modifier = Modifier.size(ButtonDefaults.LargeIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(large)))
-            Text("Label", style = ButtonDefaults.textStyleFor(large))
+            Spacer(Modifier.size(ButtonDefaults.LargeIconSpacing))
+            Text(text = "Label", style = MaterialTheme.typography.headlineSmall)
         }
 
         ToggleButton(
             checked = checked[4],
             onCheckedChange = { checked[4] = it },
-            modifier = Modifier.heightIn(extraLarge),
-            shapes = ToggleButtonDefaults.shapesFor(extraLarge),
-            contentPadding = ButtonDefaults.contentPaddingFor(extraLarge)
+            modifier = Modifier.heightIn(ButtonDefaults.XLargeContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.XLargePressedShape,
+                    ToggleButtonDefaults.XLargeCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.XLargeContentPadding
         ) {
             Icon(
                 if (checked[4]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(extraLarge))
+                modifier = Modifier.size(ButtonDefaults.XLargeIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(extraLarge)))
-            Text("Label", style = ButtonDefaults.textStyleFor(extraLarge))
+            Spacer(Modifier.size(ButtonDefaults.XLargeIconSpacing))
+            Text(text = "Label", style = MaterialTheme.typography.headlineLarge)
         }
     }
 }
@@ -202,81 +217,95 @@
         ElevatedToggleButton(
             checked = checked[0],
             onCheckedChange = { checked[0] = it },
-            modifier = Modifier.heightIn(extraSmall),
-            shapes = ToggleButtonDefaults.shapesFor(extraSmall),
-            contentPadding = ButtonDefaults.contentPaddingFor(extraSmall)
+            modifier = Modifier.heightIn(ButtonDefaults.XSmallContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.XSmallPressedShape,
+                    ToggleButtonDefaults.XSmallCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.XSmallContentPadding
         ) {
             Icon(
                 if (checked[0]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(extraSmall))
+                modifier = Modifier.size(ButtonDefaults.XSmallIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(extraSmall)))
-            Text("Label", style = ButtonDefaults.textStyleFor(extraSmall))
+            Spacer(Modifier.size(ButtonDefaults.XSmallIconSpacing))
+            Text("Label")
         }
 
-        ElevatedToggleButton(
-            checked = checked[1],
-            onCheckedChange = { checked[1] = it },
-            modifier = Modifier.heightIn(small),
-            shapes = ToggleButtonDefaults.shapesFor(small),
-            contentPadding = ButtonDefaults.contentPaddingFor(small)
-        ) {
+        ElevatedToggleButton(checked = checked[1], onCheckedChange = { checked[1] = it }) {
             Icon(
                 if (checked[1]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(small))
+                modifier = Modifier.size(ButtonDefaults.IconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(small)))
-            Text("Label", style = ButtonDefaults.textStyleFor(small))
+            Spacer(Modifier.size(ButtonDefaults.IconSpacing))
+            Text("Label")
         }
 
         ElevatedToggleButton(
             checked = checked[2],
             onCheckedChange = { checked[2] = it },
-            modifier = Modifier.heightIn(medium),
-            shapes = ToggleButtonDefaults.shapesFor(medium),
-            contentPadding = ButtonDefaults.contentPaddingFor(medium)
+            modifier = Modifier.heightIn(ButtonDefaults.MediumContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.MediumPressedShape,
+                    ToggleButtonDefaults.MediumCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.MediumContentPadding
         ) {
             Icon(
                 if (checked[2]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(medium))
+                modifier = Modifier.size(ButtonDefaults.MediumIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(medium)))
-            Text("Label", style = ButtonDefaults.textStyleFor(medium))
+            Spacer(Modifier.size(ButtonDefaults.MediumIconSpacing))
+            Text(text = "Label", style = MaterialTheme.typography.titleMedium)
         }
 
         ElevatedToggleButton(
             checked = checked[3],
             onCheckedChange = { checked[3] = it },
-            modifier = Modifier.heightIn(large),
-            shapes = ToggleButtonDefaults.shapesFor(large),
-            contentPadding = ButtonDefaults.contentPaddingFor(large)
+            modifier = Modifier.heightIn(ButtonDefaults.LargeContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.LargePressedShape,
+                    ToggleButtonDefaults.LargeCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.LargeContentPadding
         ) {
             Icon(
                 if (checked[3]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(large))
+                modifier = Modifier.size(ButtonDefaults.LargeIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(large)))
-            Text("Label", style = ButtonDefaults.textStyleFor(large))
+            Spacer(Modifier.size(ButtonDefaults.LargeIconSpacing))
+            Text(text = "Label", style = MaterialTheme.typography.headlineSmall)
         }
 
         ElevatedToggleButton(
             checked = checked[4],
             onCheckedChange = { checked[4] = it },
-            modifier = Modifier.heightIn(extraLarge),
-            shapes = ToggleButtonDefaults.shapesFor(extraLarge),
-            contentPadding = ButtonDefaults.contentPaddingFor(extraLarge)
+            modifier = Modifier.heightIn(ButtonDefaults.XLargeContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.XLargePressedShape,
+                    ToggleButtonDefaults.XLargeCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.XLargeContentPadding
         ) {
             Icon(
                 if (checked[4]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(extraLarge))
+                modifier = Modifier.size(ButtonDefaults.XLargeIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(extraLarge)))
-            Text("Label", style = ButtonDefaults.textStyleFor(extraLarge))
+            Spacer(Modifier.size(ButtonDefaults.XLargeIconSpacing))
+            Text(text = "Label", style = MaterialTheme.typography.headlineLarge)
         }
     }
 }
@@ -294,81 +323,95 @@
         TonalToggleButton(
             checked = checked[0],
             onCheckedChange = { checked[0] = it },
-            modifier = Modifier.heightIn(extraSmall),
-            shapes = ToggleButtonDefaults.shapesFor(extraSmall),
-            contentPadding = ButtonDefaults.contentPaddingFor(extraSmall)
+            modifier = Modifier.heightIn(ButtonDefaults.XSmallContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.XSmallPressedShape,
+                    ToggleButtonDefaults.XSmallCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.XSmallContentPadding
         ) {
             Icon(
                 if (checked[0]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(extraSmall))
+                modifier = Modifier.size(ButtonDefaults.XSmallIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(extraSmall)))
-            Text("Label", style = ButtonDefaults.textStyleFor(extraSmall))
+            Spacer(Modifier.size(ButtonDefaults.XSmallIconSpacing))
+            Text("Label")
         }
 
-        TonalToggleButton(
-            checked = checked[1],
-            onCheckedChange = { checked[1] = it },
-            modifier = Modifier.heightIn(small),
-            shapes = ToggleButtonDefaults.shapesFor(small),
-            contentPadding = ButtonDefaults.contentPaddingFor(small)
-        ) {
+        TonalToggleButton(checked = checked[1], onCheckedChange = { checked[1] = it }) {
             Icon(
                 if (checked[1]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(small))
+                modifier = Modifier.size(ButtonDefaults.IconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(small)))
-            Text("Label", style = ButtonDefaults.textStyleFor(small))
+            Spacer(Modifier.size(ButtonDefaults.IconSpacing))
+            Text("Label")
         }
 
         TonalToggleButton(
             checked = checked[2],
             onCheckedChange = { checked[2] = it },
-            modifier = Modifier.heightIn(medium),
-            shapes = ToggleButtonDefaults.shapesFor(medium),
-            contentPadding = ButtonDefaults.contentPaddingFor(medium)
+            modifier = Modifier.heightIn(ButtonDefaults.MediumContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.MediumPressedShape,
+                    ToggleButtonDefaults.MediumCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.MediumContentPadding
         ) {
             Icon(
                 if (checked[2]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(medium))
+                modifier = Modifier.size(ButtonDefaults.MediumIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(medium)))
-            Text("Label", style = ButtonDefaults.textStyleFor(medium))
+            Spacer(Modifier.size(ButtonDefaults.MediumIconSpacing))
+            Text(text = "Label", style = MaterialTheme.typography.titleMedium)
         }
 
         TonalToggleButton(
             checked = checked[3],
             onCheckedChange = { checked[3] = it },
-            modifier = Modifier.heightIn(large),
-            shapes = ToggleButtonDefaults.shapesFor(large),
-            contentPadding = ButtonDefaults.contentPaddingFor(large)
+            modifier = Modifier.heightIn(ButtonDefaults.LargeContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.LargePressedShape,
+                    ToggleButtonDefaults.LargeCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.LargeContentPadding
         ) {
             Icon(
                 if (checked[3]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(large))
+                modifier = Modifier.size(ButtonDefaults.LargeIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(large)))
-            Text("Label", style = ButtonDefaults.textStyleFor(large))
+            Spacer(Modifier.size(ButtonDefaults.LargeIconSpacing))
+            Text(text = "Label", style = MaterialTheme.typography.headlineSmall)
         }
 
         TonalToggleButton(
             checked = checked[4],
             onCheckedChange = { checked[4] = it },
-            modifier = Modifier.heightIn(extraLarge),
-            shapes = ToggleButtonDefaults.shapesFor(extraLarge),
-            contentPadding = ButtonDefaults.contentPaddingFor(extraLarge)
+            modifier = Modifier.heightIn(ButtonDefaults.XLargeContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.XLargePressedShape,
+                    ToggleButtonDefaults.XLargeCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.XLargeContentPadding
         ) {
             Icon(
                 if (checked[4]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(extraLarge))
+                modifier = Modifier.size(ButtonDefaults.XLargeIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(extraLarge)))
-            Text("Label", style = ButtonDefaults.textStyleFor(extraLarge))
+            Spacer(Modifier.size(ButtonDefaults.XLargeIconSpacing))
+            Text(text = "Label", style = MaterialTheme.typography.headlineLarge)
         }
     }
 }
@@ -386,89 +429,95 @@
         OutlinedToggleButton(
             checked = checked[0],
             onCheckedChange = { checked[0] = it },
-            modifier = Modifier.heightIn(extraSmall),
-            shapes = ToggleButtonDefaults.shapesFor(extraSmall),
-            contentPadding = ButtonDefaults.contentPaddingFor(extraSmall)
+            modifier = Modifier.heightIn(ButtonDefaults.XSmallContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.XSmallPressedShape,
+                    ToggleButtonDefaults.XSmallCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.XSmallContentPadding
         ) {
             Icon(
                 if (checked[0]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(extraSmall))
+                modifier = Modifier.size(ButtonDefaults.XSmallIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(extraSmall)))
-            Text("Label", style = ButtonDefaults.textStyleFor(extraSmall))
+            Spacer(Modifier.size(ButtonDefaults.XSmallIconSpacing))
+            Text("Label")
         }
 
-        OutlinedToggleButton(
-            checked = checked[1],
-            onCheckedChange = { checked[1] = it },
-            modifier = Modifier.heightIn(small),
-            shapes = ToggleButtonDefaults.shapesFor(small),
-            contentPadding = ButtonDefaults.contentPaddingFor(small)
-        ) {
+        OutlinedToggleButton(checked = checked[1], onCheckedChange = { checked[1] = it }) {
             Icon(
                 if (checked[1]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(small))
+                modifier = Modifier.size(ButtonDefaults.IconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(small)))
-            Text("Label", style = ButtonDefaults.textStyleFor(small))
+            Spacer(Modifier.size(ButtonDefaults.IconSpacing))
+            Text("Label")
         }
 
         OutlinedToggleButton(
             checked = checked[2],
             onCheckedChange = { checked[2] = it },
-            modifier = Modifier.heightIn(medium),
-            shapes = ToggleButtonDefaults.shapesFor(medium),
-            contentPadding = ButtonDefaults.contentPaddingFor(medium)
+            modifier = Modifier.heightIn(ButtonDefaults.MediumContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.MediumPressedShape,
+                    ToggleButtonDefaults.MediumCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.MediumContentPadding
         ) {
             Icon(
                 if (checked[2]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(medium))
+                modifier = Modifier.size(ButtonDefaults.MediumIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(medium)))
-            Text("Label", style = ButtonDefaults.textStyleFor(medium))
+            Spacer(Modifier.size(ButtonDefaults.MediumIconSpacing))
+            Text(text = "Label", style = MaterialTheme.typography.titleMedium)
         }
 
         OutlinedToggleButton(
             checked = checked[3],
             onCheckedChange = { checked[3] = it },
-            modifier = Modifier.heightIn(large),
-            shapes = ToggleButtonDefaults.shapesFor(large),
-            contentPadding = ButtonDefaults.contentPaddingFor(large)
+            modifier = Modifier.heightIn(ButtonDefaults.LargeContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.LargePressedShape,
+                    ToggleButtonDefaults.LargeCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.LargeContentPadding
         ) {
             Icon(
                 if (checked[3]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(large))
+                modifier = Modifier.size(ButtonDefaults.LargeIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(large)))
-            Text("Label", style = ButtonDefaults.textStyleFor(large))
+            Spacer(Modifier.size(ButtonDefaults.LargeIconSpacing))
+            Text(text = "Label", style = MaterialTheme.typography.headlineSmall)
         }
 
         OutlinedToggleButton(
             checked = checked[4],
             onCheckedChange = { checked[4] = it },
-            modifier = Modifier.heightIn(extraLarge),
-            shapes = ToggleButtonDefaults.shapesFor(extraLarge),
-            contentPadding = ButtonDefaults.contentPaddingFor(extraLarge)
+            modifier = Modifier.heightIn(ButtonDefaults.XLargeContainerHeight),
+            shapes =
+                ToggleButtonDefaults.shapes(
+                    ToggleButtonDefaults.shape,
+                    ToggleButtonDefaults.XLargePressedShape,
+                    ToggleButtonDefaults.XLargeCheckedSquareShape
+                ),
+            contentPadding = ButtonDefaults.XLargeContentPadding
         ) {
             Icon(
                 if (checked[4]) Icons.Filled.Edit else Icons.Outlined.Edit,
                 contentDescription = "Localized description",
-                modifier = Modifier.size(ButtonDefaults.iconSizeFor(extraLarge))
+                modifier = Modifier.size(ButtonDefaults.XLargeIconSize)
             )
-            Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(extraLarge)))
-            Text("Label", style = ButtonDefaults.textStyleFor(extraLarge))
+            Spacer(Modifier.size(ButtonDefaults.XLargeIconSpacing))
+            Text(text = "Label", style = MaterialTheme.typography.headlineLarge)
         }
     }
 }
-
-@OptIn(ExperimentalMaterial3ExpressiveApi::class)
-val extraSmall = ButtonDefaults.ExtraSmallContainerHeight
-val small = ButtonDefaults.MinHeight
-@OptIn(ExperimentalMaterial3ExpressiveApi::class) val medium = ButtonDefaults.MediumContainerHeight
-@OptIn(ExperimentalMaterial3ExpressiveApi::class) val large = ButtonDefaults.LargeContainerHeight
-@OptIn(ExperimentalMaterial3ExpressiveApi::class)
-val extraLarge = ButtonDefaults.ExtraLargeContainerHeight
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ButtonSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ButtonSamples.kt
index ff10191..ce1bc17 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ButtonSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ButtonSamples.kt
@@ -29,6 +29,7 @@
 import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
 import androidx.compose.material3.FilledTonalButton
 import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.OutlinedButton
 import androidx.compose.material3.Text
 import androidx.compose.material3.TextButton
@@ -154,18 +155,17 @@
 @Sampled
 @Composable
 fun XSmallButtonWithIconSample() {
-    val size = ButtonDefaults.ExtraSmallContainerHeight
     Button(
         onClick = { /* Do something! */ },
-        modifier = Modifier.heightIn(size),
-        contentPadding = ButtonDefaults.contentPaddingFor(size)
+        modifier = Modifier.heightIn(ButtonDefaults.XSmallContainerHeight),
+        contentPadding = ButtonDefaults.XSmallContentPadding
     ) {
         Icon(
             Icons.Filled.Edit,
             contentDescription = "Localized description",
-            modifier = Modifier.size(ButtonDefaults.iconSizeFor(size))
+            modifier = Modifier.size(ButtonDefaults.XSmallIconSize)
         )
-        Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
+        Spacer(Modifier.size(ButtonDefaults.XSmallIconSpacing))
         Text("Label")
     }
 }
@@ -175,19 +175,18 @@
 @Sampled
 @Composable
 fun MediumButtonWithIconSample() {
-    val size = ButtonDefaults.MediumContainerHeight
     Button(
         onClick = { /* Do something! */ },
-        modifier = Modifier.heightIn(size),
-        contentPadding = ButtonDefaults.contentPaddingFor(size)
+        modifier = Modifier.heightIn(ButtonDefaults.MediumContainerHeight),
+        contentPadding = ButtonDefaults.MediumContentPadding
     ) {
         Icon(
             Icons.Filled.Edit,
             contentDescription = "Localized description",
-            modifier = Modifier.size(ButtonDefaults.iconSizeFor(size))
+            modifier = Modifier.size(ButtonDefaults.MediumIconSize)
         )
-        Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
-        Text("Label", style = ButtonDefaults.textStyleFor(size))
+        Spacer(Modifier.size(ButtonDefaults.MediumIconSpacing))
+        Text(text = "Label", style = MaterialTheme.typography.titleMedium)
     }
 }
 
@@ -196,19 +195,18 @@
 @Sampled
 @Composable
 fun LargeButtonWithIconSample() {
-    val size = ButtonDefaults.LargeContainerHeight
     Button(
         onClick = { /* Do something! */ },
-        modifier = Modifier.heightIn(size),
-        contentPadding = ButtonDefaults.contentPaddingFor(size)
+        modifier = Modifier.heightIn(ButtonDefaults.LargeContainerHeight),
+        contentPadding = ButtonDefaults.LargeContentPadding
     ) {
         Icon(
             Icons.Filled.Edit,
             contentDescription = "Localized description",
-            modifier = Modifier.size(ButtonDefaults.iconSizeFor(size))
+            modifier = Modifier.size(ButtonDefaults.LargeIconSize)
         )
-        Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
-        Text("Label", style = ButtonDefaults.textStyleFor(size))
+        Spacer(Modifier.size(ButtonDefaults.LargeIconSpacing))
+        Text(text = "Label", style = MaterialTheme.typography.headlineSmall)
     }
 }
 
@@ -217,18 +215,17 @@
 @Sampled
 @Composable
 fun XLargeButtonWithIconSample() {
-    val size = ButtonDefaults.ExtraLargeContainerHeight
     Button(
         onClick = { /* Do something! */ },
-        modifier = Modifier.heightIn(size),
-        contentPadding = ButtonDefaults.contentPaddingFor(size)
+        modifier = Modifier.heightIn(ButtonDefaults.XLargeContainerHeight),
+        contentPadding = ButtonDefaults.XLargeContentPadding
     ) {
         Icon(
             Icons.Filled.Edit,
             contentDescription = "Localized description",
-            modifier = Modifier.size(ButtonDefaults.iconSizeFor(size))
+            modifier = Modifier.size(ButtonDefaults.XLargeIconSize)
         )
-        Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
-        Text("Label", style = ButtonDefaults.textStyleFor(size))
+        Spacer(Modifier.size(ButtonDefaults.XLargeIconSpacing))
+        Text(text = "Label", style = MaterialTheme.typography.headlineLarge)
     }
 }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ToggleButtonSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ToggleButtonSamples.kt
index 3dac6e1..49b797d 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ToggleButtonSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ToggleButtonSamples.kt
@@ -27,6 +27,7 @@
 import androidx.compose.material3.ElevatedToggleButton
 import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
 import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.OutlinedToggleButton
 import androidx.compose.material3.Text
 import androidx.compose.material3.ToggleButton
@@ -123,20 +124,24 @@
 @Composable
 fun XSmallToggleButtonWithIconSample() {
     var checked by remember { mutableStateOf(false) }
-    val size = ButtonDefaults.ExtraSmallContainerHeight
     ToggleButton(
         checked = checked,
         onCheckedChange = { checked = it },
-        modifier = Modifier.heightIn(size),
-        shapes = ToggleButtonDefaults.shapesFor(size),
-        contentPadding = ButtonDefaults.contentPaddingFor(size)
+        modifier = Modifier.heightIn(ButtonDefaults.XSmallContainerHeight),
+        shapes =
+            ToggleButtonDefaults.shapes(
+                shape = ToggleButtonDefaults.shape,
+                pressedShape = ToggleButtonDefaults.XSmallPressedShape,
+                checkedShape = ToggleButtonDefaults.XSmallCheckedSquareShape
+            ),
+        contentPadding = ButtonDefaults.XSmallContentPadding
     ) {
         Icon(
             if (checked) Icons.Filled.Edit else Icons.Outlined.Edit,
             contentDescription = "Localized description",
-            modifier = Modifier.size(ButtonDefaults.iconSizeFor(size))
+            modifier = Modifier.size(ButtonDefaults.XSmallIconSize)
         )
-        Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
+        Spacer(Modifier.size(ButtonDefaults.XSmallIconSpacing))
         Text("Label")
     }
 }
@@ -147,21 +152,25 @@
 @Composable
 fun MediumToggleButtonWithIconSample() {
     var checked by remember { mutableStateOf(false) }
-    val size = ButtonDefaults.MediumContainerHeight
     ToggleButton(
         checked = checked,
         onCheckedChange = { checked = it },
-        modifier = Modifier.heightIn(size),
-        shapes = ToggleButtonDefaults.shapesFor(size),
-        contentPadding = ButtonDefaults.contentPaddingFor(size)
+        modifier = Modifier.heightIn(ButtonDefaults.MediumContainerHeight),
+        shapes =
+            ToggleButtonDefaults.shapes(
+                shape = ToggleButtonDefaults.shape,
+                pressedShape = ToggleButtonDefaults.MediumPressedShape,
+                checkedShape = ToggleButtonDefaults.MediumCheckedSquareShape
+            ),
+        contentPadding = ButtonDefaults.MediumContentPadding
     ) {
         Icon(
             if (checked) Icons.Filled.Edit else Icons.Outlined.Edit,
             contentDescription = "Localized description",
-            modifier = Modifier.size(ButtonDefaults.iconSizeFor(size))
+            modifier = Modifier.size(ButtonDefaults.MediumIconSize)
         )
-        Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
-        Text("Label", style = ButtonDefaults.textStyleFor(size))
+        Spacer(Modifier.size(ButtonDefaults.MediumIconSpacing))
+        Text(text = "Label", style = MaterialTheme.typography.titleMedium)
     }
 }
 
@@ -171,21 +180,25 @@
 @Composable
 fun LargeToggleButtonWithIconSample() {
     var checked by remember { mutableStateOf(false) }
-    val size = ButtonDefaults.LargeContainerHeight
     ToggleButton(
         checked = checked,
         onCheckedChange = { checked = it },
-        modifier = Modifier.heightIn(size),
-        shapes = ToggleButtonDefaults.shapesFor(size),
-        contentPadding = ButtonDefaults.contentPaddingFor(size)
+        modifier = Modifier.heightIn(ButtonDefaults.LargeContainerHeight),
+        shapes =
+            ToggleButtonDefaults.shapes(
+                shape = ToggleButtonDefaults.shape,
+                pressedShape = ToggleButtonDefaults.LargePressedShape,
+                checkedShape = ToggleButtonDefaults.LargeCheckedSquareShape
+            ),
+        contentPadding = ButtonDefaults.LargeContentPadding
     ) {
         Icon(
             if (checked) Icons.Filled.Edit else Icons.Outlined.Edit,
             contentDescription = "Localized description",
-            modifier = Modifier.size(ButtonDefaults.iconSizeFor(size))
+            modifier = Modifier.size(ButtonDefaults.LargeIconSize)
         )
-        Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
-        Text("Label", style = ButtonDefaults.textStyleFor(size))
+        Spacer(Modifier.size(ButtonDefaults.LargeIconSpacing))
+        Text(text = "Label", style = MaterialTheme.typography.headlineSmall)
     }
 }
 
@@ -195,20 +208,24 @@
 @Composable
 fun XLargeToggleButtonWithIconSample() {
     var checked by remember { mutableStateOf(false) }
-    val size = ButtonDefaults.ExtraLargeContainerHeight
     ToggleButton(
         checked = checked,
         onCheckedChange = { checked = it },
-        modifier = Modifier.heightIn(size),
-        shapes = ToggleButtonDefaults.shapesFor(size),
-        contentPadding = ButtonDefaults.contentPaddingFor(size)
+        modifier = Modifier.heightIn(ButtonDefaults.XLargeContainerHeight),
+        shapes =
+            ToggleButtonDefaults.shapes(
+                shape = ToggleButtonDefaults.shape,
+                pressedShape = ToggleButtonDefaults.XLargePressedShape,
+                checkedShape = ToggleButtonDefaults.XLargeCheckedSquareShape
+            ),
+        contentPadding = ButtonDefaults.XLargeContentPadding
     ) {
         Icon(
             if (checked) Icons.Filled.Edit else Icons.Outlined.Edit,
             contentDescription = "Localized description",
-            modifier = Modifier.size(ButtonDefaults.iconSizeFor(size))
+            modifier = Modifier.size(ButtonDefaults.XLargeIconSize)
         )
-        Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
-        Text("Label", style = ButtonDefaults.textStyleFor(size))
+        Spacer(Modifier.size(ButtonDefaults.XLargeIconSpacing))
+        Text(text = "Label", style = MaterialTheme.typography.headlineLarge)
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AppBarTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AppBarTest.kt
index 298d588..e9d9428 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AppBarTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AppBarTest.kt
@@ -2072,100 +2072,6 @@
             .assertTopPositionInRootIsEqualTo(rule.rootHeight() - 12.dp - fabBounds.height)
     }
 
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-    @Test
-    fun topAppBar_pinned_changeColors_reverseLayout_scrolledContent() {
-        lateinit var scrollBehavior: TopAppBarScrollBehavior
-        rule.setMaterialContent(lightColorScheme()) {
-            scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(reverseLayout = true)
-            Scaffold(
-                modifier = Modifier.fillMaxSize(),
-                topBar = {
-                    Box(Modifier.testTag(TopAppBarTestTag)) {
-                        TopAppBar(
-                            title = { Text("Title") },
-                            scrollBehavior = scrollBehavior,
-                            colors =
-                                TopAppBarDefaults.topAppBarColors(
-                                    containerColor = Color.Red,
-                                    scrolledContainerColor = Color.Green
-                                )
-                        )
-                    }
-                },
-                content = { paddingValues ->
-                    LazyColumn(
-                        modifier =
-                            Modifier.testTag(LazyListTag)
-                                .padding(paddingValues)
-                                .nestedScroll(scrollBehavior.nestedScrollConnection),
-                        reverseLayout = true,
-                    ) {
-                        items(List(100) { it }.size) { Text(it.toString()) }
-                    }
-                }
-            )
-        }
-
-        rule.onNodeWithTag(TopAppBarTestTag).captureToImage().assertContainsColor(Color.Green)
-
-        // Swipe down to scroll the content.
-        rule.onNodeWithTag(LazyListTag).performTouchInput { swipeDown(startY = 0f, endY = 500f) }
-        rule.waitForIdle()
-        rule.onNodeWithTag(TopAppBarTestTag).captureToImage().assertContainsColor(Color.Green)
-
-        // Swipe down to scroll the content and collapse the top app bar.
-        rule.onNodeWithTag(LazyListTag).performTouchInput {
-            swipeDown(startY = 500f, endY = height + 1000f)
-        }
-        rule.waitForIdle()
-        rule.onNodeWithTag(TopAppBarTestTag).captureToImage().assertContainsColor(Color.Red)
-    }
-
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-    @Test
-    fun topAppBar_pinned_changeColors_scrolledContent() {
-        lateinit var scrollBehavior: TopAppBarScrollBehavior
-        rule.setMaterialContent(lightColorScheme()) {
-            scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
-            Scaffold(
-                modifier = Modifier.fillMaxSize(),
-                topBar = {
-                    Box(Modifier.testTag(TopAppBarTestTag)) {
-                        TopAppBar(
-                            title = { Text("Title") },
-                            scrollBehavior = scrollBehavior,
-                            colors =
-                                TopAppBarDefaults.topAppBarColors(
-                                    containerColor = Color.Red,
-                                    scrolledContainerColor = Color.Green
-                                )
-                        )
-                    }
-                },
-                content = { paddingValues ->
-                    LazyColumn(
-                        modifier =
-                            Modifier.testTag(LazyListTag)
-                                .padding(paddingValues)
-                                .nestedScroll(scrollBehavior.nestedScrollConnection),
-                    ) {
-                        items(List(100) { it }.size) { Text(it.toString()) }
-                    }
-                }
-            )
-        }
-
-        rule.onNodeWithTag(TopAppBarTestTag).captureToImage().assertContainsColor(Color.Red)
-
-        // Swipe up to scroll the content.
-        rule.onNodeWithTag(LazyListTag).performTouchInput {
-            swipeUp(startY = height - 200f, endY = height - 1000f)
-        }
-        rule.waitForIdle()
-        rule.onNodeWithTag(TopAppBarTestTag).captureToImage().assertContainsColor(Color.Green)
-    }
-
     @Test
     fun bottomAppBar_exitAlways_allowHorizontalScroll() {
         lateinit var state: LazyListState
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ButtonTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ButtonTest.kt
index c64d2b8..acca58b 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ButtonTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ButtonTest.kt
@@ -447,28 +447,29 @@
     fun button_xSmall_positioning() {
         var expectedStartPadding: Dp = 0.dp
         var expectedEndPadding: Dp = 0.dp
-        val size = ButtonDefaults.ExtraSmallContainerHeight
         rule.setMaterialContent(lightColorScheme()) {
             val layoutDirection = LocalLayoutDirection.current
             expectedStartPadding =
-                ButtonDefaults.ExtraSmallContentPadding.calculateStartPadding(layoutDirection)
+                ButtonDefaults.XSmallContentPadding.calculateStartPadding(layoutDirection)
             expectedEndPadding =
-                ButtonDefaults.ExtraSmallContentPadding.calculateEndPadding(layoutDirection)
+                ButtonDefaults.XSmallContentPadding.calculateEndPadding(layoutDirection)
             Box {
                 Button(
                     onClick = { /* Do something! */ },
-                    modifier = Modifier.heightIn(size).testTag(ButtonTestTag),
-                    contentPadding = ButtonDefaults.contentPaddingFor(size)
+                    modifier =
+                        Modifier.heightIn(ButtonDefaults.XSmallContainerHeight)
+                            .testTag(ButtonTestTag),
+                    contentPadding = ButtonDefaults.XSmallContentPadding
                 ) {
                     Icon(
                         Icons.Filled.Edit,
                         contentDescription = "Localized description",
                         modifier =
-                            Modifier.size(ButtonDefaults.iconSizeFor(size))
+                            Modifier.size(ButtonDefaults.XSmallIconSize)
                                 .testTag(IconTestTag)
                                 .semantics(mergeDescendants = true) {}
                     )
-                    Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
+                    Spacer(Modifier.size(ButtonDefaults.XSmallIconSpacing))
                     Text(
                         "Label",
                         modifier =
@@ -487,7 +488,7 @@
             "padding between start of button and start of icon"
         )
         (textBounds.left - iconBounds.right).assertIsEqualTo(
-            ButtonDefaults.ExtraSmallIconSpacing,
+            ButtonDefaults.XSmallIconSpacing,
             "spacing between icon and label"
         )
         (buttonBounds.right - textBounds.right).assertIsEqualTo(
@@ -495,7 +496,7 @@
             "padding between end of label and end of button"
         )
         buttonBounds.height.assertIsEqualTo(
-            ButtonDefaults.ExtraSmallContainerHeight,
+            ButtonDefaults.XSmallContainerHeight,
             "height of button"
         )
     }
@@ -505,7 +506,6 @@
     fun button_medium_positioning() {
         var expectedStartPadding: Dp = 0.dp
         var expectedEndPadding: Dp = 0.dp
-        val size = ButtonDefaults.MediumContainerHeight
         rule.setMaterialContent(lightColorScheme()) {
             val layoutDirection = LocalLayoutDirection.current
             expectedStartPadding =
@@ -515,18 +515,20 @@
             Box {
                 Button(
                     onClick = { /* Do something! */ },
-                    modifier = Modifier.heightIn(size).testTag(ButtonTestTag),
-                    contentPadding = ButtonDefaults.contentPaddingFor(size)
+                    modifier =
+                        Modifier.heightIn(ButtonDefaults.MediumContainerHeight)
+                            .testTag(ButtonTestTag),
+                    contentPadding = ButtonDefaults.MediumContentPadding
                 ) {
                     Icon(
                         Icons.Filled.Edit,
                         contentDescription = "Localized description",
                         modifier =
-                            Modifier.size(ButtonDefaults.iconSizeFor(size))
+                            Modifier.size(ButtonDefaults.MediumIconSize)
                                 .testTag(IconTestTag)
                                 .semantics(mergeDescendants = true) {}
                     )
-                    Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
+                    Spacer(Modifier.size(ButtonDefaults.MediumIconSpacing))
                     Text(
                         "Label",
                         modifier =
@@ -563,7 +565,6 @@
     fun button_large_positioning() {
         var expectedStartPadding: Dp = 0.dp
         var expectedEndPadding: Dp = 0.dp
-        val size = ButtonDefaults.LargeContainerHeight
         rule.setMaterialContent(lightColorScheme()) {
             val layoutDirection = LocalLayoutDirection.current
             expectedStartPadding =
@@ -573,18 +574,20 @@
             Box {
                 Button(
                     onClick = { /* Do something! */ },
-                    modifier = Modifier.heightIn(size).testTag(ButtonTestTag),
-                    contentPadding = ButtonDefaults.contentPaddingFor(size)
+                    modifier =
+                        Modifier.heightIn(ButtonDefaults.LargeContainerHeight)
+                            .testTag(ButtonTestTag),
+                    contentPadding = ButtonDefaults.LargeContentPadding
                 ) {
                     Icon(
                         Icons.Filled.Edit,
                         contentDescription = "Localized description",
                         modifier =
-                            Modifier.size(ButtonDefaults.iconSizeFor(size))
+                            Modifier.size(ButtonDefaults.LargeIconSize)
                                 .testTag(IconTestTag)
                                 .semantics(mergeDescendants = true) {}
                     )
-                    Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
+                    Spacer(Modifier.size(ButtonDefaults.LargeIconSpacing))
                     Text(
                         "Label",
                         modifier =
@@ -618,28 +621,29 @@
     fun button_xLarge_positioning() {
         var expectedStartPadding: Dp = 0.dp
         var expectedEndPadding: Dp = 0.dp
-        val size = ButtonDefaults.ExtraLargeContainerHeight
         rule.setMaterialContent(lightColorScheme()) {
             val layoutDirection = LocalLayoutDirection.current
             expectedStartPadding =
-                ButtonDefaults.ExtraLargeContentPadding.calculateStartPadding(layoutDirection)
+                ButtonDefaults.XLargeContentPadding.calculateStartPadding(layoutDirection)
             expectedEndPadding =
-                ButtonDefaults.ExtraLargeContentPadding.calculateEndPadding(layoutDirection)
+                ButtonDefaults.XLargeContentPadding.calculateEndPadding(layoutDirection)
             Box {
                 Button(
                     onClick = { /* Do something! */ },
-                    modifier = Modifier.heightIn(size).testTag(ButtonTestTag),
-                    contentPadding = ButtonDefaults.contentPaddingFor(size)
+                    modifier =
+                        Modifier.heightIn(ButtonDefaults.XLargeContainerHeight)
+                            .testTag(ButtonTestTag),
+                    contentPadding = ButtonDefaults.XLargeContentPadding
                 ) {
                     Icon(
                         Icons.Filled.Edit,
                         contentDescription = "Localized description",
                         modifier =
-                            Modifier.size(ButtonDefaults.iconSizeFor(size))
+                            Modifier.size(ButtonDefaults.XLargeIconSize)
                                 .testTag(IconTestTag)
                                 .semantics(mergeDescendants = true) {}
                     )
-                    Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
+                    Spacer(Modifier.size(ButtonDefaults.XLargeIconSpacing))
                     Text(
                         "Label",
                         modifier =
@@ -658,7 +662,7 @@
             "padding between start of button and start of icon"
         )
         (textBounds.left - iconBounds.right).assertIsEqualTo(
-            ButtonDefaults.ExtraLargeIconSpacing,
+            ButtonDefaults.XLargeIconSpacing,
             "spacing between icon and label"
         )
         (buttonBounds.right - textBounds.right).assertIsEqualTo(
@@ -666,7 +670,7 @@
             "padding between end of label and end of button"
         )
         buttonBounds.height.assertIsEqualTo(
-            ButtonDefaults.ExtraLargeContainerHeight,
+            ButtonDefaults.XLargeContainerHeight,
             "height of button"
         )
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardTest.kt
index bdae6f7..212cf61 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardTest.kt
@@ -31,7 +31,6 @@
 import androidx.compose.testutils.assertShape
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.layout.onPlaced
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.SemanticsProperties
 import androidx.compose.ui.semantics.semantics
@@ -45,14 +44,12 @@
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.performClick
-import androidx.compose.ui.test.performMouseInput
 import androidx.compose.ui.test.performTouchInput
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth
-import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.launch
 import org.junit.Rule
@@ -279,22 +276,4 @@
         // still 0
         Truth.assertThat(state.value).isEqualTo(0)
     }
-
-    // regression test for b/296567828
-    @Test
-    fun clickableOverload_hover_doesNotRecompose() {
-        var recomposeCounter = 0
-        rule.setMaterialContent(lightColorScheme()) {
-            Card(
-                modifier = Modifier.testTag("card").onPlaced { recomposeCounter++ },
-                onClick = {}
-            ) {
-                Spacer(Modifier.size(30.dp))
-            }
-        }
-
-        rule.onNodeWithTag("card").performMouseInput { moveTo(center) }
-
-        rule.runOnIdle { assertThat(recomposeCounter).isEqualTo(1) }
-    }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/OutlinedTextFieldTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/OutlinedTextFieldTest.kt
index 2277752..997750f 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/OutlinedTextFieldTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/OutlinedTextFieldTest.kt
@@ -28,7 +28,6 @@
 import androidx.compose.foundation.layout.IntrinsicSize
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.requiredWidth
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
@@ -1943,23 +1942,6 @@
     }
 
     @Test
-    fun outlinedTextField_withTrailingIcon_inIntrinsicHeight_andTooShortWidth_doesNotCrash() {
-        // Regression test for b/328954156
-        rule.setContent {
-            Box(Modifier.width(200.dp)) {
-                Box(Modifier.height(IntrinsicSize.Min)) {
-                    OutlinedTextField(
-                        state = rememberTextFieldState(),
-                        modifier = Modifier.padding(100.dp),
-                        trailingIcon = { Box(Modifier.size(20.dp)) },
-                    )
-                }
-            }
-        }
-        // Nothing to assert; just make sure it doesn't crash
-    }
-
-    @Test
     fun outlinedTextField_stringOverload_doesNotCallOnValueChange_whenCompositionUpdatesOnly() {
         var callbackCounter = 0
 
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldTest.kt
index 9cafab4..b10e5f6 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldTest.kt
@@ -31,7 +31,6 @@
 import androidx.compose.foundation.layout.IntrinsicSize
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.requiredWidth
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
@@ -2078,23 +2077,6 @@
     }
 
     @Test
-    fun textField_withTrailingIcon_inIntrinsicHeight_andTooShortWidth_doesNotCrash() {
-        // Regression test for b/328954156
-        rule.setContent {
-            Box(Modifier.width(200.dp)) {
-                Box(Modifier.height(IntrinsicSize.Min)) {
-                    TextField(
-                        state = rememberTextFieldState(),
-                        modifier = Modifier.padding(100.dp),
-                        trailingIcon = { Box(Modifier.size(20.dp)) },
-                    )
-                }
-            }
-        }
-        // Nothing to assert; just make sure it doesn't crash
-    }
-
-    @Test
     fun textField_stringOverload_doesNotCallOnValueChange_whenCompositionUpdatesOnly() {
         var callbackCounter = 0
 
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimePickerTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimePickerTest.kt
index e635421..16b4f65 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimePickerTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimePickerTest.kt
@@ -492,22 +492,6 @@
 
     @OptIn(ExperimentalTestApi::class)
     @Test
-    fun timeInput_input12_maintainsAm() {
-        val state = TimePickerState(initialHour = 10, initialMinute = 0, is24Hour = false)
-
-        rule.setMaterialContent(lightColorScheme()) { TimeInput(state) }
-
-        rule.onNodeWithText("10").performKeyInput {
-            pressKey(Key.One)
-            pressKey(Key.Two)
-        }
-
-        assertThat(state.isPm).isFalse()
-        assertThat(state.hour).isEqualTo(0)
-    }
-
-    @OptIn(ExperimentalTestApi::class)
-    @Test
     fun timeInput_deleting_maintainsPm() {
         val state = TimePickerState(initialHour = 23, initialMinute = 23, is24Hour = false)
 
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ToggleButtonTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ToggleButtonTest.kt
index 58b3f2c..c4f2f68 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ToggleButtonTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ToggleButtonTest.kt
@@ -335,25 +335,31 @@
 
     @Test
     fun toggleButton_XSmall_positioning() {
-        val size = ButtonDefaults.ExtraSmallContainerHeight
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 ToggleButton(
                     checked = false,
                     onCheckedChange = {},
-                    modifier = Modifier.heightIn(size).testTag(ToggleButtonTag),
-                    shapes = ToggleButtonDefaults.shapesFor(size),
-                    contentPadding = ButtonDefaults.contentPaddingFor(size)
+                    modifier =
+                        Modifier.heightIn(ButtonDefaults.XSmallContainerHeight)
+                            .testTag(ToggleButtonTag),
+                    shapes =
+                        ToggleButtonDefaults.shapes(
+                            ToggleButtonDefaults.XSmallSquareShape,
+                            ToggleButtonDefaults.XSmallPressedShape,
+                            ToggleButtonDefaults.checkedShape
+                        ),
+                    contentPadding = ButtonDefaults.XSmallContentPadding
                 ) {
                     Icon(
                         Icons.Outlined.Edit,
                         contentDescription = "Localized description",
                         modifier =
-                            Modifier.size(ButtonDefaults.iconSizeFor(size))
-                                .testTag(IconTag)
-                                .semantics(mergeDescendants = true) {}
+                            Modifier.size(ButtonDefaults.XSmallIconSize).testTag(IconTag).semantics(
+                                mergeDescendants = true
+                            ) {}
                     )
-                    Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
+                    Spacer(Modifier.size(ButtonDefaults.XSmallIconSpacing))
                     Text(
                         "Label",
                         modifier = Modifier.testTag(TextTag).semantics(mergeDescendants = true) {}
@@ -373,28 +379,34 @@
 
     @Test
     fun toggleButton_Medium_positioning() {
-        val size = ButtonDefaults.MediumContainerHeight
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 ToggleButton(
                     checked = false,
                     onCheckedChange = {},
-                    modifier = Modifier.heightIn(size).testTag(ToggleButtonTag),
-                    shapes = ToggleButtonDefaults.shapesFor(size),
-                    contentPadding = ButtonDefaults.contentPaddingFor(size)
+                    modifier =
+                        Modifier.heightIn(ButtonDefaults.MediumContainerHeight)
+                            .testTag(ToggleButtonTag),
+                    shapes =
+                        ToggleButtonDefaults.shapes(
+                            ToggleButtonDefaults.MediumSquareShape,
+                            ToggleButtonDefaults.MediumPressedShape,
+                            ToggleButtonDefaults.checkedShape
+                        ),
+                    contentPadding = ButtonDefaults.MediumContentPadding
                 ) {
                     Icon(
                         Icons.Outlined.Edit,
                         contentDescription = "Localized description",
                         modifier =
-                            Modifier.size(ButtonDefaults.iconSizeFor(size))
-                                .testTag(IconTag)
-                                .semantics(mergeDescendants = true) {}
+                            Modifier.size(ButtonDefaults.MediumIconSize).testTag(IconTag).semantics(
+                                mergeDescendants = true
+                            ) {}
                     )
-                    Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
+                    Spacer(Modifier.size(ButtonDefaults.MediumIconSpacing))
                     Text(
                         "Label",
-                        style = ButtonDefaults.textStyleFor(size),
+                        style = MaterialTheme.typography.titleMedium,
                         modifier = Modifier.testTag(TextTag).semantics(mergeDescendants = true) {}
                     )
                 }
@@ -412,28 +424,34 @@
 
     @Test
     fun toggleButton_Large_positioning() {
-        val size = ButtonDefaults.LargeContainerHeight
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 ToggleButton(
                     checked = false,
                     onCheckedChange = {},
-                    modifier = Modifier.heightIn(size).testTag(ToggleButtonTag),
-                    shapes = ToggleButtonDefaults.shapesFor(size),
-                    contentPadding = ButtonDefaults.contentPaddingFor(size)
+                    modifier =
+                        Modifier.heightIn(ButtonDefaults.LargeContainerHeight)
+                            .testTag(ToggleButtonTag),
+                    shapes =
+                        ToggleButtonDefaults.shapes(
+                            ToggleButtonDefaults.LargeSquareShape,
+                            ToggleButtonDefaults.LargePressedShape,
+                            ToggleButtonDefaults.checkedShape
+                        ),
+                    contentPadding = ButtonDefaults.LargeContentPadding
                 ) {
                     Icon(
                         Icons.Outlined.Edit,
                         contentDescription = "Localized description",
                         modifier =
-                            Modifier.size(ButtonDefaults.iconSizeFor(size))
-                                .testTag(IconTag)
-                                .semantics(mergeDescendants = true) {}
+                            Modifier.size(ButtonDefaults.LargeIconSize).testTag(IconTag).semantics(
+                                mergeDescendants = true
+                            ) {}
                     )
-                    Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
+                    Spacer(Modifier.size(ButtonDefaults.LargeIconSpacing))
                     Text(
                         "Label",
-                        style = ButtonDefaults.textStyleFor(size),
+                        style = MaterialTheme.typography.headlineSmall,
                         modifier = Modifier.testTag(TextTag).semantics(mergeDescendants = true) {}
                     )
                 }
@@ -451,28 +469,34 @@
 
     @Test
     fun toggleButton_XLarge_positioning() {
-        val size = ButtonDefaults.ExtraLargeContainerHeight
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 ToggleButton(
                     checked = false,
                     onCheckedChange = {},
-                    modifier = Modifier.heightIn(size).testTag(ToggleButtonTag),
-                    shapes = ToggleButtonDefaults.shapesFor(size),
-                    contentPadding = ButtonDefaults.contentPaddingFor(size)
+                    modifier =
+                        Modifier.heightIn(ButtonDefaults.XLargeContainerHeight)
+                            .testTag(ToggleButtonTag),
+                    shapes =
+                        ToggleButtonDefaults.shapes(
+                            ToggleButtonDefaults.XLargeSquareShape,
+                            ToggleButtonDefaults.XLargePressedShape,
+                            ToggleButtonDefaults.checkedShape
+                        ),
+                    contentPadding = ButtonDefaults.XLargeContentPadding
                 ) {
                     Icon(
                         Icons.Outlined.Edit,
                         contentDescription = "Localized description",
                         modifier =
-                            Modifier.size(ButtonDefaults.iconSizeFor(size))
-                                .testTag(IconTag)
-                                .semantics(mergeDescendants = true) {}
+                            Modifier.size(ButtonDefaults.XLargeIconSize).testTag(IconTag).semantics(
+                                mergeDescendants = true
+                            ) {}
                     )
-                    Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(size)))
+                    Spacer(Modifier.size(ButtonDefaults.XLargeIconSpacing))
                     Text(
                         "Label",
-                        style = ButtonDefaults.textStyleFor(size),
+                        style = MaterialTheme.typography.headlineLarge,
                         modifier = Modifier.testTag(TextTag).semantics(mergeDescendants = true) {}
                     )
                 }
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 9078c5f..22f2ed4 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
@@ -112,9 +112,7 @@
 import androidx.compose.ui.util.fastFirst
 import androidx.compose.ui.util.fastMaxOfOrNull
 import androidx.compose.ui.util.fastSumBy
-import kotlin.DeprecationLevel
 import kotlin.math.abs
-import kotlin.math.absoluteValue
 import kotlin.math.max
 import kotlin.math.roundToInt
 
@@ -1500,9 +1498,6 @@
      * keep track of the scroll events.
      */
     val nestedScrollConnection: NestedScrollConnection
-
-    /** Indicates that the layout direction of scrollable content is reversed. */
-    @Suppress("GetterSetterNames") @get:Suppress("GetterSetterNames") val reverseLayout: Boolean
 }
 
 /** Contains default values used for the top app bar implementations. */
@@ -1757,42 +1752,14 @@
      *   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]
-     * @param reverseLayout indicates that this behavior is applied to a scrollable content that has
-     *   a reversed direction of scrolling and layout
      */
-    @Composable
-    fun pinnedScrollBehavior(
-        state: TopAppBarState = rememberTopAppBarState(),
-        canScroll: () -> Boolean = { true },
-        reverseLayout: Boolean = false,
-    ): TopAppBarScrollBehavior =
-        remember(state, canScroll) {
-            PinnedScrollBehavior(
-                state = state,
-                canScroll = canScroll,
-                reverseLayout = reverseLayout
-            )
-        }
-
-    /**
-     * Returns a pinned [TopAppBarScrollBehavior] that tracks nested-scroll callbacks and updates
-     * its [TopAppBarState.contentOffset] accordingly.
-     *
-     * The returned [TopAppBarScrollBehavior] is remembered across compositions.
-     *
-     * @param state the state object to be used to control or observe the top app bar's scroll
-     *   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]
-     */
-    @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
     @ExperimentalMaterial3Api
     @Composable
     fun pinnedScrollBehavior(
         state: TopAppBarState = rememberTopAppBarState(),
-        canScroll: () -> Boolean = { true }
+        canScroll: () -> Boolean = { true },
     ): TopAppBarScrollBehavior =
-        pinnedScrollBehavior(state = state, canScroll = canScroll, reverseLayout = false)
+        remember(state, canScroll) { PinnedScrollBehavior(state = state, canScroll = canScroll) }
 
     /**
      * Returns a [TopAppBarScrollBehavior]. A top app bar that is set up with this
@@ -2033,39 +2000,9 @@
      * A `0.0` indicates that the app bar does not overlap any content, while `1.0` indicates that
      * the entire visible app bar area overlaps the scrolled content.
      */
-    @Deprecated(
-        message = "Use the overlappedFraction function that can take a reverse layout parameter",
-        replaceWith = ReplaceWith("overlappedFraction(reverseLayout = )"),
-        DeprecationLevel.WARNING,
-    )
     val overlappedFraction: Float
-        get() = overlappedFraction()
-
-    /**
-     * Returns a value that represents the percentage of the app bar area that is overlapping with
-     * the content scrolled behind it.
-     *
-     * A `0.0` indicates that the app bar does not overlap any content, while `1.0` indicates that
-     * the entire visible app bar area overlaps the scrolled content.
-     *
-     * @param reverseLayout indicates that this behavior is applied to a scrollable content that has
-     *   a reversed layout direction.
-     */
-    fun overlappedFraction(reverseLayout: Boolean = false): Float {
-        if (reverseLayout) {
-            return if (heightOffsetLimit == -Float.MAX_VALUE && contentOffset == 0f) {
-                1f
-            } else if (heightOffsetLimit != 0f) {
-                1 -
-                    ((heightOffsetLimit + contentOffset.absoluteValue).coerceIn(
-                        minimumValue = heightOffsetLimit,
-                        maximumValue = 0f,
-                    ) / heightOffsetLimit)
-            } else {
-                0f
-            }
-        } else {
-            return if (heightOffsetLimit != 0f) {
+        get() =
+            if (heightOffsetLimit != 0f) {
                 1 -
                     ((heightOffsetLimit - contentOffset).coerceIn(
                         minimumValue = heightOffsetLimit,
@@ -2074,8 +2011,6 @@
             } else {
                 0f
             }
-        }
-    }
 
     companion object {
         /** The default [Saver] implementation for [TopAppBarState]. */
@@ -2664,16 +2599,14 @@
             "The expandedHeight is expected to be specified and finite"
         }
 
-        // Obtain the container color from the TopAppBarColors using the 'overlapFraction' (or
-        // 'reversedOverlappedFraction' for a reversed layout). This ensures that the colors will
-        // adjust whether the app bar behavior is pinned or scrolled.
+        // Obtain the container color from the TopAppBarColors using the `overlapFraction`. This
+        // ensures that the colors will adjust whether the app bar behavior is pinned or scrolled.
         // 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 targetColor by
             remember(colors, scrollBehavior) {
                 derivedStateOf {
-                    val overlappingFraction =
-                        scrollBehavior?.let { it.state.overlappedFraction(it.reverseLayout) } ?: 0f
+                    val overlappingFraction = scrollBehavior?.state?.overlappedFraction ?: 0f
                     colors.containerColor(if (overlappingFraction > 0.01f) 1f else 0f)
                 }
             }
@@ -3422,14 +3355,11 @@
  * @param state a [TopAppBarState]
  * @param canScroll a callback used to determine whether scroll events are to be handled by this
  *   [PinnedScrollBehavior]
- * @param reverseLayout indicates that this behavior is applied to a scrollable content that has a
- *   reversed direction of scrolling and layout
  */
 @OptIn(ExperimentalMaterial3Api::class)
 private class PinnedScrollBehavior(
     override val state: TopAppBarState,
     val canScroll: () -> Boolean = { true },
-    override val reverseLayout: Boolean = false,
 ) : TopAppBarScrollBehavior {
     override val isPinned: Boolean = true
     override val snapAnimationSpec: AnimationSpec<Float>? = null
@@ -3481,7 +3411,7 @@
     override val snapAnimationSpec: AnimationSpec<Float>?,
     override val flingAnimationSpec: DecayAnimationSpec<Float>?,
     val canScroll: () -> Boolean = { true },
-    override val reverseLayout: Boolean = false,
+    val reverseLayout: Boolean = false,
 ) : TopAppBarScrollBehavior {
     override val isPinned: Boolean = false
     override var nestedScrollConnection =
@@ -3556,7 +3486,6 @@
     override val flingAnimationSpec: DecayAnimationSpec<Float>?,
     val canScroll: () -> Boolean = { true },
 ) : TopAppBarScrollBehavior {
-    override val reverseLayout: Boolean = false
     override val isPinned: Boolean = false
     override var nestedScrollConnection =
         object : NestedScrollConnection {
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 b80e37c..1725866 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
@@ -58,7 +58,6 @@
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.role
 import androidx.compose.ui.semantics.semantics
-import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 
@@ -142,14 +141,15 @@
     val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
     val containerColor = colors.containerColor(enabled)
     val contentColor = colors.contentColor(enabled)
+    val shadowElevation = elevation?.shadowElevation(enabled, interactionSource)?.value ?: 0.dp
     Surface(
         onClick = onClick,
-        elevation = elevation,
         modifier = modifier.semantics { role = Role.Button },
         enabled = enabled,
         shape = shape,
         color = containerColor,
         contentColor = contentColor,
+        shadowElevation = shadowElevation,
         border = border,
         interactionSource = interactionSource
     ) {
@@ -231,7 +231,7 @@
     colors: ButtonColors = ButtonDefaults.buttonColors(),
     elevation: ButtonElevation? = ButtonDefaults.buttonElevation(),
     border: BorderStroke? = null,
-    contentPadding: PaddingValues = ButtonDefaults.contentPaddingFor(ButtonDefaults.MinHeight),
+    contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
     interactionSource: MutableInteractionSource? = null,
     content: @Composable RowScope.() -> Unit
 ) {
@@ -244,6 +244,7 @@
     val pressed by interactionSource.collectIsPressedAsState()
     val containerColor = colors.containerColor(enabled)
     val contentColor = colors.contentColor(enabled)
+    val shadowElevation = elevation?.shadowElevation(enabled, interactionSource)?.value ?: 0.dp
     val buttonShape = shapeByInteraction(shapes, pressed, defaultAnimationSpec)
 
     Surface(
@@ -253,7 +254,7 @@
         shape = buttonShape,
         color = containerColor,
         contentColor = contentColor,
-        elevation = elevation,
+        shadowElevation = shadowElevation,
         border = border,
         interactionSource = interactionSource
     ) {
@@ -409,7 +410,7 @@
     colors: ButtonColors = ButtonDefaults.elevatedButtonColors(),
     elevation: ButtonElevation? = ButtonDefaults.elevatedButtonElevation(),
     border: BorderStroke? = null,
-    contentPadding: PaddingValues = ButtonDefaults.contentPaddingFor(ButtonDefaults.MinHeight),
+    contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
     interactionSource: MutableInteractionSource? = null,
     content: @Composable RowScope.() -> Unit
 ) =
@@ -562,7 +563,7 @@
     colors: ButtonColors = ButtonDefaults.filledTonalButtonColors(),
     elevation: ButtonElevation? = ButtonDefaults.filledTonalButtonElevation(),
     border: BorderStroke? = null,
-    contentPadding: PaddingValues = ButtonDefaults.contentPaddingFor(ButtonDefaults.MinHeight),
+    contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
     interactionSource: MutableInteractionSource? = null,
     content: @Composable RowScope.() -> Unit
 ) =
@@ -713,7 +714,7 @@
     colors: ButtonColors = ButtonDefaults.outlinedButtonColors(),
     elevation: ButtonElevation? = null,
     border: BorderStroke? = ButtonDefaults.outlinedButtonBorder(enabled),
-    contentPadding: PaddingValues = ButtonDefaults.contentPaddingFor(ButtonDefaults.MinHeight),
+    contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
     interactionSource: MutableInteractionSource? = null,
     content: @Composable RowScope.() -> Unit
 ) =
@@ -961,7 +962,7 @@
 
     /** Default content padding for an extra small button. */
     @ExperimentalMaterial3ExpressiveApi
-    val ExtraSmallContentPadding
+    val XSmallContentPadding
         get() =
             PaddingValues(
                 // TODO update with the value from ButtonXSmallTokens.kt once it's been corrected
@@ -995,7 +996,7 @@
 
     /** Default content padding for an extra large button. */
     @ExperimentalMaterial3ExpressiveApi
-    val ExtraLargeContentPadding
+    val XLargeContentPadding
         get() =
             PaddingValues(
                 start = ButtonXLargeTokens.LeadingSpace,
@@ -1046,7 +1047,7 @@
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @get:ExperimentalMaterial3ExpressiveApi
     @ExperimentalMaterial3ExpressiveApi
-    val ExtraSmallContainerHeight = ButtonXSmallTokens.ContainerHeight
+    val XSmallContainerHeight = ButtonXSmallTokens.ContainerHeight
 
     /** The default height for a medium button container. */
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
@@ -1064,7 +1065,7 @@
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @get:ExperimentalMaterial3ExpressiveApi
     @ExperimentalMaterial3ExpressiveApi
-    val ExtraLargeContainerHeight = ButtonXLargeTokens.ContainerHeight
+    val XLargeContainerHeight = ButtonXLargeTokens.ContainerHeight
 
     /** The default size of the icon when used inside a small button. */
     // TODO update with the correct value in BaselineButtonTokens when available
@@ -1074,13 +1075,7 @@
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @get:ExperimentalMaterial3ExpressiveApi
     @ExperimentalMaterial3ExpressiveApi
-    val ExtraSmallIconSize = ButtonXSmallTokens.IconSize
-
-    /** The expressive size of the icon used inside a small button. */
-    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-    @get:ExperimentalMaterial3ExpressiveApi
-    @ExperimentalMaterial3ExpressiveApi
-    val SmallIconSize = ButtonSmallTokens.IconSize
+    val XSmallIconSize = ButtonXSmallTokens.IconSize
 
     /** The default size of the icon used inside of a medium button. */
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
@@ -1098,7 +1093,7 @@
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @get:ExperimentalMaterial3ExpressiveApi
     @ExperimentalMaterial3ExpressiveApi
-    val ExtraLargeIconSize = ButtonXLargeTokens.IconSize
+    val XLargeIconSize = ButtonXLargeTokens.IconSize
 
     /**
      * The default size of the spacing between an icon and a text when they used inside a small
@@ -1113,7 +1108,7 @@
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @get:ExperimentalMaterial3ExpressiveApi
     @ExperimentalMaterial3ExpressiveApi
-    val ExtraSmallIconSpacing = 4.dp
+    val XSmallIconSpacing = 4.dp
 
     /** The default spacing between an icon and a text when they used inside any medium button. */
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
@@ -1133,7 +1128,7 @@
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @get:ExperimentalMaterial3ExpressiveApi
     @ExperimentalMaterial3ExpressiveApi
-    val ExtraLargeIconSpacing = ButtonXLargeTokens.IconLabelSpace
+    val XLargeIconSpacing = ButtonXLargeTokens.IconLabelSpace
 
     /** Square shape for default buttons. */
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
@@ -1149,34 +1144,6 @@
     val pressedShape: Shape
         @Composable get() = ButtonSmallTokens.PressedContainerShape.value
 
-    /** Pressed shape for extra small buttons. */
-    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-    @get:ExperimentalMaterial3ExpressiveApi
-    @ExperimentalMaterial3ExpressiveApi
-    val extraSmallPressedShape: Shape
-        @Composable get() = ButtonXSmallTokens.PressedContainerShape.value
-
-    /** Pressed shape for medium buttons. */
-    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-    @get:ExperimentalMaterial3ExpressiveApi
-    @ExperimentalMaterial3ExpressiveApi
-    val mediumPressedShape: Shape
-        @Composable get() = ButtonMediumTokens.PressedContainerShape.value
-
-    /** Pressed shape for large buttons. */
-    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-    @get:ExperimentalMaterial3ExpressiveApi
-    @ExperimentalMaterial3ExpressiveApi
-    val largePressedShape: Shape
-        @Composable get() = ButtonLargeTokens.PressedContainerShape.value
-
-    /** Pressed shape for extra large buttons. */
-    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-    @get:ExperimentalMaterial3ExpressiveApi
-    @ExperimentalMaterial3ExpressiveApi
-    val extraLargePressedShape: Shape
-        @Composable get() = ButtonXLargeTokens.PressedContainerShape.value
-
     /** Default shape for a button. */
     val shape: Shape
         @Composable get() = ButtonSmallTokens.ContainerShapeRound.value
@@ -1205,30 +1172,14 @@
     @Composable
     fun shapes() = MaterialTheme.shapes.defaultButtonShapes
 
-    /**
-     * Creates a [ButtonShapes] that represents the default shape and pressedShape used in a
-     * [Button] and its variants.
-     *
-     * @param shape the unchecked shape for [ButtonShapes]
-     * @param pressedShape the unchecked shape for [ButtonShapes]
-     */
-    @Composable
-    @ExperimentalMaterial3ExpressiveApi
-    fun shapes(
-        shape: Shape? = null,
-        pressedShape: Shape? = null,
-    ): ButtonShapes =
-        MaterialTheme.shapes.defaultButtonShapes.copy(shape = shape, pressedShape = pressedShape)
-
     @OptIn(ExperimentalMaterial3ExpressiveApi::class)
     internal val Shapes.defaultButtonShapes: ButtonShapes
+        @Composable
         get() {
             return defaultButtonShapesCached
-                ?: ButtonShapes(
-                        shape = fromToken(ButtonSmallTokens.ContainerShapeRound),
-                        pressedShape = fromToken(ButtonSmallTokens.PressedContainerShape)
-                    )
-                    .also { defaultButtonShapesCached = it }
+                ?: ButtonShapes(shape = shape, pressedShape = pressedShape).also {
+                    defaultButtonShapesCached = it
+                }
         }
 
     /**
@@ -1575,110 +1526,6 @@
                     )
                 }
         )
-
-    /**
-     * Recommended [ButtonShapes] for a provided button height.
-     *
-     * @param buttonHeight The height of the button
-     */
-    @Composable
-    @ExperimentalMaterial3ExpressiveApi
-    fun shapesFor(buttonHeight: Dp): ButtonShapes {
-        val xSmallHeight = ExtraSmallContainerHeight
-        val smallHeight = MinHeight
-        val mediumHeight = MediumContainerHeight
-        val largeHeight = LargeContainerHeight
-        val xLargeHeight = ExtraLargeContainerHeight
-        return when {
-            buttonHeight <= (xSmallHeight + smallHeight) / 2 ->
-                shapes(shape = shape, pressedShape = extraSmallPressedShape)
-            buttonHeight <= (smallHeight + mediumHeight) / 2 -> shapes()
-            buttonHeight <= (mediumHeight + largeHeight) / 2 ->
-                shapes(shape = shape, pressedShape = mediumPressedShape)
-            buttonHeight <= (largeHeight + xLargeHeight) / 2 ->
-                shapes(shape = shape, pressedShape = largePressedShape)
-            else -> shapes(shape = shape, pressedShape = extraLargePressedShape)
-        }
-    }
-
-    /**
-     * Recommended [PaddingValues] for a provided button height.
-     *
-     * @param buttonHeight The height of the button
-     */
-    @ExperimentalMaterial3ExpressiveApi
-    fun contentPaddingFor(buttonHeight: Dp): PaddingValues {
-        val smallHeight = MinHeight
-        val mediumHeight = MediumContainerHeight
-        val largeHeight = LargeContainerHeight
-        val xLargeHeight = ExtraLargeContainerHeight
-        return when {
-            buttonHeight < smallHeight -> ExtraSmallContentPadding
-            buttonHeight < mediumHeight -> SmallContentPadding
-            buttonHeight < largeHeight -> MediumContentPadding
-            buttonHeight < xLargeHeight -> LargeContentPadding
-            else -> ExtraLargeContentPadding
-        }
-    }
-
-    /**
-     * Recommended Icon size for a provided button height.
-     *
-     * @param buttonHeight The height of the button
-     */
-    @ExperimentalMaterial3ExpressiveApi
-    fun iconSizeFor(buttonHeight: Dp): Dp {
-        val smallHeight = MinHeight
-        val mediumHeight = MediumContainerHeight
-        val largeHeight = LargeContainerHeight
-        val xLargeHeight = ExtraLargeContainerHeight
-        return when {
-            buttonHeight < smallHeight -> ExtraSmallIconSize
-            buttonHeight < mediumHeight -> SmallIconSize
-            buttonHeight < largeHeight -> MediumIconSize
-            buttonHeight < xLargeHeight -> LargeIconSize
-            else -> ExtraLargeIconSize
-        }
-    }
-
-    /**
-     * Recommended spacing after an [Icon] for a provided button height.
-     *
-     * @param buttonHeight The height of the button
-     */
-    @ExperimentalMaterial3ExpressiveApi
-    fun iconSpacingFor(buttonHeight: Dp): Dp {
-        val smallHeight = MinHeight
-        val mediumHeight = MediumContainerHeight
-        val largeHeight = LargeContainerHeight
-        val xLargeHeight = ExtraLargeContainerHeight
-        return when {
-            buttonHeight < smallHeight -> ExtraSmallIconSpacing
-            buttonHeight < mediumHeight -> IconSpacing
-            buttonHeight < largeHeight -> MediumIconSpacing
-            buttonHeight < xLargeHeight -> LargeIconSpacing
-            else -> ExtraLargeIconSpacing
-        }
-    }
-
-    /**
-     * Recommended [TextStyle] for a [Text] provided a button height.
-     *
-     * @param buttonHeight The height of the button
-     */
-    @Composable
-    @ExperimentalMaterial3ExpressiveApi
-    fun textStyleFor(buttonHeight: Dp): TextStyle {
-        val mediumHeight = MediumContainerHeight
-        val largeHeight = LargeContainerHeight
-        val xLargeHeight = ExtraLargeContainerHeight
-        return when {
-            buttonHeight < mediumHeight -> MaterialTheme.typography.labelLarge
-            buttonHeight < largeHeight -> MaterialTheme.typography.titleMedium
-            buttonHeight < xLargeHeight -> MaterialTheme.typography.headlineSmall
-            else -> MaterialTheme.typography.headlineLarge
-        }
-    }
 }
 
 /**
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 8248706..ea5bb05 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
@@ -142,9 +142,9 @@
         shape = shape,
         color = colors.containerColor(enabled),
         contentColor = colors.contentColor(enabled),
+        shadowElevation = elevation.shadowElevation(enabled, interactionSource).value,
         border = border,
         interactionSource = interactionSource,
-        elevation = elevation
     ) {
         Column(content = content)
     }
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 405ba8b..4613232 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
@@ -1957,7 +1957,7 @@
         enabled = enabled,
         shape = shape,
         color = colors.containerColor(enabled),
-        elevation = elevation,
+        shadowElevation = elevation?.shadowElevation(enabled, interactionSource)?.value ?: 0.dp,
         border = border,
         interactionSource = interactionSource
     ) {
@@ -1995,6 +1995,8 @@
     paddingValues: PaddingValues,
     interactionSource: MutableInteractionSource?
 ) {
+    @Suppress("NAME_SHADOWING")
+    val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
     // TODO(b/229794614): Animate transition between unselected and selected.
     Surface(
         selected = selected,
@@ -2003,7 +2005,7 @@
         enabled = enabled,
         shape = shape,
         color = colors.containerColor(enabled, selected),
-        elevation = elevation,
+        shadowElevation = elevation?.shadowElevation(enabled, interactionSource)?.value ?: 0.dp,
         border = border,
         interactionSource = interactionSource
     ) {
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ComponentElevation.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ComponentElevation.kt
index 7f1ec69..3b8c99bb 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ComponentElevation.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ComponentElevation.kt
@@ -31,7 +31,6 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.launch
 
 /**
@@ -97,16 +96,6 @@
     }
 }
 
-internal val ComponentElevation.hasShadows: Boolean
-    get() {
-        return elevation != 0.dp ||
-            pressedElevation != 0.dp ||
-            focusedElevation != 0.dp ||
-            hoveredElevation != 0.dp ||
-            disabledElevation != 0.dp ||
-            draggedElevation != 0.dp
-    }
-
 /**
  * Represents the shadow elevation used in a component, depending on its [enabled] state and
  * [interactionSource].
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 678ddba..672cc6c 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
@@ -165,7 +165,7 @@
         color = containerColor,
         contentColor = contentColor,
         tonalElevation = elevation.tonalElevation(),
-        elevation = elevation,
+        shadowElevation = elevation.shadowElevation(interactionSource = interactionSource).value,
         interactionSource = interactionSource
     ) {
         ProvideContentColorTextStyle(contentColor = contentColor, textStyle = textStyle) {
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButtonDefaults.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButtonDefaults.kt
index 95bd619..abd04e0 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButtonDefaults.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButtonDefaults.kt
@@ -1065,11 +1065,12 @@
 
     @OptIn(ExperimentalMaterial3ExpressiveApi::class)
     internal val Shapes.defaultIconButtonShapes: IconButtonShapes
+        @Composable
         get() {
             return defaultIconButtonShapesCached
                 ?: IconButtonShapes(
-                        shape = fromToken(SmallIconButtonTokens.ContainerShapeRound),
-                        pressedShape = fromToken(SmallIconButtonTokens.PressedContainerShape),
+                        shape = smallRoundShape,
+                        pressedShape = smallPressedShape,
                     )
                     .also { defaultIconButtonShapesCached = it }
         }
@@ -1108,12 +1109,13 @@
 
     @OptIn(ExperimentalMaterial3ExpressiveApi::class)
     internal val Shapes.defaultIconToggleButtonShapes: IconToggleButtonShapes
+        @Composable
         get() {
             return defaultIconToggleButtonShapesCached
                 ?: IconToggleButtonShapes(
-                        shape = fromToken(SmallIconButtonTokens.ContainerShapeRound),
-                        pressedShape = fromToken(SmallIconButtonTokens.PressedContainerShape),
-                        checkedShape = fromToken(SmallIconButtonTokens.SelectedContainerShapeRound)
+                        shape = smallRoundShape,
+                        pressedShape = smallPressedShape,
+                        checkedShape = smallSelectedRoundShape
                     )
                     .also { defaultIconToggleButtonShapesCached = it }
         }
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 ea003b9..56cde4e 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
@@ -98,8 +98,6 @@
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.input.pointer.positionChange
 import androidx.compose.ui.layout.Layout
-import androidx.compose.ui.layout.VerticalAlignmentLine
-import androidx.compose.ui.layout.layout
 import androidx.compose.ui.layout.layoutId
 import androidx.compose.ui.layout.onSizeChanged
 import androidx.compose.ui.platform.LocalLayoutDirection
@@ -847,7 +845,6 @@
         val isOnFirstOrLastStep =
             valueAsFraction == state.tickFractions.firstOrNull() ||
                 valueAsFraction == state.tickFractions.lastOrNull()
-        val trackCornerSize = trackPlaceable[CornerSizeAlignmentLine]
         if (state.orientation == Vertical) {
             sliderWidth = max(trackPlaceable.width, thumbPlaceable.width)
             sliderHeight = thumbPlaceable.height + trackPlaceable.height
@@ -856,8 +853,8 @@
             thumbOffsetX = (sliderWidth - thumbPlaceable.width) / 2
             thumbOffsetY =
                 if (state.steps > 0 && !isOnFirstOrLastStep) {
-                    ((trackPlaceable.height - trackCornerSize * 2) * valueAsFraction).roundToInt() +
-                        trackCornerSize
+                    ((trackPlaceable.height - state.trackCornerSize * 2) * valueAsFraction)
+                        .roundToInt() + state.trackCornerSize
                 } else {
                     (trackPlaceable.height * valueAsFraction).roundToInt()
                 }
@@ -871,8 +868,8 @@
             trackOffsetY = (sliderHeight - trackPlaceable.height) / 2
             thumbOffsetX =
                 if (state.steps > 0 && !isOnFirstOrLastStep) {
-                    ((trackPlaceable.width - trackCornerSize * 2) * valueAsFraction).roundToInt() +
-                        trackCornerSize
+                    ((trackPlaceable.width - state.trackCornerSize * 2) * valueAsFraction)
+                        .roundToInt() + state.trackCornerSize
                 } else {
                     (trackPlaceable.width * valueAsFraction).roundToInt()
                 }
@@ -1083,11 +1080,10 @@
             endValueAsFraction == state.tickFractions.firstOrNull() ||
                 endValueAsFraction == state.tickFractions.lastOrNull()
         val trackOffsetX = startThumbPlaceable.width / 2
-        val trackCornerSize = trackPlaceable[CornerSizeAlignmentLine]
         val startThumbOffsetX =
             if (state.steps > 0 && !isStartOnFirstOrLastStep) {
-                ((trackPlaceable.width - trackCornerSize * 2) * startValueAsFraction).roundToInt() +
-                    trackCornerSize
+                ((trackPlaceable.width - state.trackCornerSize * 2) * startValueAsFraction)
+                    .roundToInt() + state.trackCornerSize
             } else {
                 (trackPlaceable.width * startValueAsFraction).roundToInt()
             }
@@ -1096,8 +1092,9 @@
         val endCorrection = (startThumbPlaceable.width - endThumbPlaceable.width) / 2
         val endThumbOffsetX =
             if (state.steps > 0 && !isEndOnFirstOrLastStep) {
-                ((trackPlaceable.width - trackCornerSize * 2) * endValueAsFraction + endCorrection)
-                    .roundToInt() + trackCornerSize
+                ((trackPlaceable.width - state.trackCornerSize * 2) * endValueAsFraction +
+                        endCorrection)
+                    .roundToInt() + state.trackCornerSize
             } else {
                 (trackPlaceable.width * endValueAsFraction + endCorrection).roundToInt()
             }
@@ -1550,40 +1547,27 @@
         val activeTrackColor = colors.trackColor(enabled = enabled, active = true)
         val inactiveTickColor = colors.tickColor(enabled = enabled, active = false)
         val activeTickColor = colors.tickColor(enabled = enabled, active = true)
-        var cornerSize by remember { mutableIntStateOf(0) }
         Canvas(
             if (sliderState.orientation == Vertical) {
-                    modifier.width(TrackHeight).fillMaxHeight().let {
-                        if (sliderState.reverseVerticalDirection) it.scale(1f, -1f) else it
+                modifier.width(TrackHeight).fillMaxHeight().let {
+                    if (sliderState.reverseVerticalDirection) it.scale(1f, -1f) else it
+                }
+            } else {
+                modifier.fillMaxWidth().height(TrackHeight).let {
+                    if (sliderState.isRtl) it.scale(-1f, 1f) else it
+                }
+            }
+        ) {
+            sliderState.trackCornerSize =
+                if (trackCornerSize == Dp.Unspecified) {
+                    if (sliderState.orientation == Vertical) {
+                        size.width.roundToInt() / 2
+                    } else {
+                        size.height.roundToInt() / 2
                     }
                 } else {
-                    modifier.fillMaxWidth().height(TrackHeight).let {
-                        if (sliderState.isRtl) it.scale(-1f, 1f) else it
-                    }
+                    trackCornerSize.roundToPx()
                 }
-                .then(
-                    Modifier.layout { measurable, constraints ->
-                        val placeable = measurable.measure(constraints)
-                        cornerSize =
-                            if (trackCornerSize == Dp.Unspecified) {
-                                if (sliderState.orientation == Vertical) {
-                                    placeable.width / 2
-                                } else {
-                                    placeable.height / 2
-                                }
-                            } else {
-                                trackCornerSize.roundToPx()
-                            }
-                        layout(
-                            width = placeable.width,
-                            height = placeable.height,
-                            alignmentLines = mapOf(CornerSizeAlignmentLine to cornerSize)
-                        ) {
-                            placeable.place(0, 0)
-                        }
-                    }
-                )
-        ) {
             drawTrack(
                 tickFractions = sliderState.tickFractions,
                 activeRangeStart = 0f,
@@ -1600,7 +1584,7 @@
                 endThumbHeight = sliderState.thumbHeight.toDp(),
                 thumbTrackGapSize = thumbTrackGapSize,
                 trackInsideCornerSize = trackInsideCornerSize,
-                trackCornerSize = cornerSize.toDp(),
+                trackCornerSize = sliderState.trackCornerSize.toDp(),
                 drawStopIndicator = drawStopIndicator,
                 drawTick = drawTick,
                 isRangeSlider = false,
@@ -1691,24 +1675,13 @@
         val activeTrackColor = colors.trackColor(enabled, active = true)
         val inactiveTickColor = colors.tickColor(enabled, active = false)
         val activeTickColor = colors.tickColor(enabled, active = true)
-        var trackCornerSize by remember { mutableIntStateOf(0) }
         Canvas(
             modifier
                 .fillMaxWidth()
                 .height(TrackHeight)
                 .rotate(if (rangeSliderState.isRtl) 180f else 0f)
-                .layout { measurable, constraints ->
-                    val placeable = measurable.measure(constraints)
-                    trackCornerSize = placeable.height / 2
-                    layout(
-                        width = placeable.width,
-                        height = placeable.height,
-                        alignmentLines = mapOf(CornerSizeAlignmentLine to trackCornerSize)
-                    ) {
-                        placeable.place(0, 0)
-                    }
-                }
         ) {
+            rangeSliderState.trackCornerSize = size.height.roundToInt() / 2
             drawTrack(
                 rangeSliderState.tickFractions,
                 rangeSliderState.coercedActiveRangeStartAsFraction,
@@ -1725,7 +1698,7 @@
                 rangeSliderState.endThumbHeight.toDp(),
                 thumbTrackGapSize,
                 trackInsideCornerSize,
-                trackCornerSize.toDp(),
+                rangeSliderState.trackCornerSize.toDp(),
                 drawStopIndicator,
                 drawTick,
                 isRangeSlider = true,
@@ -2566,6 +2539,7 @@
     internal var thumbHeight by mutableIntStateOf(0)
     internal var trackWidth by mutableIntStateOf(0)
     internal var trackHeight by mutableIntStateOf(0)
+    internal var trackCornerSize by mutableIntStateOf(0)
     internal var orientation = Horizontal
     internal var reverseVerticalDirection = false
 
@@ -2762,6 +2736,7 @@
     internal var totalWidth by mutableIntStateOf(0)
     internal var rawOffsetStart by mutableFloatStateOf(0f)
     internal var rawOffsetEnd by mutableFloatStateOf(0f)
+    internal var trackCornerSize by mutableIntStateOf(0)
 
     internal var isRtl by mutableStateOf(false)
 
@@ -2983,5 +2958,3 @@
 @Stable
 internal val SliderRange.isSpecified: Boolean
     get() = packedValue != SliderRange.Unspecified.packedValue
-
-internal val CornerSizeAlignmentLine = VerticalAlignmentLine(::min)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
index 99be07d..c352d8e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
@@ -452,127 +452,6 @@
     }
 }
 
-@Composable
-internal fun Surface(
-    onClick: () -> Unit,
-    elevation: ComponentElevation?,
-    interactionSource: MutableInteractionSource,
-    modifier: Modifier = Modifier,
-    enabled: Boolean = true,
-    shape: Shape = RectangleShape,
-    color: Color = MaterialTheme.colorScheme.surface,
-    contentColor: Color = contentColorFor(color),
-    tonalElevation: Dp = 0.dp,
-    border: BorderStroke? = null,
-    content: @Composable () -> Unit
-) {
-    @Suppress("NAME_SHADOWING")
-    val shadowModifier =
-        if (elevation?.hasShadows == true) {
-            val shadowElevation =
-                elevation.shadowElevation(enabled = enabled, interactionSource = interactionSource)
-            val density = LocalDensity.current
-            Modifier.graphicsLayer {
-                this.shape = shape
-                clip = false
-                this.shadowElevation = with(density) { shadowElevation.value.toPx() }
-            }
-        } else {
-            Modifier
-        }
-
-    val absoluteElevation = LocalAbsoluteTonalElevation.current + tonalElevation
-    CompositionLocalProvider(
-        LocalContentColor provides contentColor,
-        LocalAbsoluteTonalElevation provides absoluteElevation
-    ) {
-        Box(
-            modifier =
-                modifier
-                    .minimumInteractiveComponentSize()
-                    .then(shadowModifier)
-                    .surface(
-                        shape = shape,
-                        backgroundColor = surfaceColorAtElevation(color, tonalElevation),
-                        border = border,
-                        shadowElevation = 0f
-                    )
-                    .clickable(
-                        interactionSource = interactionSource,
-                        indication = ripple(),
-                        enabled = enabled,
-                        onClick = onClick
-                    )
-                    .childSemantics(),
-            propagateMinConstraints = true
-        ) {
-            content()
-        }
-    }
-}
-
-@Composable
-@NonRestartableComposable
-internal fun Surface(
-    selected: Boolean,
-    onClick: () -> Unit,
-    elevation: ComponentElevation?,
-    modifier: Modifier = Modifier,
-    enabled: Boolean = true,
-    shape: Shape = RectangleShape,
-    color: Color = MaterialTheme.colorScheme.surface,
-    contentColor: Color = contentColorFor(color),
-    border: BorderStroke? = null,
-    interactionSource: MutableInteractionSource? = null,
-    content: @Composable () -> Unit
-) {
-    @Suppress("NAME_SHADOWING")
-    val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
-    val shadowModifier =
-        if (elevation?.hasShadows == true) {
-            val shadowElevation =
-                elevation.shadowElevation(enabled = enabled, interactionSource = interactionSource)
-            val density = LocalDensity.current
-            Modifier.graphicsLayer {
-                this.shape = shape
-                clip = false
-                this.shadowElevation = with(density) { shadowElevation.value.toPx() }
-            }
-        } else {
-            Modifier
-        }
-
-    CompositionLocalProvider(LocalContentColor provides contentColor) {
-        Box(
-            modifier =
-                modifier
-                    .minimumInteractiveComponentSize()
-                    .then(shadowModifier)
-                    .surface(
-                        shape = shape,
-                        backgroundColor =
-                            surfaceColorAtElevation(
-                                color = color,
-                                elevation = LocalAbsoluteTonalElevation.current
-                            ),
-                        border = border,
-                        shadowElevation = 0f
-                    )
-                    .selectable(
-                        selected = selected,
-                        interactionSource = interactionSource,
-                        indication = ripple(),
-                        enabled = enabled,
-                        onClick = onClick
-                    )
-                    .childSemantics(),
-            propagateMinConstraints = true
-        ) {
-            content()
-        }
-    }
-}
-
 @Stable
 private fun Modifier.surface(
     shape: Shape,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt
index 04bf28b..3e260bd 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt
@@ -542,7 +542,17 @@
     divider: @Composable () -> Unit,
     tabs: @Composable () -> Unit
 ) {
-    Surface(modifier = modifier, color = containerColor, contentColor = contentColor) {
+    Surface(
+        modifier =
+            modifier
+                .fillMaxWidth()
+                .wrapContentSize(align = Alignment.CenterStart)
+                .horizontalScroll(scrollState)
+                .selectableGroup()
+                .clipToBounds(),
+        color = containerColor,
+        contentColor = contentColor
+    ) {
         val coroutineScope = rememberCoroutineScope()
         // TODO Load the motionScheme tokens from the component tokens file
         val scrollAnimationSpec = MotionSchemeKeyTokens.DefaultSpatial.value<Float>()
@@ -603,13 +613,7 @@
                     tabs,
                     divider,
                     { scope.indicator() },
-                ),
-            modifier =
-                Modifier.fillMaxWidth()
-                    .wrapContentSize(align = Alignment.CenterStart)
-                    .horizontalScroll(scrollState)
-                    .selectableGroup()
-                    .clipToBounds(),
+                )
         ) { (tabMeasurables, dividerMeasurables, indicatorMeasurables), constraints ->
             val padding = edgePadding.roundToPx()
             val tabCount = tabMeasurables.size
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt
index fd072f5..4dc22d5 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt
@@ -1802,12 +1802,7 @@
 
         if (newValue <= max) {
             if (selection == TimePickerSelectionMode.Hour) {
-                state.hour =
-                    if (newValue == 12 && !state.isPm && !state.is24hour) {
-                        0
-                    } else {
-                        newValue + if (state.isPm && !state.is24hour) 12 else 0
-                    }
+                state.hour = newValue + if (state.isPm && !state.is24hour) 12 else 0
                 if (newValue > 1 && !state.is24hour) {
                     state.selection = TimePickerSelectionMode.Minute
                 }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ToggleButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ToggleButton.kt
index e500328..236ce95 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ToggleButton.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ToggleButton.kt
@@ -55,7 +55,6 @@
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.role
 import androidx.compose.ui.semantics.semantics
-import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 
 /**
@@ -115,11 +114,11 @@
     onCheckedChange: (Boolean) -> Unit,
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
-    shapes: ToggleButtonShapes = ToggleButtonDefaults.shapesFor(ButtonDefaults.MinHeight),
+    shapes: ToggleButtonShapes = ToggleButtonDefaults.shapes(),
     colors: ToggleButtonColors = ToggleButtonDefaults.toggleButtonColors(),
     elevation: ButtonElevation? = ButtonDefaults.buttonElevation(),
     border: BorderStroke? = null,
-    contentPadding: PaddingValues = ButtonDefaults.contentPaddingFor(ButtonDefaults.MinHeight),
+    contentPadding: PaddingValues = ToggleButtonDefaults.ContentPadding,
     interactionSource: MutableInteractionSource? = null,
     content: @Composable RowScope.() -> Unit
 ) {
@@ -209,11 +208,11 @@
     onCheckedChange: (Boolean) -> Unit,
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
-    shapes: ToggleButtonShapes = ToggleButtonDefaults.shapesFor(ButtonDefaults.MinHeight),
+    shapes: ToggleButtonShapes = ToggleButtonDefaults.shapes(),
     colors: ToggleButtonColors = ToggleButtonDefaults.elevatedToggleButtonColors(),
     elevation: ButtonElevation? = ButtonDefaults.elevatedButtonElevation(),
     border: BorderStroke? = null,
-    contentPadding: PaddingValues = ButtonDefaults.contentPaddingFor(ButtonDefaults.MinHeight),
+    contentPadding: PaddingValues = ToggleButtonDefaults.ContentPadding,
     interactionSource: MutableInteractionSource? = null,
     content: @Composable RowScope.() -> Unit
 ) =
@@ -282,11 +281,11 @@
     onCheckedChange: (Boolean) -> Unit,
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
-    shapes: ToggleButtonShapes = ToggleButtonDefaults.shapesFor(ButtonDefaults.MinHeight),
+    shapes: ToggleButtonShapes = ToggleButtonDefaults.shapes(),
     colors: ToggleButtonColors = ToggleButtonDefaults.tonalToggleButtonColors(),
     elevation: ButtonElevation? = ButtonDefaults.filledTonalButtonElevation(),
     border: BorderStroke? = null,
-    contentPadding: PaddingValues = ButtonDefaults.contentPaddingFor(ButtonDefaults.MinHeight),
+    contentPadding: PaddingValues = ToggleButtonDefaults.ContentPadding,
     interactionSource: MutableInteractionSource? = null,
     content: @Composable RowScope.() -> Unit
 ) =
@@ -353,11 +352,11 @@
     onCheckedChange: (Boolean) -> Unit,
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
-    shapes: ToggleButtonShapes = ToggleButtonDefaults.shapesFor(ButtonDefaults.MinHeight),
+    shapes: ToggleButtonShapes = ToggleButtonDefaults.shapes(),
     colors: ToggleButtonColors = ToggleButtonDefaults.outlinedToggleButtonColors(),
     elevation: ButtonElevation? = null,
     border: BorderStroke? = if (!checked) ButtonDefaults.outlinedButtonBorder(enabled) else null,
-    contentPadding: PaddingValues = ButtonDefaults.contentPaddingFor(ButtonDefaults.MinHeight),
+    contentPadding: PaddingValues = ToggleButtonDefaults.ContentPadding,
     interactionSource: MutableInteractionSource? = null,
     content: @Composable RowScope.() -> Unit
 ) =
@@ -436,12 +435,13 @@
         )
 
     internal val Shapes.defaultToggleButtonShapes: ToggleButtonShapes
+        @Composable
         get() {
             return defaultToggleButtonShapesCached
                 ?: ToggleButtonShapes(
-                        shape = fromToken(ButtonSmallTokens.ContainerShapeRound),
-                        pressedShape = RoundedCornerShape(6.dp),
-                        checkedShape = fromToken(ButtonSmallTokens.SelectedContainerShapeSquare)
+                        shape = shape,
+                        pressedShape = pressedShape,
+                        checkedShape = checkedShape
                     )
                     .also { defaultToggleButtonShapesCached = it }
         }
@@ -467,51 +467,51 @@
         @Composable get() = ButtonSmallTokens.SelectedContainerShapeSquare.value
 
     /** The default square shape for a extra small toggle button */
-    val extraSmallSquareShape: Shape
+    val XSmallSquareShape: Shape
         @Composable get() = ButtonXSmallTokens.ContainerShapeSquare.value
 
     /** The default square shape for a medium toggle button */
-    val mediumSquareShape: Shape
+    val MediumSquareShape: Shape
         @Composable get() = ButtonMediumTokens.ContainerShapeSquare.value
 
     /** The default square shape for a large toggle button */
-    val largeSquareShape: Shape
+    val LargeSquareShape: Shape
         @Composable get() = ButtonLargeTokens.ContainerShapeSquare.value
 
     /** The default square shape for a extra large toggle button */
-    val extraLargeSquareShape: Shape
+    val XLargeSquareShape: Shape
         @Composable get() = ButtonXLargeTokens.ContainerShapeSquare.value
 
     /** The default pressed shape for a extra small toggle button */
-    val extraSmallPressedShape: Shape
+    val XSmallPressedShape: Shape
         @Composable get() = ButtonXSmallTokens.PressedContainerShape.value
 
     /** The default pressed shape for a medium toggle button */
-    val mediumPressedShape: Shape
+    val MediumPressedShape: Shape
         @Composable get() = ButtonMediumTokens.PressedContainerShape.value
 
     /** The default pressed shape for a large toggle button */
-    val largePressedShape: Shape
+    val LargePressedShape: Shape
         @Composable get() = ButtonLargeTokens.PressedContainerShape.value
 
     /** The default pressed shape for a extra large toggle button */
-    val extraLargePressedShape: Shape
+    val XLargePressedShape: Shape
         @Composable get() = ButtonXLargeTokens.PressedContainerShape.value
 
     /** The default checked square shape for a extra small toggle button */
-    val extraSmallCheckedSquareShape: Shape
+    val XSmallCheckedSquareShape: Shape
         @Composable get() = ButtonXSmallTokens.ContainerShapeSquare.value
 
     /** The default checked square shape for a medium toggle button */
-    val mediumCheckedSquareShape: Shape
+    val MediumCheckedSquareShape: Shape
         @Composable get() = ButtonMediumTokens.ContainerShapeSquare.value
 
     /** The default checked square shape for a large toggle button */
-    val largeCheckedSquareShape: Shape
+    val LargeCheckedSquareShape: Shape
         @Composable get() = ButtonLargeTokens.ContainerShapeSquare.value
 
     /** The default checked square shape for a extra large toggle button */
-    val extraLargeCheckedSquareShape: Shape
+    val XLargeCheckedSquareShape: Shape
         @Composable get() = ButtonXLargeTokens.ContainerShapeSquare.value
 
     /**
@@ -740,47 +740,6 @@
                     )
                     .also { defaultOutlinedToggleButtonColorsCached = it }
         }
-
-    /**
-     * Recommended [ToggleButtonShapes] for a provided toggle button height.
-     *
-     * @param buttonHeight The height of the button
-     */
-    @Composable
-    fun shapesFor(buttonHeight: Dp): ToggleButtonShapes {
-        val xSmallHeight = ButtonDefaults.ExtraSmallContainerHeight
-        val smallHeight = ButtonDefaults.MinHeight
-        val mediumHeight = ButtonDefaults.MediumContainerHeight
-        val largeHeight = ButtonDefaults.LargeContainerHeight
-        val xLargeHeight = ButtonDefaults.ExtraLargeContainerHeight
-        return when {
-            buttonHeight <= (xSmallHeight + smallHeight) / 2 ->
-                shapes(
-                    shape = shape,
-                    pressedShape = extraSmallPressedShape,
-                    checkedShape = extraSmallCheckedSquareShape
-                )
-            buttonHeight <= (smallHeight + mediumHeight) / 2 -> shapes()
-            buttonHeight <= (mediumHeight + largeHeight) / 2 ->
-                shapes(
-                    shape = shape,
-                    pressedShape = mediumPressedShape,
-                    checkedShape = mediumCheckedSquareShape
-                )
-            buttonHeight <= (largeHeight + xLargeHeight) / 2 ->
-                shapes(
-                    shape = shape,
-                    pressedShape = largePressedShape,
-                    checkedShape = largeCheckedSquareShape
-                )
-            else ->
-                shapes(
-                    shape = shape,
-                    pressedShape = extraLargePressedShape,
-                    checkedShape = extraLargeCheckedSquareShape
-                )
-        }
-    }
 }
 
 /**
diff --git a/compose/runtime/runtime/api/current.txt b/compose/runtime/runtime/api/current.txt
index ac1422f..2e05df7b 100644
--- a/compose/runtime/runtime/api/current.txt
+++ b/compose/runtime/runtime/api/current.txt
@@ -804,7 +804,7 @@
     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, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface FunctionKeyMeta {
+  @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();
@@ -813,7 +813,7 @@
     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, kotlin.annotation.AnnotationTarget.FUNCTION}) public static @interface FunctionKeyMeta.Container {
+  @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();
     property public abstract int endOffset;
     property public abstract int key;
diff --git a/compose/runtime/runtime/api/restricted_current.txt b/compose/runtime/runtime/api/restricted_current.txt
index 5dbdb3b..4283d65 100644
--- a/compose/runtime/runtime/api/restricted_current.txt
+++ b/compose/runtime/runtime/api/restricted_current.txt
@@ -858,7 +858,7 @@
     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, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface FunctionKeyMeta {
+  @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();
@@ -867,7 +867,7 @@
     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, kotlin.annotation.AnnotationTarget.FUNCTION}) public static @interface FunctionKeyMeta.Container {
+  @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();
     property public abstract int endOffset;
     property public abstract int key;
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/build.gradle b/compose/runtime/runtime/compose-runtime-benchmark/build.gradle
index 377bec3..1b1c3d3 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/build.gradle
+++ b/compose/runtime/runtime/compose-runtime-benchmark/build.gradle
@@ -52,7 +52,8 @@
     androidTestImplementation(libs.kotlinReflect)
     androidTestImplementation(libs.kotlinCoroutinesTest)
     androidTestImplementation(androidx.projectOrArtifact(":benchmark:benchmark-junit4"))
-    androidTestImplementation("androidx.activity:activity-compose:1.10.1")
+    androidTestImplementation("androidx.activity:activity:1.2.0")
+    androidTestImplementation(project(":activity:activity-compose"))
     // old version of common-java8 conflicts with newer version, because both have
     // DefaultLifecycleEventObserver.
     // Outside of androidx this is resolved via constraint added to lifecycle-common,
diff --git a/compose/runtime/runtime/integration-tests/build.gradle b/compose/runtime/runtime/integration-tests/build.gradle
index 6e954e7..b611fc7 100644
--- a/compose/runtime/runtime/integration-tests/build.gradle
+++ b/compose/runtime/runtime/integration-tests/build.gradle
@@ -90,7 +90,7 @@
                 implementation(project(":compose:material:material"))
                 implementation(project(":compose:ui:ui-test-junit4"))
                 implementation(project(":compose:test-utils"))
-                implementation("androidx.activity:activity-compose:1.10.1")
+                implementation(project(":activity:activity-compose"))
                 implementation(libs.testExtJunit)
                 implementation(libs.testRules)
                 implementation(libs.testRunner)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/FunctionKeyMeta.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/FunctionKeyMeta.kt
index e85b7cc..ef13eca 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/FunctionKeyMeta.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/FunctionKeyMeta.kt
@@ -29,7 +29,7 @@
  * @param endOffset The startOffset of the function in the source file at the time of compilation.
  */
 @ComposeCompilerApi
-@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
+@Target(AnnotationTarget.CLASS)
 @Retention(AnnotationRetention.RUNTIME)
 @Repeatable
 annotation class FunctionKeyMeta(val key: Int, val startOffset: Int, val endOffset: Int)
diff --git a/compose/ui/ui/api/current.txt b/compose/ui/ui/api/current.txt
index 4f61adf..f30f836 100644
--- a/compose/ui/ui/api/current.txt
+++ b/compose/ui/ui/api/current.txt
@@ -2854,7 +2854,6 @@
     method public void clear();
     method public boolean contains(Object? element);
     method public boolean containsAll(java.util.Collection<? extends java.lang.Object?> elements);
-    method public inline void fastForEach(kotlin.jvm.functions.Function1<java.lang.Object?,kotlin.Unit> block);
     method public void forEach(kotlin.jvm.functions.Function1<java.lang.Object?,kotlin.Unit> block);
     method public int getSize();
     method public boolean isEmpty();
diff --git a/compose/ui/ui/api/restricted_current.txt b/compose/ui/ui/api/restricted_current.txt
index 733a3e0..0ed2da8 100644
--- a/compose/ui/ui/api/restricted_current.txt
+++ b/compose/ui/ui/api/restricted_current.txt
@@ -2862,7 +2862,6 @@
     method public void clear();
     method public boolean contains(Object? element);
     method public boolean containsAll(java.util.Collection<? extends java.lang.Object?> elements);
-    method public inline void fastForEach(kotlin.jvm.functions.Function1<java.lang.Object?,kotlin.Unit> block);
     method public void forEach(kotlin.jvm.functions.Function1<java.lang.Object?,kotlin.Unit> block);
     method public int getSize();
     method public boolean isEmpty();
@@ -2873,7 +2872,6 @@
     method public boolean retainAll(java.util.Collection<? extends java.lang.Object?> slotIds);
     method public boolean retainAll(kotlin.jvm.functions.Function1<java.lang.Object?,java.lang.Boolean> predicate);
     method public void trimToSize(int maxSlotsToRetainForReuse);
-    property @kotlin.PublishedApi internal androidx.collection.MutableOrderedScatterSet<java.lang.Object?> set;
     property public int size;
   }
 
diff --git a/compose/ui/ui/bcv/native/current.txt b/compose/ui/ui/bcv/native/current.txt
index cafa043..7baec99 100644
--- a/compose/ui/ui/bcv/native/current.txt
+++ b/compose/ui/ui/bcv/native/current.txt
@@ -682,8 +682,6 @@
     abstract fun getSlotsToRetain(androidx.compose.ui.layout/SubcomposeSlotReusePolicy.SlotIdsSet) // androidx.compose.ui.layout/SubcomposeSlotReusePolicy.getSlotsToRetain|getSlotsToRetain(androidx.compose.ui.layout.SubcomposeSlotReusePolicy.SlotIdsSet){}[0]
 
     final class SlotIdsSet : kotlin.collections/Collection<kotlin/Any?> { // androidx.compose.ui.layout/SubcomposeSlotReusePolicy.SlotIdsSet|null[0]
-        final val set // androidx.compose.ui.layout/SubcomposeSlotReusePolicy.SlotIdsSet.set|{}set[0]
-            final fun <get-set>(): androidx.collection/MutableOrderedScatterSet<kotlin/Any?> // androidx.compose.ui.layout/SubcomposeSlotReusePolicy.SlotIdsSet.set.<get-set>|<get-set>(){}[0]
         final val size // androidx.compose.ui.layout/SubcomposeSlotReusePolicy.SlotIdsSet.size|{}size[0]
             final fun <get-size>(): kotlin/Int // androidx.compose.ui.layout/SubcomposeSlotReusePolicy.SlotIdsSet.size.<get-size>|<get-size>(){}[0]
 
@@ -699,7 +697,6 @@
         final fun retainAll(kotlin.collections/Collection<kotlin/Any?>): kotlin/Boolean // androidx.compose.ui.layout/SubcomposeSlotReusePolicy.SlotIdsSet.retainAll|retainAll(kotlin.collections.Collection<kotlin.Any?>){}[0]
         final fun retainAll(kotlin/Function1<kotlin/Any?, kotlin/Boolean>): kotlin/Boolean // androidx.compose.ui.layout/SubcomposeSlotReusePolicy.SlotIdsSet.retainAll|retainAll(kotlin.Function1<kotlin.Any?,kotlin.Boolean>){}[0]
         final fun trimToSize(kotlin/Int) // androidx.compose.ui.layout/SubcomposeSlotReusePolicy.SlotIdsSet.trimToSize|trimToSize(kotlin.Int){}[0]
-        final inline fun fastForEach(kotlin/Function1<kotlin/Any?, kotlin/Unit>) // androidx.compose.ui.layout/SubcomposeSlotReusePolicy.SlotIdsSet.fastForEach|fastForEach(kotlin.Function1<kotlin.Any?,kotlin.Unit>){}[0]
     }
 }
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
index 4c72adb..83b0bf4 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
@@ -19,6 +19,7 @@
 package androidx.compose.ui
 
 import android.content.Context
+import android.content.Intent
 import android.graphics.Bitmap
 import android.os.Build
 import android.os.Handler
@@ -2507,6 +2508,65 @@
         validateSquareColors(outerColor = Color.Blue, innerColor = Color.White, size = 10)
     }
 
+    // Tests that show layout bounds draws outlines around content and modifiers
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    @OptIn(InternalComposeUiApi::class)
+    fun showLayoutBounds_content() {
+        activityTestRule.runOnUiThreadIR {
+            activity.setContent {
+                FixedSize(size = 30, modifier = Modifier.background(Color.White)) {
+                    FixedSize(
+                        size = 10,
+                        modifier = Modifier.padding(5).padding(5).drawLatchModifier()
+                    )
+                }
+            }
+            val composeView = activityTestRule.findAndroidComposeView() as AndroidComposeView
+            composeView.showLayoutBounds = true
+        }
+        activityTestRule.waitAndScreenShot().apply {
+            assertRect(Color.White, size = 8)
+            assertRect(Color.Red, size = 10, holeSize = 8)
+            assertRect(Color.White, size = 18, holeSize = 10)
+            assertRect(Color.Blue, size = 20, holeSize = 18)
+            assertRect(Color.White, size = 28, holeSize = 20)
+            assertRect(Color.Red, size = 30, holeSize = 28)
+        }
+    }
+
+    // Ensure that showLayoutBounds is reset in onResume() to whatever is set in the
+    // settings.
+    @Test
+    @OptIn(InternalComposeUiApi::class)
+    fun showLayoutBounds_resetOnResume() {
+        activityTestRule.runOnUiThreadIR { activity.setContent {} }
+        val composeView = activityTestRule.findAndroidComposeView() as AndroidComposeView
+        // find out whatever the current setting value is for showLayoutBounds
+        val startShowLayoutBounds = composeView.showLayoutBounds
+
+        activityTestRule.runOnUiThread {
+            val intent = Intent(activity, TestActivity::class.java)
+            activity.startActivity(intent)
+        }
+
+        assertTrue(activity.stopLatch.await(5, TimeUnit.SECONDS))
+
+        activityTestRule.runOnUiThread {
+            // set showLayoutBounds to something different
+            composeView.showLayoutBounds = !startShowLayoutBounds
+            activity.resumeLatch = CountDownLatch(1)
+            TestActivity.resumedActivity!!.finish()
+        }
+
+        assertTrue(activity.resumeLatch.await(5, TimeUnit.SECONDS))
+
+        activityTestRule.runOnUiThread {
+            // ensure showLayoutBounds was reset in onResume()
+            assertEquals(startShowLayoutBounds, composeView.showLayoutBounds)
+        }
+    }
+
     @Test
     fun requestRemeasureForAlreadyMeasuredChildWhileTheParentIsStillMeasuring() {
         val drawlatch = CountDownLatch(1)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/ShowLayoutBoundsTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/ShowLayoutBoundsTest.kt
deleted file mode 100644
index 1ef6f82..0000000
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/ShowLayoutBoundsTest.kt
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package androidx.compose.ui.layout
-
-import android.content.Intent
-import android.graphics.Bitmap
-import android.os.Build
-import androidx.annotation.RequiresApi
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.ui.FixedSize
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.assertRect
-import androidx.compose.ui.background
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.asAndroidBitmap
-import androidx.compose.ui.padding
-import androidx.compose.ui.platform.AndroidComposeView
-import androidx.compose.ui.platform.LocalView
-import androidx.compose.ui.test.TestActivity
-import androidx.compose.ui.test.captureToImage
-import androidx.compose.ui.test.junit4.createAndroidComposeRule
-import androidx.compose.ui.test.onRoot
-import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
-import androidx.test.platform.app.InstrumentationRegistry
-import com.google.common.truth.Truth.assertThat
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
-import org.junit.After
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-
-@MediumTest
-class ShowLayoutBoundsTest {
-    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
-
-    private fun setIsShowingLayoutBounds(value: Boolean) {
-        val uiAutomation = InstrumentationRegistry.getInstrumentation().uiAutomation
-        uiAutomation.executeShellCommand("setprop debug.layout $value")
-        // 1599295570 is SYSPROPS_TRANSACTION -- used to poke the system properties
-        // to notify that a change happened
-        uiAutomation.executeShellCommand("service call activity 1599295570")
-        rule.waitForIdle()
-    }
-
-    @Before
-    fun setup() {
-        setIsShowingLayoutBounds(true)
-    }
-
-    @After
-    fun tearDown() {
-        setIsShowingLayoutBounds(false)
-    }
-
-    @Test
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
-    fun showLayoutBoundsNotifiedWhenChanged() {
-        lateinit var view: AndroidComposeView
-        rule.setContent {
-            view = LocalView.current as AndroidComposeView
-            Box(Modifier.fillMaxSize())
-        }
-        val latch = CountDownLatch(1)
-        rule.runOnIdle {
-            assertThat(view.showLayoutBounds).isTrue()
-            view.viewTreeObserver.addOnPreDrawListener {
-                latch.countDown()
-                true
-            }
-        }
-        setIsShowingLayoutBounds(false)
-        assertThat(latch.await(1, TimeUnit.SECONDS)).isTrue()
-        rule.runOnIdle { assertThat(view.showLayoutBounds).isFalse() }
-    }
-
-    // Tests that show layout bounds draws outlines around content and modifiers
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-    @Test
-    fun showLayoutBounds_content() {
-        rule.setContent {
-            // Need to offset the content from the outer View
-            FixedSize(size = 40, modifier = Modifier.background(Color.White)) {
-                FixedSize(size = 30, modifier = Modifier.background(Color.White)) {
-                    FixedSize(size = 10, modifier = Modifier.padding(5).padding(5))
-                }
-            }
-        }
-        rule.waitForIdle()
-
-        takeScreenShot(40).apply {
-            assertRect(Color.White, size = 8)
-            assertRect(Color.Red, size = 10, holeSize = 8)
-            assertRect(Color.White, size = 18, holeSize = 10)
-            assertRect(Color.Blue, size = 20, holeSize = 18)
-            assertRect(Color.White, size = 28, holeSize = 20)
-            assertRect(Color.Red, size = 30, holeSize = 28)
-        }
-    }
-
-    // Ensure that showLayoutBounds is reset in onResume() to whatever is set in the
-    // settings.
-    @Test
-    fun showLayoutBounds_resetOnResume() {
-        lateinit var composeView: AndroidComposeView
-        rule.setContent { composeView = LocalView.current as AndroidComposeView }
-
-        val activity = rule.activity
-
-        rule.runOnUiThread {
-            val intent = Intent(activity, TestActivity::class.java)
-            activity.startActivity(intent)
-        }
-
-        assertThat(activity.stopLatch.await(5, TimeUnit.SECONDS))
-
-        // change showLayoutBounds to true without poking
-        setIsShowingLayoutBounds(true)
-
-        rule.runOnUiThread {
-            activity.resumeLatch = CountDownLatch(1)
-            TestActivity.resumedActivity!!.finish()
-        }
-
-        assertThat(activity.resumeLatch.await(5, TimeUnit.SECONDS)).isTrue()
-
-        rule.runOnIdle {
-            // ensure showLayoutBounds was reset in onResume()
-            assertThat(composeView.showLayoutBounds).isTrue()
-        }
-    }
-
-    // waitAndScreenShot() requires API level 26
-    @RequiresApi(Build.VERSION_CODES.O)
-    private fun takeScreenShot(width: Int, height: Int = width): Bitmap {
-        val bitmap = rule.onRoot().captureToImage().asAndroidBitmap()
-        assertThat(bitmap.width).isEqualTo(width)
-        assertThat(bitmap.height).isEqualTo(height)
-        return bitmap
-    }
-}
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogTest.kt
index 6e59287..f12ab89 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogTest.kt
@@ -76,6 +76,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.round
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.FlakyTest
 import androidx.test.filters.MediumTest
 import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
 import androidx.test.uiautomator.UiDevice
@@ -112,7 +113,6 @@
 
         // Click inside the dialog
         interaction.performClick()
-        rule.waitForIdle()
 
         // Check that the Clickable was pressed and the Dialog is still visible.
         interaction.assertIsDisplayed()
@@ -128,12 +128,12 @@
 
         // Click inside the dialog
         interaction.performClick()
-        rule.waitForIdle()
 
         // Check that the Clickable was pressed and the Dialog is still visible.
         interaction.assertIsDisplayed()
     }
 
+    @FlakyTest(bugId = 402738067)
     @Test
     fun dialogTest_isDismissed_whenSpecified() {
         setupDialogTest()
@@ -156,6 +156,7 @@
         textInteraction.assertDoesNotExist()
     }
 
+    @FlakyTest(bugId = 402738067)
     @Test
     fun dialogTest_isDismissed_whenSpecified_decorFitsFalse() {
         setupDialogTest(dialogProperties = DialogProperties(decorFitsSystemWindows = false))
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 e6026d6..a776c58 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
@@ -616,9 +616,6 @@
     @Suppress("UnnecessaryOptInAnnotation")
     @OptIn(InternalCoreApi::class)
     override var showLayoutBounds = false
-        get() {
-            return if (SDK_INT >= 30) Api30Impl.isShowingLayoutBounds(this) else field
-        }
 
     private var _androidViewsHandler: AndroidViewsHandler? = null
     internal val androidViewsHandler: AndroidViewsHandler
@@ -977,9 +974,7 @@
 
     override fun onResume(owner: LifecycleOwner) {
         // Refresh in onResume in case the value has changed.
-        if (SDK_INT < 30) {
-            showLayoutBounds = getIsShowingLayoutBounds()
-        }
+        showLayoutBounds = getIsShowingLayoutBounds()
     }
 
     override fun focusSearch(focused: View?, direction: Int): View? {
@@ -1145,7 +1140,7 @@
         keyboardModifiersRequireUpdate = true
         super.onWindowFocusChanged(hasWindowFocus)
 
-        if (hasWindowFocus && SDK_INT < 30) {
+        if (hasWindowFocus) {
             // Refresh in onResume in case the value has changed from the quick settings tile, in
             // which case the activity won't be paused/resumed (b/225937688).
             getIsShowingLayoutBounds().also { newShowLayoutBounds ->
@@ -1990,10 +1985,6 @@
 
     override fun onAttachedToWindow() {
         super.onAttachedToWindow()
-        if (SDK_INT < 30) {
-            showLayoutBounds = getIsShowingLayoutBounds()
-        }
-        addNotificationForSysPropsChange(this)
         _windowInfo.isWindowFocused = hasWindowFocus()
         _windowInfo.setOnInitializeContainerSize { calculateWindowSize(this) }
         updateWindowMetrics()
@@ -2064,7 +2055,6 @@
 
     override fun onDetachedFromWindow() {
         super.onDetachedFromWindow()
-        removeNotificationForSysPropsChange(this)
         snapshotObserver.stopObserving()
         _windowInfo.setOnInitializeContainerSize(null)
         val lifecycle =
@@ -2828,17 +2818,13 @@
     companion object {
         private var systemPropertiesClass: Class<*>? = null
         private var getBooleanMethod: Method? = null
-        private var addChangeCallbackMethod: Method? = null
-        private val composeViews = mutableObjectListOf<AndroidComposeView>()
-        private var systemPropertiesChangedRunnable: Runnable? = null
 
+        // TODO(mount): replace with ViewCompat.isShowingLayoutBounds() when it becomes available.
         @Suppress("BanUncheckedReflection")
         private fun getIsShowingLayoutBounds(): Boolean =
             try {
                 if (systemPropertiesClass == null) {
                     systemPropertiesClass = Class.forName("android.os.SystemProperties")
-                }
-                if (getBooleanMethod == null) {
                     getBooleanMethod =
                         systemPropertiesClass?.getDeclaredMethod(
                             "getBoolean",
@@ -2846,54 +2832,10 @@
                             Boolean::class.java
                         )
                 }
-                getBooleanMethod?.invoke(null, "debug.layout", false) as? Boolean == true
-            } catch (_: Exception) {
+                getBooleanMethod?.invoke(null, "debug.layout", false) as? Boolean ?: false
+            } catch (e: Exception) {
                 false
             }
-
-        @Suppress("BanUncheckedReflection")
-        private fun addNotificationForSysPropsChange(composeView: AndroidComposeView) {
-            if (SDK_INT > 28) {
-                // Removing the callback is prohibited on newer versions, so we should only add one
-                // callback and use it for all AndroidComposeViews
-                if (systemPropertiesChangedRunnable == null) {
-                    try {
-                        if (systemPropertiesClass == null) {
-                            systemPropertiesClass = Class.forName("android.os.SystemProperties")
-                        }
-                        if (addChangeCallbackMethod == null) {
-                            addChangeCallbackMethod =
-                                systemPropertiesClass?.getDeclaredMethod(
-                                    "addChangeCallback",
-                                    Runnable::class.java
-                                )
-                        }
-                        val runnable = Runnable {
-                            synchronized(composeViews) {
-                                if (SDK_INT < 30) {
-                                    composeViews.forEach {
-                                        val oldValue = it.showLayoutBounds
-                                        it.showLayoutBounds = getIsShowingLayoutBounds()
-                                        if (oldValue != it.showLayoutBounds) {
-                                            it.invalidateDescendants()
-                                        }
-                                    }
-                                } else {
-                                    composeViews.forEach { it.invalidateDescendants() }
-                                }
-                            }
-                        }
-                        addChangeCallbackMethod?.invoke(null, runnable)
-                        systemPropertiesChangedRunnable = runnable
-                    } catch (_: Exception) {}
-                }
-                synchronized(composeViews) { composeViews += composeView }
-            }
-        }
-
-        private fun removeNotificationForSysPropsChange(composeView: AndroidComposeView) {
-            synchronized(composeViews) { composeViews -= composeView }
-        }
     }
 
     /** Combines objects populated via ViewTree*Owner */
@@ -3194,9 +3136,3 @@
         }
     }
 }
-
-/** Split out to avoid class verification errors. This class will only be loaded when SDK >= 30. */
-@RequiresApi(30)
-private object Api30Impl {
-    @DoNotInline fun isShowingLayoutBounds(view: View) = view.isShowingLayoutBounds
-}
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.android.kt
index 1609b9c..a0513ac 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.android.kt
@@ -41,6 +41,7 @@
 import androidx.compose.ui.input.nestedscroll.nestedScroll
 import androidx.compose.ui.input.pointer.pointerInteropFilter
 import androidx.compose.ui.internal.checkPrecondition
+import androidx.compose.ui.internal.checkPreconditionNotNull
 import androidx.compose.ui.layout.IntrinsicMeasurable
 import androidx.compose.ui.layout.IntrinsicMeasureScope
 import androidx.compose.ui.layout.Measurable
@@ -246,18 +247,49 @@
 
     override fun onDeactivate() {
         reset()
-        if (
-            @OptIn(ExperimentalComposeUiApi::class) ComposeUiFlags.isRemoveFocusedViewFixEnabled &&
-                hasFocus() &&
-                isInTouchMode &&
-                SDK_INT > 28
-        ) {
-            // Removing a view that is focused results in focus being re-assigned to an existing
-            // view on screen. We don't want this behavior in touch mode.
+        if (@OptIn(ExperimentalComposeUiApi::class) ComposeUiFlags.isRemoveFocusedViewFixEnabled) {
+            if (!hasFocus()) {
+                removeAllViewsInLayout()
+                return
+            }
+
+            val focused = checkPreconditionNotNull(findFocus()) { "Couldn't find focused view" }
+
             // https://developer.android.com/about/versions/pie/android-9.0-changes-28#focus
-            findFocus().clearFocus()
+            if (isInTouchMode && SDK_INT > 28) {
+                focused.clearFocus()
+                removeAllViewsInLayout()
+                return
+            }
+
+            // When a focused View is removed, it will request a focus change. We'll give it a
+            // temporary View to focus on so that we don't do a recompose during applyChanges()
+            // while searching for a focusable View (e.g. in a LazyColumn)
+            val tempFocusable = View(context)
+            val rect = Rect(0, 0, focused.width, focused.height)
+            offsetDescendantRectToMyCoords(focused, rect)
+            addView(tempFocusable)
+
+            with(tempFocusable) {
+                isFocusable = true
+                isFocusableInTouchMode = true
+                nextFocusUpId = focused.nextFocusUpId
+                nextFocusDownId = focused.nextFocusDownId
+                nextFocusLeftId = focused.nextFocusLeftId
+                nextFocusRightId = focused.nextFocusRightId
+                nextFocusForwardId = focused.nextFocusForwardId
+                layout(rect.left, rect.top, rect.right, rect.bottom)
+                requestFocus()
+            }
+
+            removeViewsInLayout(0, childCount - 2)
+            post {
+                // Now we're ready to send focus to the next focusable item.
+                removeViewInLayout(tempFocusable)
+            }
+        } else {
+            removeAllViewsInLayout()
         }
-        removeAllViewsInLayout()
     }
 
     override fun onRelease() {
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 7032be4..947a8bf 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
@@ -377,8 +377,7 @@
      */
     class SlotIdsSet
     internal constructor(
-        @PublishedApi
-        internal val set: MutableOrderedScatterSet<Any?> = mutableOrderedScatterSetOf()
+        private val set: MutableOrderedScatterSet<Any?> = mutableOrderedScatterSetOf()
     ) : Collection<Any?> {
 
         override val size: Int
@@ -453,24 +452,8 @@
          * Iterates over every element stored in this set by invoking the specified [block] lambda.
          * The iteration order is the same as the insertion order. It is safe to remove the element
          * passed to [block] during iteration.
-         *
-         * NOTE: This method is obscured by `Collection<T>.forEach` since it is marked with
-         *
-         * @HidesMember, which means in practice this will never get called. Please use
-         *   [fastForEach] instead.
          */
         fun forEach(block: (Any?) -> Unit) = set.forEach(block)
-
-        /**
-         * Iterates over every element stored in this set by invoking the specified [block] lambda.
-         * The iteration order is the same as the insertion order. It is safe to remove the element
-         * passed to [block] during iteration.
-         *
-         * NOTE: this method was added in order to allow for a more performant forEach method. It is
-         * necessary because [forEach] is obscured by `Collection<T>.forEach` since it is marked
-         * with @HidesMember.
-         */
-        inline fun fastForEach(block: (Any?) -> Unit) = set.forEach(block)
     }
 }
 
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 b2904ce..1f81300 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
@@ -1390,10 +1390,8 @@
 
     override fun onReuse() {
         requirePrecondition(isAttached) { "onReuse is only expected on attached node" }
-        if (@OptIn(ExperimentalComposeUiApi::class) !ComposeUiFlags.isRemoveFocusedViewFixEnabled) {
-            interopViewFactoryHolder?.onReuse()
-            subcompositionsState?.onReuse()
-        }
+        interopViewFactoryHolder?.onReuse()
+        subcompositionsState?.onReuse()
         isCurrentlyCalculatingSemanticsConfiguration = false
         if (isDeactivated) {
             isDeactivated = false
@@ -1407,10 +1405,6 @@
         val oldSemanticsId = semanticsId
         semanticsId = generateSemanticsId()
         owner?.onPreLayoutNodeReused(this, oldSemanticsId)
-        if (@OptIn(ExperimentalComposeUiApi::class) ComposeUiFlags.isRemoveFocusedViewFixEnabled) {
-            interopViewFactoryHolder?.onReuse()
-            subcompositionsState?.onReuse()
-        }
         // resetModifierState detaches all nodes, so we need to re-attach them upon reuse.
         nodes.markAsAttached()
         nodes.runAttachLifecycle()
@@ -1423,10 +1417,8 @@
     }
 
     override fun onDeactivate() {
-        if (@OptIn(ExperimentalComposeUiApi::class) !ComposeUiFlags.isRemoveFocusedViewFixEnabled) {
-            interopViewFactoryHolder?.onDeactivate()
-            subcompositionsState?.onDeactivate()
-        }
+        interopViewFactoryHolder?.onDeactivate()
+        subcompositionsState?.onDeactivate()
         isDeactivated = true
         resetModifierState()
         // if the node is detached the semantics were already updated without this node.
@@ -1439,22 +1431,12 @@
             }
         }
         owner?.onLayoutNodeDeactivated(this)
-        if (@OptIn(ExperimentalComposeUiApi::class) ComposeUiFlags.isRemoveFocusedViewFixEnabled) {
-            interopViewFactoryHolder?.onDeactivate()
-            subcompositionsState?.onDeactivate()
-        }
     }
 
     override fun onRelease() {
-        if (@OptIn(ExperimentalComposeUiApi::class) !ComposeUiFlags.isRemoveFocusedViewFixEnabled) {
-            interopViewFactoryHolder?.onRelease()
-            subcompositionsState?.onRelease()
-        }
+        interopViewFactoryHolder?.onRelease()
+        subcompositionsState?.onRelease()
         forEachCoordinatorIncludingInner { it.onRelease() }
-        if (@OptIn(ExperimentalComposeUiApi::class) ComposeUiFlags.isRemoveFocusedViewFixEnabled) {
-            interopViewFactoryHolder?.onRelease()
-            subcompositionsState?.onRelease()
-        }
     }
 
     internal companion object {
diff --git a/constraintlayout/constraintlayout-compose/integration-tests/demos/build.gradle b/constraintlayout/constraintlayout-compose/integration-tests/demos/build.gradle
index 5f16eeb..2eae354 100644
--- a/constraintlayout/constraintlayout-compose/integration-tests/demos/build.gradle
+++ b/constraintlayout/constraintlayout-compose/integration-tests/demos/build.gradle
@@ -24,7 +24,7 @@
 dependencies {
     implementation(project(":constraintlayout:constraintlayout-compose"))
 
-    implementation("androidx.activity:activity-compose:1.10.1")
+    implementation(project(":activity:activity-compose"))
     implementation(project(":compose:foundation:foundation-layout"))
     implementation(project(":compose:runtime:runtime"))
     implementation(project(":compose:ui:ui"))
diff --git a/constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark-target/build.gradle b/constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark-target/build.gradle
index 6f1add4..06a93d7 100644
--- a/constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark-target/build.gradle
+++ b/constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark-target/build.gradle
@@ -42,7 +42,7 @@
     implementation("androidx.recyclerview:recyclerview:1.2.1")
 
     implementation(libs.kotlinStdlib)
-    implementation("androidx.activity:activity-compose:1.10.1")
+    implementation(project(":activity:activity-compose"))
     implementation("androidx.appcompat:appcompat:1.4.1")
     implementation("androidx.cardview:cardview:1.0.0")
     // old version of common-java8 conflicts with newer version, because both have
diff --git a/core/core-backported-fixes/integration-tests/testapp/build.gradle b/core/core-backported-fixes/integration-tests/testapp/build.gradle
index 297c0c3..ca5aec7 100644
--- a/core/core-backported-fixes/integration-tests/testapp/build.gradle
+++ b/core/core-backported-fixes/integration-tests/testapp/build.gradle
@@ -25,7 +25,8 @@
     api(libs.kotlinStdlib)
     implementation(project(":core:core-backported-fixes"))
 
-    implementation("androidx.activity:activity-compose:1.10.1")
+    implementation(project(":activity:activity-compose"))
+    implementation(project(":activity:activity"))
     implementation("androidx.core:core-ktx:1.15.0")
     implementation(project(":compose:material:material"))
     implementation(project(":compose:material3:material3"))
@@ -37,7 +38,8 @@
 
     androidTestImplementation("androidx.core:core:1.15.0")
     androidTestImplementation("androidx.core:core-ktx:1.15.0")
-    androidTestImplementation("androidx.activity:activity-compose:1.10.1")
+    androidTestImplementation(project(":activity:activity-compose"))
+    androidTestImplementation(project(":activity:activity-ktx"))
     androidTestImplementation(project(":compose:ui:ui-test"))
     androidTestImplementation(project(":compose:ui:ui-test-junit4"))
     androidTestImplementation(libs.testRunner)
diff --git a/core/core/build.gradle.kts b/core/core/build.gradle.kts
index 4354454..ac0d1b253 100644
--- a/core/core/build.gradle.kts
+++ b/core/core/build.gradle.kts
@@ -27,7 +27,7 @@
     api("androidx.annotation:annotation-experimental:1.4.1")
     api("androidx.lifecycle:lifecycle-runtime:2.6.2")
     api("androidx.versionedparcelable:versionedparcelable:1.1.1")
-    api("androidx.core:core-viewtree:1.0.0")
+    api("androidx.core:core-viewtree:1.0.0-beta01")
     implementation("androidx.collection:collection:1.4.2")
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
     implementation("androidx.interpolator:interpolator:1.0.0")
diff --git a/core/core/src/main/java/androidx/core/content/FileProvider.java b/core/core/src/main/java/androidx/core/content/FileProvider.java
index 6cdae68..b3b6c92 100644
--- a/core/core/src/main/java/androidx/core/content/FileProvider.java
+++ b/core/core/src/main/java/androidx/core/content/FileProvider.java
@@ -638,9 +638,6 @@
         if (!info.grantUriPermissions) {
             throw new SecurityException("Provider must grant uri permissions");
         }
-        if (info.authority == null || info.authority.trim().isEmpty()) {
-            throw new SecurityException("Provider must have a non-empty authority");
-        }
 
         final String authority = info.authority.split(";")[0];
         synchronized (mLock) {
diff --git a/core/core/src/main/java/androidx/core/view/insets/ProtectionLayout.java b/core/core/src/main/java/androidx/core/view/insets/ProtectionLayout.java
index 9162c61..240263a 100644
--- a/core/core/src/main/java/androidx/core/view/insets/ProtectionLayout.java
+++ b/core/core/src/main/java/androidx/core/view/insets/ProtectionLayout.java
@@ -144,12 +144,6 @@
     @Override
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
-        if (mGroup != null) {
-            // This is a rare case that onAttachedToWindow might be called twice without an
-            // onDetachedFromWindow call in between. Here removes the existing ProtectionGroup, or
-            // the new ProtectionGroup will throw IllegalStateException.
-            removeProtectionViews();
-        }
         addProtectionViews();
         requestApplyInsets();
     }
diff --git a/credentials/credentials/src/main/res/values-b+sr+Latn/strings.xml b/credentials/credentials/src/main/res/values-b+sr+Latn/strings.xml
index d1bd317..9cf1ec4 100644
--- a/credentials/credentials/src/main/res/values-b+sr+Latn/strings.xml
+++ b/credentials/credentials/src/main/res/values-b+sr+Latn/strings.xml
@@ -17,6 +17,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="androidx.credentials.TYPE_PUBLIC_KEY_CREDENTIAL" msgid="3929015085059320822">"Pristupni ključ"</string>
+    <string name="androidx.credentials.TYPE_PUBLIC_KEY_CREDENTIAL" msgid="3929015085059320822">"Pristupni kôd"</string>
     <string name="android.credentials.TYPE_PASSWORD_CREDENTIAL" msgid="8397015543330865059">"Lozinka"</string>
 </resources>
diff --git a/credentials/credentials/src/main/res/values-pl/strings.xml b/credentials/credentials/src/main/res/values-pl/strings.xml
index 5ee549c..7c4d4c1 100644
--- a/credentials/credentials/src/main/res/values-pl/strings.xml
+++ b/credentials/credentials/src/main/res/values-pl/strings.xml
@@ -17,6 +17,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="androidx.credentials.TYPE_PUBLIC_KEY_CREDENTIAL" msgid="3929015085059320822">"Klucz dostępu"</string>
+    <string name="androidx.credentials.TYPE_PUBLIC_KEY_CREDENTIAL" msgid="3929015085059320822">"Klucz"</string>
     <string name="android.credentials.TYPE_PASSWORD_CREDENTIAL" msgid="8397015543330865059">"Hasło"</string>
 </resources>
diff --git a/credentials/credentials/src/main/res/values-sr/strings.xml b/credentials/credentials/src/main/res/values-sr/strings.xml
index 278d406..0e0be5e 100644
--- a/credentials/credentials/src/main/res/values-sr/strings.xml
+++ b/credentials/credentials/src/main/res/values-sr/strings.xml
@@ -17,6 +17,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="androidx.credentials.TYPE_PUBLIC_KEY_CREDENTIAL" msgid="3929015085059320822">"Приступни кључ"</string>
+    <string name="androidx.credentials.TYPE_PUBLIC_KEY_CREDENTIAL" msgid="3929015085059320822">"Приступни кôд"</string>
     <string name="android.credentials.TYPE_PASSWORD_CREDENTIAL" msgid="8397015543330865059">"Лозинка"</string>
 </resources>
diff --git a/datastore/datastore-guava/build.gradle b/datastore/datastore-guava/build.gradle
index f23fdce..8635218 100644
--- a/datastore/datastore-guava/build.gradle
+++ b/datastore/datastore-guava/build.gradle
@@ -39,7 +39,7 @@
     api(libs.kotlinCoroutinesCore)
     api("androidx.annotation:annotation:1.1.0")
 
-    api("androidx.concurrent:concurrent-futures:1.2.0")
+    api(project(":concurrent:concurrent-futures"))
     api(project(":datastore:datastore"))
 
     implementation("androidx.concurrent:concurrent-futures-ktx:1.2.0")
diff --git a/development/studio/idea.properties b/development/studio/idea.properties
index 1218aa7..9461fa3 100644
--- a/development/studio/idea.properties
+++ b/development/studio/idea.properties
@@ -199,4 +199,4 @@
 #-----------------------------------------------------------------------
 # Enable compose @Preview rendering
 #-----------------------------------------------------------------------
-compose.project.uses.compose.override=true
\ No newline at end of file
+compose.project.uses.compose.override=true
diff --git a/docs-tip-of-tree/build.gradle b/docs-tip-of-tree/build.gradle
index ac66d78..2d22e03 100644
--- a/docs-tip-of-tree/build.gradle
+++ b/docs-tip-of-tree/build.gradle
@@ -270,7 +270,6 @@
     kmpDocs(project(":paging:paging-testing"))
     docs(project(":palette:palette"))
     docs(project(":palette:palette-ktx"))
-    docs(project(":pdf:pdf-compose"))
     docs(project(":pdf:pdf-document-service"))
     docs(project(":pdf:pdf-viewer"))
     docs(project(":pdf:pdf-viewer-fragment"))
@@ -284,7 +283,6 @@
     docs(project(":privacysandbox:activity:activity-provider"))
     docs(project(":privacysandbox:ads:ads-adservices"))
     docs(project(":privacysandbox:ads:ads-adservices-java"))
-    docs(project(":privacysandbox:ondevicepersonalization:ondevicepersonalization-client"))
     docs(project(":privacysandbox:sdkruntime:sdkruntime-client"))
     docs(project(":privacysandbox:sdkruntime:sdkruntime-core"))
     docs(project(":privacysandbox:sdkruntime:sdkruntime-provider"))
@@ -421,6 +419,7 @@
     docs(project(":xr:runtime:runtime-testing"))
     docs(project(":xr:scenecore:scenecore"))
     docs(project(":xr:scenecore:scenecore-testing"))
+    docs(project(":xr:xr-stubs"))
 }
 afterEvaluate {
   tasks["docs"].doFirst {
diff --git a/docs/api_guidelines/dependencies.md b/docs/api_guidelines/dependencies.md
index 9668476..74de906 100644
--- a/docs/api_guidelines/dependencies.md
+++ b/docs/api_guidelines/dependencies.md
@@ -411,7 +411,7 @@
 Note that this propagates the version requirement to all dependencies and is not
 appropriate for low-level libraries.
 
-#### Java language (host-side) {#java-host}
+#### Java language
 
 The Java language level determines the minimum version of the Java runtime
 required for lint checks and other host-side libraries like compilers.
@@ -436,11 +436,14 @@
 When doing so, library owners **must** file a bug and establish a timeline to
 un-pin and rejoin the rest of AndroidX.
 
-#### Java language (device-side) {#java-device}
+#### Desugaring and R8/D8
 
 Currently, the highest Java language level supported for Android libraries is
-Java 1.8 (`VERSION_1_8`). AndroidX **does not** currently support library API
-desugaring, so the use of Java 8 APIs requires `minSdk 26` or higher.
+Java 1.8 (`VERSION_1_8``) via D8/R8 desugaring. See Use Java 8 language features
+and APIs for more details.
+
+AndroidX **does not** currently support library API desugaring, so the use of
+Java 8 APIs requires increasing the library's `minSdk`.
 
 #### Android SDK
 
diff --git a/documentfile/OWNERS b/documentfile/OWNERS
index 7821525..0ad17a7 100644
--- a/documentfile/OWNERS
+++ b/documentfile/OWNERS
@@ -1,3 +1,3 @@
 # Bug component: 461432
 nandana@google.com
-shikhamalhotra@google.com
+corinac@google.com
diff --git a/health/connect/connect-client/api/current.txt b/health/connect/connect-client/api/current.txt
index 2674dc2e..e4a0904 100644
--- a/health/connect/connect-client/api/current.txt
+++ b/health/connect/connect-client/api/current.txt
@@ -5,10 +5,6 @@
     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<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<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>);
-    method @SuppressCompatibility @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA") @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? createMedicalDataSource(androidx.health.connect.client.request.CreateMedicalDataSourceRequest request, kotlin.coroutines.Continuation<? super androidx.health.connect.client.records.MedicalDataSource>);
-    method @SuppressCompatibility @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA") @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? deleteMedicalDataSourceWithData(String id, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    method @SuppressCompatibility @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA") @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? deleteMedicalResources(androidx.health.connect.client.request.DeleteMedicalResourcesRequest request, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    method @SuppressCompatibility @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA") @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? deleteMedicalResources(java.util.List<androidx.health.connect.client.records.MedicalResourceId> ids, 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? deleteRecords(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType, java.util.List<java.lang.String> recordIdsList, java.util.List<java.lang.String> clientRecordIdsList, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public suspend Object? getChanges(String changesToken, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ChangesResponse>);
@@ -17,20 +13,15 @@
     method public static android.content.Intent getHealthConnectManageDataIntent(android.content.Context context);
     method public static android.content.Intent getHealthConnectManageDataIntent(android.content.Context context, optional String providerPackageName);
     method public static String getHealthConnectSettingsAction();
-    method @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? getMedicalDataSources(androidx.health.connect.client.request.GetMedicalDataSourcesRequest request, kotlin.coroutines.Continuation<? super java.util.List<androidx.health.connect.client.records.MedicalDataSource>>);
-    method @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? getMedicalDataSources(java.util.List<java.lang.String> ids, kotlin.coroutines.Continuation<? super java.util.List<androidx.health.connect.client.records.MedicalDataSource>>);
     method public static androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context);
     method public static androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional String providerPackageName);
     method public androidx.health.connect.client.PermissionController getPermissionController();
     method public static int getSdkStatus(android.content.Context context);
     method public static int getSdkStatus(android.content.Context context, optional String providerPackageName);
     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 @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? readMedicalResources(androidx.health.connect.client.request.ReadMedicalResourcesRequest request, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ReadMedicalResourcesResponse>);
-    method @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? readMedicalResources(java.util.List<androidx.health.connect.client.records.MedicalResourceId> ids, kotlin.coroutines.Continuation<? super java.util.List<androidx.health.connect.client.records.MedicalResource>>);
     method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecord(kotlin.reflect.KClass<T> recordType, String recordId, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ReadRecordResponse<T>>);
     method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecords(androidx.health.connect.client.request.ReadRecordsRequest<T> request, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ReadRecordsResponse<T>>);
     method public suspend Object? updateRecords(java.util.List<? extends androidx.health.connect.client.records.Record> records, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    method @SuppressCompatibility @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA") @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? upsertMedicalResources(java.util.List<androidx.health.connect.client.request.UpsertMedicalResourceRequest> requests, kotlin.coroutines.Continuation<? super java.util.List<androidx.health.connect.client.records.MedicalResource>>);
     property public default androidx.health.connect.client.HealthConnectFeatures features;
     property public abstract androidx.health.connect.client.PermissionController permissionController;
     field public static final androidx.health.connect.client.HealthConnectClient.Companion Companion;
@@ -65,7 +56,6 @@
   public interface HealthConnectFeatures {
     method public int getFeatureStatus(int feature);
     field public static final androidx.health.connect.client.HealthConnectFeatures.Companion Companion;
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final int FEATURE_PERSONAL_HEALTH_RECORD = 6; // 0x6
     field public static final int FEATURE_PLANNED_EXERCISE = 3; // 0x3
     field public static final int FEATURE_READ_HEALTH_DATA_HISTORY = 4; // 0x4
     field public static final int FEATURE_READ_HEALTH_DATA_IN_BACKGROUND = 1; // 0x1
@@ -75,14 +65,12 @@
   }
 
   public static final class HealthConnectFeatures.Companion {
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static int FEATURE_PERSONAL_HEALTH_RECORD;
     property public static int FEATURE_PLANNED_EXERCISE;
     property public static int FEATURE_READ_HEALTH_DATA_HISTORY;
     property public static int FEATURE_READ_HEALTH_DATA_IN_BACKGROUND;
     property public static int FEATURE_SKIN_TEMPERATURE;
     property public static int FEATURE_STATUS_AVAILABLE;
     property public static int FEATURE_STATUS_UNAVAILABLE;
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final int FEATURE_PERSONAL_HEALTH_RECORD = 6; // 0x6
     field public static final int FEATURE_PLANNED_EXERCISE = 3; // 0x3
     field public static final int FEATURE_READ_HEALTH_DATA_HISTORY = 4; // 0x4
     field public static final int FEATURE_READ_HEALTH_DATA_IN_BACKGROUND = 1; // 0x1
@@ -174,13 +162,6 @@
 
 }
 
-package androidx.health.connect.client.feature {
-
-  @SuppressCompatibility @kotlin.RequiresOptIn(message="This is a part of the Personal Health Record experimental Health Connect APIs and could change in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalPersonalHealthRecordApi {
-  }
-
-}
-
 package androidx.health.connect.client.permission {
 
   public final class HealthPermission {
@@ -189,20 +170,7 @@
     field public static final androidx.health.connect.client.permission.HealthPermission.Companion Companion;
     field public static final String PERMISSION_READ_HEALTH_DATA_HISTORY = "android.permission.health.READ_HEALTH_DATA_HISTORY";
     field public static final String PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND = "android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES = "android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_CONDITIONS = "android.permission.health.READ_MEDICAL_DATA_CONDITIONS";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_LABORATORY_RESULTS = "android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_MEDICATIONS = "android.permission.health.READ_MEDICAL_DATA_MEDICATIONS";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_PERSONAL_DETAILS = "android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_PRACTITIONER_DETAILS = "android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_PREGNANCY = "android.permission.health.READ_MEDICAL_DATA_PREGNANCY";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_PROCEDURES = "android.permission.health.READ_MEDICAL_DATA_PROCEDURES";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_SOCIAL_HISTORY = "android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_VACCINES = "android.permission.health.READ_MEDICAL_DATA_VACCINES";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_VISITS = "android.permission.health.READ_MEDICAL_DATA_VISITS";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_VITAL_SIGNS = "android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS";
     field public static final String PERMISSION_WRITE_EXERCISE_ROUTE = "android.permission.health.WRITE_EXERCISE_ROUTE";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_WRITE_MEDICAL_DATA = "android.permission.health.WRITE_MEDICAL_DATA";
   }
 
   public static final class HealthPermission.Companion {
@@ -212,20 +180,7 @@
     method public String getWritePermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
     property public static String PERMISSION_READ_HEALTH_DATA_HISTORY;
     property public static String PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_CONDITIONS;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_LABORATORY_RESULTS;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_MEDICATIONS;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_PERSONAL_DETAILS;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_PRACTITIONER_DETAILS;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_PREGNANCY;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_PROCEDURES;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_SOCIAL_HISTORY;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_VACCINES;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_VISITS;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_VITAL_SIGNS;
     property public static String PERMISSION_WRITE_EXERCISE_ROUTE;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_WRITE_MEDICAL_DATA;
   }
 
 }
@@ -1057,66 +1012,6 @@
     property public static int EXERCISE_TYPE_YOGA;
   }
 
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class FhirResource {
-    ctor public FhirResource(int type, String id, String data);
-    method public String getData();
-    method public String getId();
-    method public int getType();
-    property public String data;
-    property public String id;
-    property public int type;
-    field public static final androidx.health.connect.client.records.FhirResource.Companion Companion;
-    field public static final int FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE = 2; // 0x2
-    field public static final int FHIR_RESOURCE_TYPE_CONDITION = 4; // 0x4
-    field public static final int FHIR_RESOURCE_TYPE_ENCOUNTER = 12; // 0xc
-    field public static final int FHIR_RESOURCE_TYPE_IMMUNIZATION = 1; // 0x1
-    field public static final int FHIR_RESOURCE_TYPE_LOCATION = 13; // 0xd
-    field public static final int FHIR_RESOURCE_TYPE_MEDICATION = 6; // 0x6
-    field public static final int FHIR_RESOURCE_TYPE_MEDICATION_REQUEST = 7; // 0x7
-    field public static final int FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT = 8; // 0x8
-    field public static final int FHIR_RESOURCE_TYPE_OBSERVATION = 3; // 0x3
-    field public static final int FHIR_RESOURCE_TYPE_ORGANIZATION = 14; // 0xe
-    field public static final int FHIR_RESOURCE_TYPE_PATIENT = 9; // 0x9
-    field public static final int FHIR_RESOURCE_TYPE_PRACTITIONER = 10; // 0xa
-    field public static final int FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE = 11; // 0xb
-    field public static final int FHIR_RESOURCE_TYPE_PROCEDURE = 5; // 0x5
-  }
-
-  public static final class FhirResource.Companion {
-    property public static int FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
-    property public static int FHIR_RESOURCE_TYPE_CONDITION;
-    property public static int FHIR_RESOURCE_TYPE_ENCOUNTER;
-    property public static int FHIR_RESOURCE_TYPE_IMMUNIZATION;
-    property public static int FHIR_RESOURCE_TYPE_LOCATION;
-    property public static int FHIR_RESOURCE_TYPE_MEDICATION;
-    property public static int FHIR_RESOURCE_TYPE_MEDICATION_REQUEST;
-    property public static int FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT;
-    property public static int FHIR_RESOURCE_TYPE_OBSERVATION;
-    property public static int FHIR_RESOURCE_TYPE_ORGANIZATION;
-    property public static int FHIR_RESOURCE_TYPE_PATIENT;
-    property public static int FHIR_RESOURCE_TYPE_PRACTITIONER;
-    property public static int FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE;
-    property public static int FHIR_RESOURCE_TYPE_PROCEDURE;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class FhirVersion implements java.lang.Comparable<androidx.health.connect.client.records.FhirVersion> {
-    ctor public FhirVersion(int major, int minor, int patch);
-    method public int compareTo(androidx.health.connect.client.records.FhirVersion other);
-    method public int getMajor();
-    method public int getMinor();
-    method public int getPatch();
-    method public boolean isSupportedFhirVersion();
-    method public static androidx.health.connect.client.records.FhirVersion parseFhirVersion(String fhirVersionString);
-    property public int major;
-    property public int minor;
-    property public int patch;
-    field public static final androidx.health.connect.client.records.FhirVersion.Companion Companion;
-  }
-
-  public static final class FhirVersion.Companion {
-    method public androidx.health.connect.client.records.FhirVersion parseFhirVersion(String fhirVersionString);
-  }
-
   public final class FloorsClimbedRecord implements androidx.health.connect.client.records.Record {
     ctor public FloorsClimbedRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, double floors, androidx.health.connect.client.records.metadata.Metadata metadata);
     method public java.time.Instant getEndTime();
@@ -1267,80 +1162,6 @@
     field public static final int MEAL_TYPE_UNKNOWN = 0; // 0x0
   }
 
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class MedicalDataSource {
-    ctor public MedicalDataSource(String id, String packageName, android.net.Uri fhirBaseUri, String displayName, androidx.health.connect.client.records.FhirVersion fhirVersion, java.time.Instant? lastDataUpdateTime);
-    method public String getDisplayName();
-    method public android.net.Uri getFhirBaseUri();
-    method public androidx.health.connect.client.records.FhirVersion getFhirVersion();
-    method public String getId();
-    method public java.time.Instant? getLastDataUpdateTime();
-    method public String getPackageName();
-    property public String displayName;
-    property public android.net.Uri fhirBaseUri;
-    property public androidx.health.connect.client.records.FhirVersion fhirVersion;
-    property public String id;
-    property public java.time.Instant? lastDataUpdateTime;
-    property public String packageName;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class MedicalResource {
-    ctor public MedicalResource(int type, androidx.health.connect.client.records.MedicalResourceId id, String dataSourceId, androidx.health.connect.client.records.FhirVersion fhirVersion, androidx.health.connect.client.records.FhirResource fhirResource);
-    method public String getDataSourceId();
-    method public androidx.health.connect.client.records.FhirResource getFhirResource();
-    method public androidx.health.connect.client.records.FhirVersion getFhirVersion();
-    method public androidx.health.connect.client.records.MedicalResourceId getId();
-    method public int getType();
-    property public String dataSourceId;
-    property public androidx.health.connect.client.records.FhirResource fhirResource;
-    property public androidx.health.connect.client.records.FhirVersion fhirVersion;
-    property public androidx.health.connect.client.records.MedicalResourceId id;
-    property public int type;
-    field public static final androidx.health.connect.client.records.MedicalResource.Companion Companion;
-    field public static final int MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES = 2; // 0x2
-    field public static final int MEDICAL_RESOURCE_TYPE_CONDITIONS = 7; // 0x7
-    field public static final int MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS = 6; // 0x6
-    field public static final int MEDICAL_RESOURCE_TYPE_MEDICATIONS = 9; // 0x9
-    field public static final int MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS = 10; // 0xa
-    field public static final int MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS = 11; // 0xb
-    field public static final int MEDICAL_RESOURCE_TYPE_PREGNANCY = 3; // 0x3
-    field public static final int MEDICAL_RESOURCE_TYPE_PROCEDURES = 8; // 0x8
-    field public static final int MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY = 4; // 0x4
-    field public static final int MEDICAL_RESOURCE_TYPE_VACCINES = 1; // 0x1
-    field public static final int MEDICAL_RESOURCE_TYPE_VISITS = 12; // 0xc
-    field public static final int MEDICAL_RESOURCE_TYPE_VITAL_SIGNS = 5; // 0x5
-  }
-
-  public static final class MedicalResource.Companion {
-    property public static int MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
-    property public static int MEDICAL_RESOURCE_TYPE_CONDITIONS;
-    property public static int MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS;
-    property public static int MEDICAL_RESOURCE_TYPE_MEDICATIONS;
-    property public static int MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS;
-    property public static int MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS;
-    property public static int MEDICAL_RESOURCE_TYPE_PREGNANCY;
-    property public static int MEDICAL_RESOURCE_TYPE_PROCEDURES;
-    property public static int MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY;
-    property public static int MEDICAL_RESOURCE_TYPE_VACCINES;
-    property public static int MEDICAL_RESOURCE_TYPE_VISITS;
-    property public static int MEDICAL_RESOURCE_TYPE_VITAL_SIGNS;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class MedicalResourceId {
-    ctor public MedicalResourceId(String dataSourceId, int fhirResourceType, String fhirResourceId);
-    method public static androidx.health.connect.client.records.MedicalResourceId fromFhirReference(String dataSourceId, String fhirReference);
-    method public String getDataSourceId();
-    method public String getFhirResourceId();
-    method public int getFhirResourceType();
-    property public String dataSourceId;
-    property public String fhirResourceId;
-    property public int fhirResourceType;
-    field public static final androidx.health.connect.client.records.MedicalResourceId.Companion Companion;
-  }
-
-  public static final class MedicalResourceId.Companion {
-    method public androidx.health.connect.client.records.MedicalResourceId fromFhirReference(String dataSourceId, String fhirReference);
-  }
-
   public final class MenstruationFlowRecord implements androidx.health.connect.client.records.Record {
     ctor public MenstruationFlowRecord(java.time.Instant time, java.time.ZoneOffset? zoneOffset, androidx.health.connect.client.records.metadata.Metadata metadata, optional int flow);
     method public int getFlow();
@@ -2194,56 +2015,6 @@
     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);
   }
 
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class CreateMedicalDataSourceRequest {
-    ctor public CreateMedicalDataSourceRequest(android.net.Uri fhirBaseUri, String displayName, androidx.health.connect.client.records.FhirVersion fhirVersion);
-    method public String getDisplayName();
-    method public android.net.Uri getFhirBaseUri();
-    method public androidx.health.connect.client.records.FhirVersion getFhirVersion();
-    property public String displayName;
-    property public android.net.Uri fhirBaseUri;
-    property public androidx.health.connect.client.records.FhirVersion fhirVersion;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class DeleteMedicalResourcesRequest {
-    ctor public DeleteMedicalResourcesRequest();
-    ctor public DeleteMedicalResourcesRequest(optional java.util.Set<java.lang.String> dataSourceIds, optional java.util.Set<java.lang.Integer> medicalResourceTypes);
-    method public java.util.Set<java.lang.String> getDataSourceIds();
-    method public java.util.Set<java.lang.Integer> getMedicalResourceTypes();
-    property public java.util.Set<java.lang.String> dataSourceIds;
-    property public java.util.Set<java.lang.Integer> medicalResourceTypes;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class GetMedicalDataSourcesRequest {
-    ctor public GetMedicalDataSourcesRequest(java.util.List<java.lang.String> packageNames);
-    method public java.util.List<java.lang.String> getPackageNames();
-    property public java.util.List<java.lang.String> packageNames;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class ReadMedicalResourcesInitialRequest extends androidx.health.connect.client.request.ReadMedicalResourcesRequest {
-    ctor public ReadMedicalResourcesInitialRequest(int medicalResourceType, java.util.Set<java.lang.String> medicalDataSourceIds, optional int pageSize);
-    method public java.util.Set<java.lang.String> getMedicalDataSourceIds();
-    method public int getMedicalResourceType();
-    property public java.util.Set<java.lang.String> medicalDataSourceIds;
-    property public int medicalResourceType;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class ReadMedicalResourcesPageRequest extends androidx.health.connect.client.request.ReadMedicalResourcesRequest {
-    ctor public ReadMedicalResourcesPageRequest(String pageToken, optional int pageSize);
-    method public String getPageToken();
-    property public String pageToken;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public abstract class ReadMedicalResourcesRequest {
-    method public final int getPageSize();
-    property public final int pageSize;
-    field public static final androidx.health.connect.client.request.ReadMedicalResourcesRequest.Companion Companion;
-    field public static final int DEFAULT_PAGE_SIZE = 1000; // 0x3e8
-  }
-
-  public static final class ReadMedicalResourcesRequest.Companion {
-    property public static int DEFAULT_PAGE_SIZE;
-  }
-
   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);
   }
@@ -2252,16 +2023,6 @@
     method public static inline <reified T extends androidx.health.connect.client.records.Record> androidx.health.connect.client.request.ReadRecordsRequest<T> ReadRecordsRequest(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);
   }
 
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class UpsertMedicalResourceRequest {
-    ctor public UpsertMedicalResourceRequest(String dataSourceId, androidx.health.connect.client.records.FhirVersion fhirVersion, String data);
-    method public String getData();
-    method public String getDataSourceId();
-    method public androidx.health.connect.client.records.FhirVersion getFhirVersion();
-    property public String data;
-    property public String dataSourceId;
-    property public androidx.health.connect.client.records.FhirVersion fhirVersion;
-  }
-
 }
 
 package androidx.health.connect.client.response {
@@ -2282,16 +2043,6 @@
     property public java.util.List<java.lang.String> recordIdsList;
   }
 
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class ReadMedicalResourcesResponse {
-    ctor public ReadMedicalResourcesResponse(java.util.List<androidx.health.connect.client.records.MedicalResource> medicalResources, String? nextPageToken, int remainingCount);
-    method public java.util.List<androidx.health.connect.client.records.MedicalResource> getMedicalResources();
-    method public String? getNextPageToken();
-    method public int getRemainingCount();
-    property public java.util.List<androidx.health.connect.client.records.MedicalResource> medicalResources;
-    property public String? nextPageToken;
-    property public int remainingCount;
-  }
-
   public final class ReadRecordResponse<T extends androidx.health.connect.client.records.Record> {
     method public T getRecord();
     property public T record;
diff --git a/health/connect/connect-client/api/restricted_current.txt b/health/connect/connect-client/api/restricted_current.txt
index d160319..ebef835 100644
--- a/health/connect/connect-client/api/restricted_current.txt
+++ b/health/connect/connect-client/api/restricted_current.txt
@@ -5,10 +5,6 @@
     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<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<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>);
-    method @SuppressCompatibility @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA") @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? createMedicalDataSource(androidx.health.connect.client.request.CreateMedicalDataSourceRequest request, kotlin.coroutines.Continuation<? super androidx.health.connect.client.records.MedicalDataSource>);
-    method @SuppressCompatibility @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA") @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? deleteMedicalDataSourceWithData(String id, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    method @SuppressCompatibility @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA") @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? deleteMedicalResources(androidx.health.connect.client.request.DeleteMedicalResourcesRequest request, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    method @SuppressCompatibility @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA") @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? deleteMedicalResources(java.util.List<androidx.health.connect.client.records.MedicalResourceId> ids, 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? deleteRecords(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType, java.util.List<java.lang.String> recordIdsList, java.util.List<java.lang.String> clientRecordIdsList, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public suspend Object? getChanges(String changesToken, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ChangesResponse>);
@@ -17,20 +13,15 @@
     method public static android.content.Intent getHealthConnectManageDataIntent(android.content.Context context);
     method public static android.content.Intent getHealthConnectManageDataIntent(android.content.Context context, optional String providerPackageName);
     method public static String getHealthConnectSettingsAction();
-    method @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? getMedicalDataSources(androidx.health.connect.client.request.GetMedicalDataSourcesRequest request, kotlin.coroutines.Continuation<? super java.util.List<androidx.health.connect.client.records.MedicalDataSource>>);
-    method @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? getMedicalDataSources(java.util.List<java.lang.String> ids, kotlin.coroutines.Continuation<? super java.util.List<androidx.health.connect.client.records.MedicalDataSource>>);
     method public static androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context);
     method public static androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional String providerPackageName);
     method public androidx.health.connect.client.PermissionController getPermissionController();
     method public static int getSdkStatus(android.content.Context context);
     method public static int getSdkStatus(android.content.Context context, optional String providerPackageName);
     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 @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? readMedicalResources(androidx.health.connect.client.request.ReadMedicalResourcesRequest request, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ReadMedicalResourcesResponse>);
-    method @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? readMedicalResources(java.util.List<androidx.health.connect.client.records.MedicalResourceId> ids, kotlin.coroutines.Continuation<? super java.util.List<androidx.health.connect.client.records.MedicalResource>>);
     method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecord(kotlin.reflect.KClass<T> recordType, String recordId, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ReadRecordResponse<T>>);
     method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecords(androidx.health.connect.client.request.ReadRecordsRequest<T> request, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ReadRecordsResponse<T>>);
     method public suspend Object? updateRecords(java.util.List<? extends androidx.health.connect.client.records.Record> records, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    method @SuppressCompatibility @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA") @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public default suspend Object? upsertMedicalResources(java.util.List<androidx.health.connect.client.request.UpsertMedicalResourceRequest> requests, kotlin.coroutines.Continuation<? super java.util.List<androidx.health.connect.client.records.MedicalResource>>);
     property public default androidx.health.connect.client.HealthConnectFeatures features;
     property public abstract androidx.health.connect.client.PermissionController permissionController;
     field public static final androidx.health.connect.client.HealthConnectClient.Companion Companion;
@@ -65,7 +56,6 @@
   public interface HealthConnectFeatures {
     method public int getFeatureStatus(int feature);
     field public static final androidx.health.connect.client.HealthConnectFeatures.Companion Companion;
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final int FEATURE_PERSONAL_HEALTH_RECORD = 6; // 0x6
     field public static final int FEATURE_PLANNED_EXERCISE = 3; // 0x3
     field public static final int FEATURE_READ_HEALTH_DATA_HISTORY = 4; // 0x4
     field public static final int FEATURE_READ_HEALTH_DATA_IN_BACKGROUND = 1; // 0x1
@@ -75,14 +65,12 @@
   }
 
   public static final class HealthConnectFeatures.Companion {
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static int FEATURE_PERSONAL_HEALTH_RECORD;
     property public static int FEATURE_PLANNED_EXERCISE;
     property public static int FEATURE_READ_HEALTH_DATA_HISTORY;
     property public static int FEATURE_READ_HEALTH_DATA_IN_BACKGROUND;
     property public static int FEATURE_SKIN_TEMPERATURE;
     property public static int FEATURE_STATUS_AVAILABLE;
     property public static int FEATURE_STATUS_UNAVAILABLE;
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final int FEATURE_PERSONAL_HEALTH_RECORD = 6; // 0x6
     field public static final int FEATURE_PLANNED_EXERCISE = 3; // 0x3
     field public static final int FEATURE_READ_HEALTH_DATA_HISTORY = 4; // 0x4
     field public static final int FEATURE_READ_HEALTH_DATA_IN_BACKGROUND = 1; // 0x1
@@ -174,13 +162,6 @@
 
 }
 
-package androidx.health.connect.client.feature {
-
-  @SuppressCompatibility @kotlin.RequiresOptIn(message="This is a part of the Personal Health Record experimental Health Connect APIs and could change in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalPersonalHealthRecordApi {
-  }
-
-}
-
 package androidx.health.connect.client.permission {
 
   public final class HealthPermission {
@@ -189,20 +170,7 @@
     field public static final androidx.health.connect.client.permission.HealthPermission.Companion Companion;
     field public static final String PERMISSION_READ_HEALTH_DATA_HISTORY = "android.permission.health.READ_HEALTH_DATA_HISTORY";
     field public static final String PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND = "android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES = "android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_CONDITIONS = "android.permission.health.READ_MEDICAL_DATA_CONDITIONS";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_LABORATORY_RESULTS = "android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_MEDICATIONS = "android.permission.health.READ_MEDICAL_DATA_MEDICATIONS";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_PERSONAL_DETAILS = "android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_PRACTITIONER_DETAILS = "android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_PREGNANCY = "android.permission.health.READ_MEDICAL_DATA_PREGNANCY";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_PROCEDURES = "android.permission.health.READ_MEDICAL_DATA_PROCEDURES";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_SOCIAL_HISTORY = "android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_VACCINES = "android.permission.health.READ_MEDICAL_DATA_VACCINES";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_VISITS = "android.permission.health.READ_MEDICAL_DATA_VISITS";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_READ_MEDICAL_DATA_VITAL_SIGNS = "android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS";
     field public static final String PERMISSION_WRITE_EXERCISE_ROUTE = "android.permission.health.WRITE_EXERCISE_ROUTE";
-    field @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static final String PERMISSION_WRITE_MEDICAL_DATA = "android.permission.health.WRITE_MEDICAL_DATA";
   }
 
   public static final class HealthPermission.Companion {
@@ -212,20 +180,7 @@
     method public String getWritePermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
     property public static String PERMISSION_READ_HEALTH_DATA_HISTORY;
     property public static String PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_CONDITIONS;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_LABORATORY_RESULTS;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_MEDICATIONS;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_PERSONAL_DETAILS;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_PRACTITIONER_DETAILS;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_PREGNANCY;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_PROCEDURES;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_SOCIAL_HISTORY;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_VACCINES;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_VISITS;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_READ_MEDICAL_DATA_VITAL_SIGNS;
     property public static String PERMISSION_WRITE_EXERCISE_ROUTE;
-    property @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public static String PERMISSION_WRITE_MEDICAL_DATA;
   }
 
 }
@@ -1057,66 +1012,6 @@
     property public static int EXERCISE_TYPE_YOGA;
   }
 
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class FhirResource {
-    ctor public FhirResource(int type, String id, String data);
-    method public String getData();
-    method public String getId();
-    method public int getType();
-    property public String data;
-    property public String id;
-    property public int type;
-    field public static final androidx.health.connect.client.records.FhirResource.Companion Companion;
-    field public static final int FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE = 2; // 0x2
-    field public static final int FHIR_RESOURCE_TYPE_CONDITION = 4; // 0x4
-    field public static final int FHIR_RESOURCE_TYPE_ENCOUNTER = 12; // 0xc
-    field public static final int FHIR_RESOURCE_TYPE_IMMUNIZATION = 1; // 0x1
-    field public static final int FHIR_RESOURCE_TYPE_LOCATION = 13; // 0xd
-    field public static final int FHIR_RESOURCE_TYPE_MEDICATION = 6; // 0x6
-    field public static final int FHIR_RESOURCE_TYPE_MEDICATION_REQUEST = 7; // 0x7
-    field public static final int FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT = 8; // 0x8
-    field public static final int FHIR_RESOURCE_TYPE_OBSERVATION = 3; // 0x3
-    field public static final int FHIR_RESOURCE_TYPE_ORGANIZATION = 14; // 0xe
-    field public static final int FHIR_RESOURCE_TYPE_PATIENT = 9; // 0x9
-    field public static final int FHIR_RESOURCE_TYPE_PRACTITIONER = 10; // 0xa
-    field public static final int FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE = 11; // 0xb
-    field public static final int FHIR_RESOURCE_TYPE_PROCEDURE = 5; // 0x5
-  }
-
-  public static final class FhirResource.Companion {
-    property public static int FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
-    property public static int FHIR_RESOURCE_TYPE_CONDITION;
-    property public static int FHIR_RESOURCE_TYPE_ENCOUNTER;
-    property public static int FHIR_RESOURCE_TYPE_IMMUNIZATION;
-    property public static int FHIR_RESOURCE_TYPE_LOCATION;
-    property public static int FHIR_RESOURCE_TYPE_MEDICATION;
-    property public static int FHIR_RESOURCE_TYPE_MEDICATION_REQUEST;
-    property public static int FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT;
-    property public static int FHIR_RESOURCE_TYPE_OBSERVATION;
-    property public static int FHIR_RESOURCE_TYPE_ORGANIZATION;
-    property public static int FHIR_RESOURCE_TYPE_PATIENT;
-    property public static int FHIR_RESOURCE_TYPE_PRACTITIONER;
-    property public static int FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE;
-    property public static int FHIR_RESOURCE_TYPE_PROCEDURE;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class FhirVersion implements java.lang.Comparable<androidx.health.connect.client.records.FhirVersion> {
-    ctor public FhirVersion(int major, int minor, int patch);
-    method public int compareTo(androidx.health.connect.client.records.FhirVersion other);
-    method public int getMajor();
-    method public int getMinor();
-    method public int getPatch();
-    method public boolean isSupportedFhirVersion();
-    method public static androidx.health.connect.client.records.FhirVersion parseFhirVersion(String fhirVersionString);
-    property public int major;
-    property public int minor;
-    property public int patch;
-    field public static final androidx.health.connect.client.records.FhirVersion.Companion Companion;
-  }
-
-  public static final class FhirVersion.Companion {
-    method public androidx.health.connect.client.records.FhirVersion parseFhirVersion(String fhirVersionString);
-  }
-
   public final class FloorsClimbedRecord implements androidx.health.connect.client.records.IntervalRecord {
     ctor public FloorsClimbedRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, double floors, androidx.health.connect.client.records.metadata.Metadata metadata);
     method public java.time.Instant getEndTime();
@@ -1285,80 +1180,6 @@
     field public static final int MEAL_TYPE_UNKNOWN = 0; // 0x0
   }
 
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class MedicalDataSource {
-    ctor public MedicalDataSource(String id, String packageName, android.net.Uri fhirBaseUri, String displayName, androidx.health.connect.client.records.FhirVersion fhirVersion, java.time.Instant? lastDataUpdateTime);
-    method public String getDisplayName();
-    method public android.net.Uri getFhirBaseUri();
-    method public androidx.health.connect.client.records.FhirVersion getFhirVersion();
-    method public String getId();
-    method public java.time.Instant? getLastDataUpdateTime();
-    method public String getPackageName();
-    property public String displayName;
-    property public android.net.Uri fhirBaseUri;
-    property public androidx.health.connect.client.records.FhirVersion fhirVersion;
-    property public String id;
-    property public java.time.Instant? lastDataUpdateTime;
-    property public String packageName;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class MedicalResource {
-    ctor public MedicalResource(int type, androidx.health.connect.client.records.MedicalResourceId id, String dataSourceId, androidx.health.connect.client.records.FhirVersion fhirVersion, androidx.health.connect.client.records.FhirResource fhirResource);
-    method public String getDataSourceId();
-    method public androidx.health.connect.client.records.FhirResource getFhirResource();
-    method public androidx.health.connect.client.records.FhirVersion getFhirVersion();
-    method public androidx.health.connect.client.records.MedicalResourceId getId();
-    method public int getType();
-    property public String dataSourceId;
-    property public androidx.health.connect.client.records.FhirResource fhirResource;
-    property public androidx.health.connect.client.records.FhirVersion fhirVersion;
-    property public androidx.health.connect.client.records.MedicalResourceId id;
-    property public int type;
-    field public static final androidx.health.connect.client.records.MedicalResource.Companion Companion;
-    field public static final int MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES = 2; // 0x2
-    field public static final int MEDICAL_RESOURCE_TYPE_CONDITIONS = 7; // 0x7
-    field public static final int MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS = 6; // 0x6
-    field public static final int MEDICAL_RESOURCE_TYPE_MEDICATIONS = 9; // 0x9
-    field public static final int MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS = 10; // 0xa
-    field public static final int MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS = 11; // 0xb
-    field public static final int MEDICAL_RESOURCE_TYPE_PREGNANCY = 3; // 0x3
-    field public static final int MEDICAL_RESOURCE_TYPE_PROCEDURES = 8; // 0x8
-    field public static final int MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY = 4; // 0x4
-    field public static final int MEDICAL_RESOURCE_TYPE_VACCINES = 1; // 0x1
-    field public static final int MEDICAL_RESOURCE_TYPE_VISITS = 12; // 0xc
-    field public static final int MEDICAL_RESOURCE_TYPE_VITAL_SIGNS = 5; // 0x5
-  }
-
-  public static final class MedicalResource.Companion {
-    property public static int MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
-    property public static int MEDICAL_RESOURCE_TYPE_CONDITIONS;
-    property public static int MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS;
-    property public static int MEDICAL_RESOURCE_TYPE_MEDICATIONS;
-    property public static int MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS;
-    property public static int MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS;
-    property public static int MEDICAL_RESOURCE_TYPE_PREGNANCY;
-    property public static int MEDICAL_RESOURCE_TYPE_PROCEDURES;
-    property public static int MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY;
-    property public static int MEDICAL_RESOURCE_TYPE_VACCINES;
-    property public static int MEDICAL_RESOURCE_TYPE_VISITS;
-    property public static int MEDICAL_RESOURCE_TYPE_VITAL_SIGNS;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class MedicalResourceId {
-    ctor public MedicalResourceId(String dataSourceId, int fhirResourceType, String fhirResourceId);
-    method public static androidx.health.connect.client.records.MedicalResourceId fromFhirReference(String dataSourceId, String fhirReference);
-    method public String getDataSourceId();
-    method public String getFhirResourceId();
-    method public int getFhirResourceType();
-    property public String dataSourceId;
-    property public String fhirResourceId;
-    property public int fhirResourceType;
-    field public static final androidx.health.connect.client.records.MedicalResourceId.Companion Companion;
-  }
-
-  public static final class MedicalResourceId.Companion {
-    method public androidx.health.connect.client.records.MedicalResourceId fromFhirReference(String dataSourceId, String fhirReference);
-  }
-
   public final class MenstruationFlowRecord implements androidx.health.connect.client.records.InstantaneousRecord {
     ctor public MenstruationFlowRecord(java.time.Instant time, java.time.ZoneOffset? zoneOffset, androidx.health.connect.client.records.metadata.Metadata metadata, optional int flow);
     method public int getFlow();
@@ -2217,56 +2038,6 @@
     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);
   }
 
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class CreateMedicalDataSourceRequest {
-    ctor public CreateMedicalDataSourceRequest(android.net.Uri fhirBaseUri, String displayName, androidx.health.connect.client.records.FhirVersion fhirVersion);
-    method public String getDisplayName();
-    method public android.net.Uri getFhirBaseUri();
-    method public androidx.health.connect.client.records.FhirVersion getFhirVersion();
-    property public String displayName;
-    property public android.net.Uri fhirBaseUri;
-    property public androidx.health.connect.client.records.FhirVersion fhirVersion;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class DeleteMedicalResourcesRequest {
-    ctor public DeleteMedicalResourcesRequest();
-    ctor public DeleteMedicalResourcesRequest(optional java.util.Set<java.lang.String> dataSourceIds, optional java.util.Set<java.lang.Integer> medicalResourceTypes);
-    method public java.util.Set<java.lang.String> getDataSourceIds();
-    method public java.util.Set<java.lang.Integer> getMedicalResourceTypes();
-    property public java.util.Set<java.lang.String> dataSourceIds;
-    property public java.util.Set<java.lang.Integer> medicalResourceTypes;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class GetMedicalDataSourcesRequest {
-    ctor public GetMedicalDataSourcesRequest(java.util.List<java.lang.String> packageNames);
-    method public java.util.List<java.lang.String> getPackageNames();
-    property public java.util.List<java.lang.String> packageNames;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class ReadMedicalResourcesInitialRequest extends androidx.health.connect.client.request.ReadMedicalResourcesRequest {
-    ctor public ReadMedicalResourcesInitialRequest(int medicalResourceType, java.util.Set<java.lang.String> medicalDataSourceIds, optional int pageSize);
-    method public java.util.Set<java.lang.String> getMedicalDataSourceIds();
-    method public int getMedicalResourceType();
-    property public java.util.Set<java.lang.String> medicalDataSourceIds;
-    property public int medicalResourceType;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class ReadMedicalResourcesPageRequest extends androidx.health.connect.client.request.ReadMedicalResourcesRequest {
-    ctor public ReadMedicalResourcesPageRequest(String pageToken, optional int pageSize);
-    method public String getPageToken();
-    property public String pageToken;
-  }
-
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public abstract class ReadMedicalResourcesRequest {
-    method public final int getPageSize();
-    property public final int pageSize;
-    field public static final androidx.health.connect.client.request.ReadMedicalResourcesRequest.Companion Companion;
-    field public static final int DEFAULT_PAGE_SIZE = 1000; // 0x3e8
-  }
-
-  public static final class ReadMedicalResourcesRequest.Companion {
-    property public static int DEFAULT_PAGE_SIZE;
-  }
-
   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);
   }
@@ -2275,16 +2046,6 @@
     method public static inline <reified T extends androidx.health.connect.client.records.Record> androidx.health.connect.client.request.ReadRecordsRequest<T> ReadRecordsRequest(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);
   }
 
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class UpsertMedicalResourceRequest {
-    ctor public UpsertMedicalResourceRequest(String dataSourceId, androidx.health.connect.client.records.FhirVersion fhirVersion, String data);
-    method public String getData();
-    method public String getDataSourceId();
-    method public androidx.health.connect.client.records.FhirVersion getFhirVersion();
-    property public String data;
-    property public String dataSourceId;
-    property public androidx.health.connect.client.records.FhirVersion fhirVersion;
-  }
-
 }
 
 package androidx.health.connect.client.response {
@@ -2305,16 +2066,6 @@
     property public java.util.List<java.lang.String> recordIdsList;
   }
 
-  @SuppressCompatibility @androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi public final class ReadMedicalResourcesResponse {
-    ctor public ReadMedicalResourcesResponse(java.util.List<androidx.health.connect.client.records.MedicalResource> medicalResources, String? nextPageToken, int remainingCount);
-    method public java.util.List<androidx.health.connect.client.records.MedicalResource> getMedicalResources();
-    method public String? getNextPageToken();
-    method public int getRemainingCount();
-    property public java.util.List<androidx.health.connect.client.records.MedicalResource> medicalResources;
-    property public String? nextPageToken;
-    property public int remainingCount;
-  }
-
   public final class ReadRecordResponse<T extends androidx.health.connect.client.records.Record> {
     method public T getRecord();
     property public T record;
diff --git a/health/connect/connect-client/build.gradle b/health/connect/connect-client/build.gradle
index 0259ff6..2fd2aa9 100644
--- a/health/connect/connect-client/build.gradle
+++ b/health/connect/connect-client/build.gradle
@@ -49,6 +49,7 @@
     testImplementation(libs.junit)
     testImplementation(libs.truth)
     testImplementation(libs.kotlinCoroutinesTest)
+    androidTestImplementation(libs.testRules)
     testImplementation(libs.mockitoCore4)
     testImplementation(libs.robolectric)
     testImplementation(libs.testExtJunit)
@@ -56,16 +57,14 @@
     testImplementation(libs.espressoCore)
     testImplementation(libs.espressoIntents)
     testImplementation(libs.kotlinReflect)
-    testImplementation(libs.guavaTestlib)
 
-    androidTestImplementation(libs.testRules)
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.kotlinCoroutinesTest)
     androidTestImplementation(libs.kotlinReflect)
     androidTestImplementation(libs.kotlinTest)
     androidTestImplementation(libs.junit)
     androidTestImplementation(libs.truth)
-    androidTestImplementation(libs.guavaTestlib)
+    testImplementation(libs.guavaTestlib)
 }
 
 android {
@@ -80,7 +79,7 @@
     }
     testOptions.unitTests.includeAndroidResources = true
     namespace = "androidx.health.connect.client"
-    compileSdk = 36
+    compileSdk = 35
 }
 
 androidx {
diff --git a/health/connect/connect-client/samples/build.gradle b/health/connect/connect-client/samples/build.gradle
index a2ce898..50f0df9 100644
--- a/health/connect/connect-client/samples/build.gradle
+++ b/health/connect/connect-client/samples/build.gradle
@@ -50,5 +50,5 @@
     defaultConfig {
         minSdk = 26
     }
-    compileSdk = 36
+    compileSdk = 35
 }
diff --git a/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/MedicalDataSourceSamples.kt b/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/MedicalDataSourceSamples.kt
deleted file mode 100644
index b742ece..0000000
--- a/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/MedicalDataSourceSamples.kt
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 android.net.Uri
-import androidx.annotation.Sampled
-import androidx.health.connect.client.HealthConnectClient
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_PERSONAL_HEALTH_RECORD
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_STATUS_AVAILABLE
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.records.FhirVersion
-import androidx.health.connect.client.records.MedicalDataSource
-import androidx.health.connect.client.request.CreateMedicalDataSourceRequest
-import androidx.health.connect.client.request.GetMedicalDataSourcesRequest
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-@Sampled
-suspend fun CreateMedicalDataSourceSample(healthConnectClient: HealthConnectClient) {
-    // Ensure `FEATURE_PERSONAL_HEALTH_RECORD` is available before calling PHR apis
-    if (
-        healthConnectClient.features.getFeatureStatus(FEATURE_PERSONAL_HEALTH_RECORD) !=
-            FEATURE_STATUS_AVAILABLE
-    ) {
-        return
-    }
-
-    // Create a `MedicalDataSource`
-    // Note that `displayName` must be unique across `MedicalDataSource`s
-    val medicalDataSource: MedicalDataSource =
-        healthConnectClient.createMedicalDataSource(
-            CreateMedicalDataSourceRequest(
-                fhirBaseUri = Uri.parse("https://fhir.com/oauth/api/FHIR/R4/"),
-                displayName = "Test Data Source",
-                fhirVersion = FhirVersion(4, 0, 1)
-            )
-        )
-}
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-@Sampled
-suspend fun DeleteMedicalDataSourceWithDataSample(healthConnectClient: HealthConnectClient) {
-    // Ensure `FEATURE_PERSONAL_HEALTH_RECORD` is available before calling PHR apis
-    if (
-        healthConnectClient.features.getFeatureStatus(FEATURE_PERSONAL_HEALTH_RECORD) !=
-            FEATURE_STATUS_AVAILABLE
-    ) {
-        return
-    }
-
-    // Get or creates a `MedicalDataSource`
-    // Each `MedicalDataSource` is assigned an `id` by the system on creation
-    val medicalDataSource: MedicalDataSource =
-        healthConnectClient.createMedicalDataSource(
-            CreateMedicalDataSourceRequest(
-                fhirBaseUri = Uri.parse("https://fhir.com/oauth/api/FHIR/R4/"),
-                displayName = "Test Data Source",
-                fhirVersion = FhirVersion(4, 0, 1)
-            )
-        )
-
-    // Delete the `MedicalDataSource` that has the specified `id`
-    healthConnectClient.deleteMedicalDataSourceWithData(medicalDataSource.id)
-}
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-@Sampled
-suspend fun GetMedicalDataSourcesByRequestSample(
-    healthConnectClient: HealthConnectClient,
-    anotherPackageName: String
-) {
-    // Ensure `FEATURE_PERSONAL_HEALTH_RECORD` is available before calling PHR apis
-    if (
-        healthConnectClient.features.getFeatureStatus(FEATURE_PERSONAL_HEALTH_RECORD) !=
-            FEATURE_STATUS_AVAILABLE
-    ) {
-        return
-    }
-
-    // Get or create a `MedicalDataSource`
-    // Each `MedicalDataSource` contains the `packageName` which created it
-    val medicalDataSource: MedicalDataSource =
-        healthConnectClient.createMedicalDataSource(
-            CreateMedicalDataSourceRequest(
-                fhirBaseUri = Uri.parse("https://fhir.com/oauth/api/FHIR/R4/"),
-                displayName = "Test Data Source",
-                fhirVersion = FhirVersion(4, 0, 1)
-            )
-        )
-
-    // Retrieve all `MedicalDataSource`s created by any of the specified package names
-    // Package names may be found in other `MedicalDataSource`s or from arbitrary input
-    val medicalDataSources: List<MedicalDataSource> =
-        healthConnectClient.getMedicalDataSources(
-            GetMedicalDataSourcesRequest(listOf(medicalDataSource.packageName, anotherPackageName))
-        )
-}
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-@Sampled
-suspend fun GetMedicalDataSourcesByIdsSample(
-    healthConnectClient: HealthConnectClient,
-    anotherId: String,
-) {
-    // Ensure `FEATURE_PERSONAL_HEALTH_RECORD` is available before calling PHR apis
-    if (
-        healthConnectClient.features.getFeatureStatus(FEATURE_PERSONAL_HEALTH_RECORD) !=
-            FEATURE_STATUS_AVAILABLE
-    ) {
-        return
-    }
-
-    // Get or create a `MedicalDataSource`
-    // Each `MedicalDataSource` is assigned an `id` by the system on creation
-    val medicalDataSource: MedicalDataSource =
-        healthConnectClient.createMedicalDataSource(
-            CreateMedicalDataSourceRequest(
-                fhirBaseUri = Uri.parse("https://fhir.com/oauth/api/FHIR/R4/"),
-                displayName = "Test Data Source",
-                fhirVersion = FhirVersion(4, 0, 1)
-            )
-        )
-
-    // Retrieve all `MedicalDataSource` with `id` matching any of the given ids
-    val medicalDataSources: List<MedicalDataSource> =
-        healthConnectClient.getMedicalDataSources(listOf(medicalDataSource.id, anotherId))
-}
diff --git a/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/MedicalResourceSamples.kt b/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/MedicalResourceSamples.kt
deleted file mode 100644
index e141e9c..0000000
--- a/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/MedicalResourceSamples.kt
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 android.net.Uri
-import androidx.annotation.Sampled
-import androidx.health.connect.client.HealthConnectClient
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_PERSONAL_HEALTH_RECORD
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_STATUS_AVAILABLE
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.records.FhirVersion
-import androidx.health.connect.client.records.MedicalDataSource
-import androidx.health.connect.client.records.MedicalResource
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_MEDICATIONS
-import androidx.health.connect.client.records.MedicalResourceId
-import androidx.health.connect.client.request.CreateMedicalDataSourceRequest
-import androidx.health.connect.client.request.DeleteMedicalResourcesRequest
-import androidx.health.connect.client.request.ReadMedicalResourcesInitialRequest
-import androidx.health.connect.client.request.ReadMedicalResourcesPageRequest
-import androidx.health.connect.client.request.ReadMedicalResourcesRequest
-import androidx.health.connect.client.request.UpsertMedicalResourceRequest
-import androidx.health.connect.client.response.ReadMedicalResourcesResponse
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-@Sampled
-suspend fun UpsertMedicalResourcesSample(
-    healthConnectClient: HealthConnectClient,
-    medicationJsonToInsert: String,
-    updatedMedicationJsonToInsert: String,
-) {
-    // Ensure `FEATURE_PERSONAL_HEALTH_RECORD` is available before calling PHR apis
-    if (
-        healthConnectClient.features.getFeatureStatus(FEATURE_PERSONAL_HEALTH_RECORD) !=
-            FEATURE_STATUS_AVAILABLE
-    ) {
-        return
-    }
-
-    // Get or create a `MedicalDataSource`
-    val medicalDataSource: MedicalDataSource =
-        healthConnectClient.createMedicalDataSource(
-            CreateMedicalDataSourceRequest(
-                fhirBaseUri = Uri.parse("https://fhir.com/oauth/api/FHIR/R4/"),
-                displayName = "Test Data Source",
-                fhirVersion = FhirVersion(4, 0, 1)
-            )
-        )
-
-    // Insert `MedicalResource`s into the `MedicalDataSource`
-    val medicalResources: List<MedicalResource> =
-        healthConnectClient.upsertMedicalResources(
-            listOf(
-                UpsertMedicalResourceRequest(
-                    medicalDataSource.id,
-                    medicalDataSource.fhirVersion,
-                    medicationJsonToInsert // a valid FHIR json string
-                )
-            )
-        )
-
-    // Update `MedicalResource`s in the `MedicalDataSource`
-    val updatedMedicalResources: List<MedicalResource> =
-        healthConnectClient.upsertMedicalResources(
-            listOf(
-                UpsertMedicalResourceRequest(
-                    medicalDataSource.id,
-                    medicalDataSource.fhirVersion,
-                    // a valid FHIR json string
-                    // if this resource has the same type and ID as in `medicationJsonToInsert`,
-                    // this `upsertMedicalResources()` call will update the previously inserted
-                    // `MedicalResource`
-                    updatedMedicationJsonToInsert
-                )
-            )
-        )
-}
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-@Sampled
-suspend fun ReadMedicalResourcesByRequestSample(
-    healthConnectClient: HealthConnectClient,
-    exampleLabResults: List<UpsertMedicalResourceRequest>
-) {
-    // Ensure `FEATURE_PERSONAL_HEALTH_RECORD` is available before calling PHR apis
-    if (
-        healthConnectClient.features.getFeatureStatus(FEATURE_PERSONAL_HEALTH_RECORD) !=
-            FEATURE_STATUS_AVAILABLE
-    ) {
-        return
-    }
-
-    // Get or create a `MedicalDataSource`
-    val medicalDataSource: MedicalDataSource =
-        healthConnectClient.createMedicalDataSource(
-            CreateMedicalDataSourceRequest(
-                fhirBaseUri = Uri.parse("https://fhir.com/oauth/api/FHIR/R4/"),
-                displayName = "Test Data Source",
-                fhirVersion = FhirVersion(4, 0, 1)
-            )
-        )
-
-    // Insert `MedicalResource`s into the `MedicalDataSource`
-    healthConnectClient.upsertMedicalResources(exampleLabResults)
-
-    // Read `MedicalResource`s back from the `MedicalDataSource`
-    // Read 100 resources / page. See `pageSize` doc for defaults and limits.
-    val pageSize = 100
-    // Prepare the initial read request.
-    // All `MedicalResource`s in the given `MedicalDataSource`s and of given `medicalResourceType`
-    // will be retrieved.
-    val initialRequest: ReadMedicalResourcesRequest =
-        ReadMedicalResourcesInitialRequest(
-            MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS,
-            setOf(medicalDataSource.id),
-            pageSize = pageSize,
-        )
-    // Continue reading pages until all `MedicalResource`s are read
-    var pageToken: String? = null
-    do {
-        // Prepare paged request if needed
-        val request: ReadMedicalResourcesRequest =
-            if (pageToken == null) initialRequest
-            else ReadMedicalResourcesPageRequest(pageToken, pageSize = pageSize)
-        // Read `MedicalResource`s
-        val response: ReadMedicalResourcesResponse =
-            healthConnectClient.readMedicalResources(request)
-        // Process `MedicalResource`s as desired
-        val resources: List<MedicalResource> = response.medicalResources
-        // Advance to next page
-        pageToken = response.nextPageToken
-    } while (pageToken != null)
-}
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-@Sampled
-suspend fun ReadMedicalResourcesByIdsSample(
-    healthConnectClient: HealthConnectClient,
-    medicationJsonToInsert: String
-) {
-    // Ensure `FEATURE_PERSONAL_HEALTH_RECORD` is available before calling PHR apis
-    if (
-        healthConnectClient.features.getFeatureStatus(FEATURE_PERSONAL_HEALTH_RECORD) !=
-            FEATURE_STATUS_AVAILABLE
-    ) {
-        return
-    }
-
-    // Get or create a `MedicalDataSource`
-    val medicalDataSource: MedicalDataSource =
-        healthConnectClient.createMedicalDataSource(
-            CreateMedicalDataSourceRequest(
-                fhirBaseUri = Uri.parse("https://fhir.com/oauth/api/FHIR/R4/"),
-                displayName = "Test Data Source",
-                fhirVersion = FhirVersion(4, 0, 1)
-            )
-        )
-
-    // Insert `MedicalResource`s into the `MedicalDataSource`
-    val medicalResources: List<MedicalResource> =
-        healthConnectClient.upsertMedicalResources(
-            listOf(
-                UpsertMedicalResourceRequest(
-                    medicalDataSource.id,
-                    medicalDataSource.fhirVersion,
-                    medicationJsonToInsert // a valid FHIR json string
-                )
-            )
-        )
-
-    // Retrieve `fhirResourceType` type `MedicalResource`s with the specified `id`s from the
-    // provided `MedicalDataSource`
-    val retrievedMedicalResources: List<MedicalResource> =
-        healthConnectClient.readMedicalResources(
-            medicalResources.map { medicalResource: MedicalResource ->
-                MedicalResourceId(
-                    dataSourceId = medicalDataSource.id,
-                    fhirResourceType = medicalResource.id.fhirResourceType,
-                    fhirResourceId = medicalResource.id.fhirResourceId
-                )
-            }
-        )
-}
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-@Sampled
-suspend fun DeleteMedicalResourcesSample(
-    healthConnectClient: HealthConnectClient,
-    medicationJsonToInsert: String
-) {
-    // Ensure `FEATURE_PERSONAL_HEALTH_RECORD` is available before calling PHR apis
-    if (
-        healthConnectClient.features.getFeatureStatus(FEATURE_PERSONAL_HEALTH_RECORD) !=
-            FEATURE_STATUS_AVAILABLE
-    ) {
-        return
-    }
-
-    // Get or create a `MedicalDataSource`
-    val medicalDataSource: MedicalDataSource =
-        healthConnectClient.createMedicalDataSource(
-            CreateMedicalDataSourceRequest(
-                fhirBaseUri = Uri.parse("https://fhir.com/oauth/api/FHIR/R4/"),
-                displayName = "Test Data Source",
-                fhirVersion = FhirVersion(4, 0, 1)
-            )
-        )
-
-    // Insert `MedicalResource`s into the `MedicalDataSource`
-    val medicalResources: List<MedicalResource> =
-        healthConnectClient.upsertMedicalResources(
-            listOf(
-                UpsertMedicalResourceRequest(
-                    medicalDataSource.id,
-                    medicalDataSource.fhirVersion,
-                    medicationJsonToInsert // a valid FHIR json string
-                )
-            )
-        )
-
-    // Delete `MedicalResource`s matching the specified `dataSourceId`, `type` and `fhirResourceId`
-    healthConnectClient.deleteMedicalResources(
-        medicalResources.map { medicalResource: MedicalResource ->
-            MedicalResourceId(
-                dataSourceId = medicalDataSource.id,
-                fhirResourceType = medicalResource.id.fhirResourceType,
-                fhirResourceId = medicalResource.id.fhirResourceId
-            )
-        }
-    )
-}
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-@Sampled
-suspend fun DeleteMedicalResourcesByRequestSample(
-    healthConnectClient: HealthConnectClient,
-    medicationJsonToInsert: String
-) {
-    // Ensure `FEATURE_PERSONAL_HEALTH_RECORD` is available before calling PHR apis
-    if (
-        healthConnectClient.features.getFeatureStatus(FEATURE_PERSONAL_HEALTH_RECORD) !=
-            FEATURE_STATUS_AVAILABLE
-    ) {
-        return
-    }
-
-    // Get or create a `MedicalDataSource`
-    val medicalDataSource: MedicalDataSource =
-        healthConnectClient.createMedicalDataSource(
-            CreateMedicalDataSourceRequest(
-                fhirBaseUri = Uri.parse("https://fhir.com/oauth/api/FHIR/R4/"),
-                displayName = "Test Data Source",
-                fhirVersion = FhirVersion(4, 0, 1)
-            )
-        )
-
-    // Insert `MedicalResource`s into the `MedicalDataSource`
-    val medicalResources: List<MedicalResource> =
-        healthConnectClient.upsertMedicalResources(
-            listOf(
-                UpsertMedicalResourceRequest(
-                    medicalDataSource.id,
-                    medicalDataSource.fhirVersion,
-                    medicationJsonToInsert // a valid FHIR json string
-                )
-            )
-        )
-
-    // Delete all `MedicalResource`s that are in any pair of provided `dataSourceIds` and
-    // `medicalResourceTypes`
-    healthConnectClient.deleteMedicalResources(
-        DeleteMedicalResourcesRequest(
-            dataSourceIds = setOf(medicalDataSource.id),
-            medicalResourceTypes = setOf(MEDICAL_RESOURCE_TYPE_MEDICATIONS)
-        )
-    )
-}
diff --git a/health/connect/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
index 77844c3..1319296 100644
--- a/health/connect/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
@@ -22,12 +22,9 @@
 import androidx.annotation.Sampled
 import androidx.health.connect.client.HealthConnectFeatures
 import androidx.health.connect.client.PermissionController
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
 import androidx.health.connect.client.permission.HealthPermission
 import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_HEALTH_DATA_HISTORY
 import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND
-import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_VACCINES
-import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_WRITE_MEDICAL_DATA
 import androidx.health.connect.client.records.StepsRecord
 
 @Sampled
@@ -104,29 +101,3 @@
         // user denied permission
     }
 }
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-@Sampled
-fun RequestMedicalPermissions(features: HealthConnectFeatures, activity: ActivityResultCaller) {
-    // The set of medical permissions to be requested (add additional read permissions as required)
-    val medicalPermissions =
-        setOf(PERMISSION_WRITE_MEDICAL_DATA, PERMISSION_READ_MEDICAL_DATA_VACCINES)
-    val requestPermission =
-        activity.registerForActivityResult(
-            PermissionController.createRequestPermissionResultContract()
-        ) { grantedPermissions: Set<String> ->
-            if (grantedPermissions.containsAll(medicalPermissions)) {
-                // Permissions granted to write health data and read immunizations
-            } else {
-                // User denied permission to write health data and/or read immunizations
-            }
-        }
-
-    if (
-        features.getFeatureStatus(HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD) ==
-            HealthConnectFeatures.FEATURE_STATUS_AVAILABLE
-    ) {
-        // The feature is available, request medical permissions
-        requestPermission.launch(medicalPermissions)
-    }
-}
diff --git a/health/connect/connect-client/src/androidTest/AndroidManifest.xml b/health/connect/connect-client/src/androidTest/AndroidManifest.xml
index d8877e8..47aac45 100644
--- a/health/connect/connect-client/src/androidTest/AndroidManifest.xml
+++ b/health/connect/connect-client/src/androidTest/AndroidManifest.xml
@@ -75,23 +75,6 @@
     <uses-permission android:name="android.permission.health.READ_RESTING_HEART_RATE"/>
     <uses-permission android:name="android.permission.health.READ_SKIN_TEMPERATURE"/>
 
-    <!-- Read permissions for PERSONAL HEALTH RECORD. -->
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_CONDITIONS"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_MEDICATIONS"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PREGNANCY"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PROCEDURES"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VACCINES"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VISITS"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS"/>
-
-    <!-- Write permissions for PERSONAL HEALTH RECORD. -->
-    <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
-
     <!-- Write permissions for ACTIVITY. -->
     <uses-permission android:name="android.permission.health.WRITE_ACTIVE_CALORIES_BURNED"/>
     <uses-permission android:name="android.permission.health.WRITE_DISTANCE"/>
@@ -140,5 +123,4 @@
     <uses-permission android:name="android.permission.health.WRITE_RESPIRATORY_RATE"/>
     <uses-permission android:name="android.permission.health.WRITE_RESTING_HEART_RATE"/>
     <uses-permission android:name="android.permission.health.WRITE_SKIN_TEMPERATURE"/>
-
 </manifest>
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImplTest.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImplTest.kt
index 7cc4aba..c810318 100644
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImplTest.kt
+++ b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImplTest.kt
@@ -17,7 +17,6 @@
 package androidx.health.connect.client.impl
 
 import android.content.Context
-import android.net.Uri
 import android.os.Build
 import android.os.ext.SdkExtensions
 import androidx.health.connect.client.HealthConnectClient
@@ -26,20 +25,11 @@
 import androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration
 import androidx.health.connect.client.changes.DeletionChange
 import androidx.health.connect.client.changes.UpsertionChange
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.isPersonalHealthRecordFeatureAvailableInPlatform
-import androidx.health.connect.client.impl.platform.phr.VaccinesMedicalResourceFactory.CompleteStatus.COMPLETE
-import androidx.health.connect.client.impl.platform.phr.VaccinesMedicalResourceFactory.CompleteStatus.INCOMPLETE
-import androidx.health.connect.client.impl.platform.phr.VaccinesMedicalResourceFactory.createVaccinesUpsertMedicalResourceRequest
 import androidx.health.connect.client.impl.platform.records.SDK_TO_PLATFORM_RECORD_CLASS
 import androidx.health.connect.client.impl.platform.records.SDK_TO_PLATFORM_RECORD_CLASS_EXT_13
 import androidx.health.connect.client.permission.HealthPermission
 import androidx.health.connect.client.readRecord
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_IMMUNIZATION
-import androidx.health.connect.client.records.FhirVersion
 import androidx.health.connect.client.records.HeartRateRecord
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_VACCINES
-import androidx.health.connect.client.records.MedicalResourceId
 import androidx.health.connect.client.records.NutritionRecord
 import androidx.health.connect.client.records.StepsRecord
 import androidx.health.connect.client.records.WeightRecord
@@ -51,11 +41,6 @@
 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.CreateMedicalDataSourceRequest
-import androidx.health.connect.client.request.DeleteMedicalResourcesRequest
-import androidx.health.connect.client.request.GetMedicalDataSourcesRequest
-import androidx.health.connect.client.request.ReadMedicalResourcesInitialRequest
-import androidx.health.connect.client.request.ReadMedicalResourcesPageRequest
 import androidx.health.connect.client.request.ReadRecordsRequest
 import androidx.health.connect.client.time.TimeRangeFilter
 import androidx.health.connect.client.units.Energy
@@ -83,7 +68,6 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
@@ -97,12 +81,6 @@
         private val ZONE_OFFSET = ZoneOffset.UTC
         private val ZONE_ID = ZoneId.of(ZONE_OFFSET.id)
 
-        private const val MEDICAL_DATA_SOURCE_DISPLAY_NAME = "Data source test app"
-        private val FHIR_BASE_URI = Uri.parse("https://fhir.com/oauth/api/FHIR/R4/")
-        // lazy is needed, otherwise the object would be constructed without a check for PHR feature
-        // availability, which would lead to a crash.
-        private val FHIR_VERSION_4_0_1 by lazy { FhirVersion(4, 0, 1) }
-
         fun getAllRecordPermissions(): Array<String> {
             val permissions: HashSet<String> = HashSet()
 
@@ -118,10 +96,6 @@
                 }
             }
 
-            if (isPersonalHealthRecordFeatureAvailableInPlatform()) {
-                permissions.addAll(HealthPermission.ALL_PERSONAL_HEALTH_RECORD_PERMISSIONS)
-            }
-
             return permissions.toTypedArray()
         }
     }
@@ -144,16 +118,12 @@
         for (recordType in SDK_TO_PLATFORM_RECORD_CLASS.keys) {
             healthConnectClient.deleteRecords(recordType, TimeRangeFilter.after(Instant.EPOCH))
         }
+
         if (SdkExtensions.getExtensionVersion(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) >= 13) {
             for (recordType in SDK_TO_PLATFORM_RECORD_CLASS_EXT_13.keys) {
                 healthConnectClient.deleteRecords(recordType, TimeRangeFilter.after(Instant.EPOCH))
             }
         }
-        if (isPersonalHealthRecordFeatureAvailableInPlatform()) {
-            healthConnectClient
-                .getMedicalDataSources(GetMedicalDataSourcesRequest(listOf(context.packageName)))
-                .forEach { healthConnectClient.deleteMedicalDataSourceWithData(it.id) }
-        }
     }
 
     @Test
@@ -827,10 +797,6 @@
 
     @Test
     fun getGrantedPermissions() = runTest {
-        assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
         assertThat(healthConnectClient.permissionController.getGrantedPermissions())
             .containsExactlyElementsIn(getAllRecordPermissions())
     }
@@ -953,321 +919,6 @@
             .containsExactly(DataOrigin(packageName = context.packageName))
     }
 
-    @Test
-    fun createMedicalDataSource_thenGetByRequest_expectSuccess() = runTest {
-        assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-
-        // Create a MedicalDataSource
-        val createMedicalDataSourceResponse =
-            healthConnectClient.createMedicalDataSource(
-                CreateMedicalDataSourceRequest(
-                    fhirBaseUri = FHIR_BASE_URI,
-                    displayName = MEDICAL_DATA_SOURCE_DISPLAY_NAME,
-                    fhirVersion = FHIR_VERSION_4_0_1
-                )
-            )
-        assertThat(createMedicalDataSourceResponse.id).isNotEmpty()
-
-        // Retrieve newly created data source by request and verify retrieved == created response
-        val getMedicalDataSourcesByRequestResponse =
-            healthConnectClient.getMedicalDataSources(
-                GetMedicalDataSourcesRequest(listOf(createMedicalDataSourceResponse.packageName))
-            )
-        assertThat(getMedicalDataSourcesByRequestResponse)
-            .containsExactly(createMedicalDataSourceResponse)
-    }
-
-    @Test
-    fun createMedicalDataSource_thenGetByIds_expectSuccess() = runTest {
-        assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-
-        // Create a MedicalDataSource
-        val createMedicalDataSourceResponse =
-            healthConnectClient.createMedicalDataSource(
-                CreateMedicalDataSourceRequest(
-                    fhirBaseUri = FHIR_BASE_URI,
-                    displayName = MEDICAL_DATA_SOURCE_DISPLAY_NAME,
-                    fhirVersion = FHIR_VERSION_4_0_1
-                )
-            )
-        assertThat(createMedicalDataSourceResponse.id).isNotEmpty()
-
-        // Retrieve newly created data source by ID and verify retrieved == created response
-        val getMedicalDataSourcesByIdsResponse =
-            healthConnectClient.getMedicalDataSources(listOf(createMedicalDataSourceResponse.id))
-        assertThat(getMedicalDataSourcesByIdsResponse).hasSize(1)
-        assertThat(getMedicalDataSourcesByIdsResponse)
-            .containsExactly(createMedicalDataSourceResponse)
-    }
-
-    @Test
-    fun createMedicalDataSource_thenDelete_expectSuccess() = runTest {
-        assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-
-        // Create a MedicalDataSource
-        val createMedicalDataSourceResponse =
-            healthConnectClient.createMedicalDataSource(
-                CreateMedicalDataSourceRequest(
-                    fhirBaseUri = FHIR_BASE_URI,
-                    displayName = MEDICAL_DATA_SOURCE_DISPLAY_NAME,
-                    fhirVersion = FHIR_VERSION_4_0_1
-                )
-            )
-        assertThat(createMedicalDataSourceResponse.id).isNotEmpty()
-
-        // Delete the newly created data source
-        healthConnectClient.deleteMedicalDataSourceWithData(createMedicalDataSourceResponse.id)
-
-        // Verify newly created data source does not exist
-        val getMedicalDataSourcesByIdsResponse =
-            healthConnectClient.getMedicalDataSources(listOf(createMedicalDataSourceResponse.id))
-        assertThat(getMedicalDataSourcesByIdsResponse).hasSize(0)
-    }
-
-    @Test
-    fun upsertNewMedicalResourcesThenReadByRequest_expectCorrectResponse() = runTest {
-        assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-        val dataSourceId =
-            healthConnectClient
-                .createMedicalDataSource(
-                    CreateMedicalDataSourceRequest(
-                        fhirBaseUri = FHIR_BASE_URI,
-                        displayName = MEDICAL_DATA_SOURCE_DISPLAY_NAME,
-                        fhirVersion = FHIR_VERSION_4_0_1
-                    )
-                )
-                .id
-        val requests =
-            listOf(
-                createVaccinesUpsertMedicalResourceRequest(
-                    dataSourceId = dataSourceId,
-                    fhirResourceId = "immunization-101"
-                ),
-                createVaccinesUpsertMedicalResourceRequest(
-                    dataSourceId = dataSourceId,
-                    fhirResourceId = "immunization-102"
-                )
-            )
-
-        // insert a new MedicalResource
-        val upsertResponse = healthConnectClient.upsertMedicalResources(requests)
-
-        assertThat(upsertResponse).hasSize(2)
-        assertThat(upsertResponse.map { it.fhirResource.data }).isEqualTo(requests.map { it.data })
-
-        // read the first MedicalResource with ReadMedicalResourcesInitialRequest
-        val firstPageResponse =
-            healthConnectClient.readMedicalResources(
-                ReadMedicalResourcesInitialRequest(
-                    MEDICAL_RESOURCE_TYPE_VACCINES,
-                    setOf(dataSourceId),
-                    pageSize = 1
-                )
-            )
-
-        assertThat(firstPageResponse.medicalResources).containsExactly(upsertResponse[0])
-        assertThat(firstPageResponse.remainingCount).isEqualTo(1)
-        assertThat(firstPageResponse.nextPageToken).isNotNull()
-
-        // read the second MedicalResource with ReadMedicalResourcesPageRequest
-        val secondPageResponse =
-            healthConnectClient.readMedicalResources(
-                ReadMedicalResourcesPageRequest(firstPageResponse.nextPageToken!!)
-            )
-
-        assertThat(secondPageResponse.medicalResources).containsExactly(upsertResponse[1])
-        assertThat(secondPageResponse.remainingCount).isEqualTo(0)
-        assertThat(secondPageResponse.nextPageToken).isNull()
-    }
-
-    @Test
-    fun upsertNewMedicalResourcesThenReadByIds_expectCorrectResponse() = runTest {
-        assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-        val dataSourceId =
-            healthConnectClient
-                .createMedicalDataSource(
-                    CreateMedicalDataSourceRequest(
-                        fhirBaseUri = FHIR_BASE_URI,
-                        displayName = MEDICAL_DATA_SOURCE_DISPLAY_NAME,
-                        fhirVersion = FHIR_VERSION_4_0_1
-                    )
-                )
-                .id
-        val fhirResourceId = "immunization-101"
-        val requests =
-            listOf(
-                createVaccinesUpsertMedicalResourceRequest(
-                    dataSourceId = dataSourceId,
-                    fhirResourceId = fhirResourceId
-                )
-            )
-
-        // insert a new MedicalResource
-        val upsertResponse = healthConnectClient.upsertMedicalResources(requests)
-
-        assertThat(upsertResponse).hasSize(1)
-        assertThat(upsertResponse[0].fhirResource.data).isEqualTo(requests[0].data)
-
-        // read back the MedicalResource
-        val medicalResources =
-            healthConnectClient.readMedicalResources(
-                listOf(
-                    MedicalResourceId(
-                        dataSourceId = dataSourceId,
-                        fhirResourceType = FHIR_RESOURCE_TYPE_IMMUNIZATION,
-                        fhirResourceId = fhirResourceId
-                    )
-                )
-            )
-
-        assertThat(medicalResources).isEqualTo(upsertResponse)
-    }
-
-    @Test
-    fun upsertExistingMedicalResourcesThenReadByIds_expectCorrectResponse() = runTest {
-        assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-        val dataSourceId =
-            healthConnectClient
-                .createMedicalDataSource(
-                    CreateMedicalDataSourceRequest(
-                        fhirBaseUri = FHIR_BASE_URI,
-                        displayName = MEDICAL_DATA_SOURCE_DISPLAY_NAME,
-                        fhirVersion = FHIR_VERSION_4_0_1
-                    )
-                )
-                .id
-        val fhirResourceId = "immunization-101"
-        val insertRequests =
-            listOf(
-                createVaccinesUpsertMedicalResourceRequest(
-                    dataSourceId = dataSourceId,
-                    fhirResourceId = fhirResourceId,
-                    completeStatus = COMPLETE
-                )
-            )
-
-        // insert a new MedicalResource
-        val insertResponse = healthConnectClient.upsertMedicalResources(insertRequests)
-
-        assertThat(insertResponse).hasSize(1)
-        assertThat(insertResponse[0].fhirResource.data).isEqualTo(insertRequests[0].data)
-
-        // update the inserted MedicalResource
-        val updateRequests =
-            listOf(
-                createVaccinesUpsertMedicalResourceRequest(
-                    dataSourceId = dataSourceId,
-                    fhirResourceId = fhirResourceId,
-                    completeStatus = INCOMPLETE // change this from COMPLETE => INCOMPLETE
-                )
-            )
-
-        val updateResponse = healthConnectClient.upsertMedicalResources(updateRequests)
-        assertThat(updateResponse).hasSize(1)
-        assertThat(updateResponse[0].fhirResource.data).isEqualTo(updateRequests[0].data)
-        assertThat(insertResponse[0].id).isEqualTo(updateResponse[0].id)
-
-        // read back the MedicalResource
-        val medicalResources =
-            healthConnectClient.readMedicalResources(
-                listOf(
-                    MedicalResourceId(
-                        dataSourceId = dataSourceId,
-                        fhirResourceType = FHIR_RESOURCE_TYPE_IMMUNIZATION,
-                        fhirResourceId = fhirResourceId
-                    )
-                )
-            )
-
-        assertThat(medicalResources).isEqualTo(updateResponse)
-    }
-
-    @Test
-    fun insertMedicalResourcesThenDeleteByIds_expectSuccessfulDeletion() = runTest {
-        assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-        val dataSourceId =
-            healthConnectClient
-                .createMedicalDataSource(
-                    CreateMedicalDataSourceRequest(
-                        fhirBaseUri = FHIR_BASE_URI,
-                        displayName = MEDICAL_DATA_SOURCE_DISPLAY_NAME,
-                        fhirVersion = FHIR_VERSION_4_0_1
-                    )
-                )
-                .id
-        val fhirResourceId = "immunization-101"
-        val requests =
-            listOf(
-                createVaccinesUpsertMedicalResourceRequest(
-                    dataSourceId = dataSourceId,
-                    fhirResourceId = fhirResourceId
-                )
-            )
-        val insertResponse = healthConnectClient.upsertMedicalResources(requests)
-
-        healthConnectClient.deleteMedicalResources(insertResponse.map { it.id })
-
-        val medicalResources =
-            healthConnectClient.readMedicalResources(insertResponse.map { it.id })
-        assertThat(medicalResources).isEmpty()
-    }
-
-    @Test
-    fun insertMedicalResourcesThenDeleteByRequest_expectSuccessfulDeletion() = runTest {
-        assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-        val dataSourceId =
-            healthConnectClient
-                .createMedicalDataSource(
-                    CreateMedicalDataSourceRequest(
-                        fhirBaseUri = FHIR_BASE_URI,
-                        displayName = MEDICAL_DATA_SOURCE_DISPLAY_NAME,
-                        fhirVersion = FHIR_VERSION_4_0_1
-                    )
-                )
-                .id
-        val fhirResourceId = "immunization-101"
-        val requests =
-            listOf(
-                createVaccinesUpsertMedicalResourceRequest(
-                    dataSourceId = dataSourceId,
-                    fhirResourceId = fhirResourceId
-                )
-            )
-        val insertResponse = healthConnectClient.upsertMedicalResources(requests)
-
-        healthConnectClient.deleteMedicalResources(
-            DeleteMedicalResourcesRequest(setOf(dataSourceId))
-        )
-
-        val medicalResources =
-            healthConnectClient.readMedicalResources(insertResponse.map { it.id })
-        assertThat(medicalResources).isEmpty()
-    }
-
     private val Int.seconds: Duration
         get() = Duration.ofSeconds(this.toLong())
 
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/phr/PhrConstants.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/phr/PhrConstants.kt
deleted file mode 100644
index 7844310..0000000
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/phr/PhrConstants.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.platform.phr
-
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.records.FhirVersion
-
-// Note: lazy must be used to avoid crashes when tests are run on a device where PHR is not
-// available. In tests where these constants are used, assumeTrue() is used to make sure PHR is
-// available.
-internal object PhrConstants {
-    @OptIn(ExperimentalPersonalHealthRecordApi::class)
-    val FHIR_VERSION_4_0_1 by lazy { FhirVersion.Companion.parseFhirVersion("4.0.1") }
-}
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/phr/VaccinesMedicalResourceFactory.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/phr/VaccinesMedicalResourceFactory.kt
deleted file mode 100644
index 60caded..0000000
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/phr/VaccinesMedicalResourceFactory.kt
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.platform.phr
-
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.impl.platform.phr.PhrConstants.FHIR_VERSION_4_0_1
-import androidx.health.connect.client.impl.platform.phr.VaccinesMedicalResourceFactory.CompleteStatus.COMPLETE
-import androidx.health.connect.client.request.UpsertMedicalResourceRequest
-import org.json.JSONObject
-
-internal object VaccinesMedicalResourceFactory {
-    private val FHIR_RESOURCE_JSON_DATA_IMMUNIZATIONS =
-        JSONObject(
-            """
-            {
-              "resourceType": "Immunization",
-              "id": "immunization-1",
-              "status": "completed",
-              "vaccineCode": {
-                "coding": [
-                  {
-                    "system": "http://hl7.org/fhir/sid/cvx",
-                    "code": "115"
-                  },
-                  {
-                    "system": "http://hl7.org/fhir/sid/ndc",
-                    "code": "58160-842-11"
-                  }
-                ],
-                "text": "Tdap"
-              },
-              "patient": {
-                "reference": "Patient/patient_1",
-                "display": "Example, Anne"
-              },
-              "encounter": {
-                "reference": "Encounter/encounter_unk",
-                "display": "GP Visit"
-              },
-              "occurrenceDateTime": "2018-05-21",
-              "primarySource": true,
-              "manufacturer": {
-                "display": "Sanofi Pasteur"
-              },
-              "lotNumber": "1",
-              "site": {
-                "coding": [
-                  {
-                    "system": "http://terminology.hl7.org/CodeSystem/v3-ActSite",
-                    "code": "LA",
-                    "display": "Left Arm"
-                  }
-                ],
-                "text": "Left Arm"
-              },
-              "route": {
-                "coding": [
-                  {
-                    "system": "http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration",
-                    "code": "IM",
-                    "display": "Injection, intramuscular"
-                  }
-                ],
-                "text": "Injection, intramuscular"
-              },
-              "doseQuantity": {
-                "value": 0.5,
-                "unit": "mL"
-              },
-              "performer": [
-                {
-                  "function": {
-                    "coding": [
-                      {
-                        "system": "http://terminology.hl7.org/CodeSystem/v2-0443",
-                        "code": "AP",
-                        "display": "Administering Provider"
-                      }
-                    ],
-                    "text": "Administering Provider"
-                  },
-                  "actor": {
-                    "reference": "Practitioner/practitioner_1",
-                    "type": "Practitioner",
-                    "display": "Dr Maria Hernandez"
-                  }
-                }
-              ]
-            }"""
-                .trimIndent()
-        )
-
-    @OptIn(ExperimentalPersonalHealthRecordApi::class)
-    fun createVaccinesUpsertMedicalResourceRequest(
-        dataSourceId: String,
-        fhirResourceId: String? = null,
-        completeStatus: CompleteStatus = COMPLETE
-    ): UpsertMedicalResourceRequest {
-        val data =
-            FHIR_RESOURCE_JSON_DATA_IMMUNIZATIONS.apply {
-                    putOpt("id", fhirResourceId)
-                    put("status", completeStatus.stringValue)
-                }
-                .toString()
-        return UpsertMedicalResourceRequest(dataSourceId, FHIR_VERSION_4_0_1, data)
-    }
-
-    enum class CompleteStatus(internal val stringValue: String) {
-        COMPLETE("complete"),
-        INCOMPLETE("incomplete")
-    }
-}
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/records/FhirResourceTest.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/records/FhirResourceTest.kt
deleted file mode 100644
index 0f0c663..0000000
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/records/FhirResourceTest.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.platform.records
-
-import android.annotation.SuppressLint
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.isPersonalHealthRecordFeatureAvailableInPlatform
-import androidx.health.connect.client.records.FhirResource
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_PATIENT
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.google.common.testing.EqualsTester
-import com.google.common.truth.Truth.assertThat
-import org.junit.Assume
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class FhirResourceTest {
-
-    @Before
-    fun setup() {
-        Assume.assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-    }
-
-    @Test
-    fun validFhirResource_equals() {
-        EqualsTester()
-            .addEqualityGroup(
-                FhirResource(type = FHIR_RESOURCE_TYPE_PATIENT, id = "id1", data = "{}"),
-                FhirResource(type = FHIR_RESOURCE_TYPE_PATIENT, id = "id1", data = "{}")
-            )
-            .addEqualityGroup(
-                FhirResource(type = FHIR_RESOURCE_TYPE_PATIENT, id = "id2", data = "{}")
-            )
-            .testEquals()
-    }
-
-    @Test
-    fun toString_expectCorrectString() {
-        val fhirResource = FhirResource(type = FHIR_RESOURCE_TYPE_PATIENT, id = "id1", data = "{}")
-
-        val toString = fhirResource.toString()
-
-        assertThat(toString).contains("(type=9, id=id1, data={})")
-    }
-
-    @SuppressLint("NewApi") // checked with feature availability check
-    @Test
-    fun toPlatformFhirResource_expectCorrectConversion() {
-        val sdk = FhirResource(type = FHIR_RESOURCE_TYPE_PATIENT, id = "id1", data = "{}")
-
-        assertThat(sdk.platformFhirResource)
-            .isEqualTo(
-                PlatformFhirResourceBuilder(
-                        PlatformFhirResource.FHIR_RESOURCE_TYPE_PATIENT,
-                        "id1",
-                        "{}"
-                    )
-                    .build()
-            )
-    }
-}
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/records/FhirVersionTest.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/records/FhirVersionTest.kt
deleted file mode 100644
index 3a8ada6..0000000
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/records/FhirVersionTest.kt
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.platform.records
-
-import android.annotation.SuppressLint
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.isPersonalHealthRecordFeatureAvailableInPlatform
-import androidx.health.connect.client.records.FhirVersion
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.google.common.testing.EqualsTester
-import com.google.common.truth.Truth.assertThat
-import org.junit.Assert.assertThrows
-import org.junit.Assume
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@ExperimentalPersonalHealthRecordApi
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class FhirVersionTest {
-    @Before
-    fun setup() {
-        Assume.assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-    }
-
-    @Test
-    fun compareTo_sameVersion_returnsZero() {
-        val version1 = FhirVersion(1, 0, 0)
-        val version2 = FhirVersion(1, 0, 0)
-
-        assertThat(version1.compareTo(version2)).isEqualTo(0)
-        assertThat(version2.compareTo(version1)).isEqualTo(0)
-    }
-
-    @Test
-    fun compareTo_differentMajor_returnsCorrectValue() {
-        val version1 = FhirVersion(2, 0, 0)
-        val version2 = FhirVersion(1, 0, 0)
-
-        assertThat(version1.compareTo(version2)).isGreaterThan(0)
-        assertThat(version2.compareTo(version1)).isLessThan(0)
-    }
-
-    @Test
-    fun compareTo_differentMinor_returnsCorrectValue() {
-        val version1 = FhirVersion(1, 1, 0)
-        val version2 = FhirVersion(1, 0, 0)
-
-        assertThat(version1.compareTo(version2)).isGreaterThan(0)
-        assertThat(version2.compareTo(version1)).isLessThan(0)
-    }
-
-    @Test
-    fun compareTo_differentPatch_returnsCorrectValue() {
-        val version1 = FhirVersion(1, 0, 1)
-        val version2 = FhirVersion(1, 0, 0)
-
-        assertThat(version1.compareTo(version2)).isGreaterThan(0)
-        assertThat(version2.compareTo(version1)).isLessThan(0)
-    }
-
-    @Test
-    fun validFhirVersion_equals() {
-        EqualsTester()
-            .addEqualityGroup(
-                FhirVersion(major = 1, minor = 2, patch = 3),
-                FhirVersion(major = 1, minor = 2, patch = 3)
-            )
-            .addEqualityGroup(FhirVersion(major = 1, minor = 2, patch = 5))
-            .testEquals()
-    }
-
-    @Test
-    fun toString_expectCorrectString() {
-        val fhirVersion = FhirVersion(major = 1, minor = 2, patch = 3)
-
-        val fhirVersionString = fhirVersion.toString()
-
-        assertThat(fhirVersionString).contains("(1.2.3)")
-    }
-
-    @Test
-    fun parseFhirVersionString_invalidInput_expectError() {
-        val input = "1.1.a"
-
-        assertThrows(IllegalArgumentException::class.java) { FhirVersion.parseFhirVersion(input) }
-    }
-
-    @Test
-    fun parseFhirVersionString_validInput_expectCorrectFhirVersion() {
-        val input = "1.1.10"
-
-        val fhirVersion = FhirVersion.parseFhirVersion(input)
-
-        assertThat(fhirVersion).isEqualTo(FhirVersion(major = 1, minor = 1, patch = 10))
-    }
-
-    @SuppressLint("NewApi") // checked with feature availability check
-    @Test
-    fun toPlatformFhirVersion_expectCorrectConversion() {
-        val sdk = FhirVersion(major = 1, minor = 2, patch = 3)
-
-        assertThat(sdk.platformFhirVersion).isEqualTo(PlatformFhirVersion.parseFhirVersion("1.2.3"))
-    }
-
-    @Test
-    fun isSupportedVersion_notSupportedVersion_expectFalse() {
-        val fhirVersion = FhirVersion(major = 1, minor = 2, patch = 3)
-
-        assertThat(fhirVersion.isSupportedFhirVersion()).isFalse()
-    }
-
-    @Test
-    fun isSupportedVersion_supportedVersion_expectTrue() {
-        val fhirVersion = FhirVersion(major = 4, minor = 0, patch = 1)
-
-        assertThat(fhirVersion.isSupportedFhirVersion()).isTrue()
-    }
-}
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/records/MedicalDataSourceTest.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/records/MedicalDataSourceTest.kt
deleted file mode 100644
index d23a407..0000000
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/records/MedicalDataSourceTest.kt
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.platform.records
-
-import android.annotation.SuppressLint
-import android.net.Uri
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.isPersonalHealthRecordFeatureAvailableInPlatform
-import androidx.health.connect.client.records.FhirVersion
-import androidx.health.connect.client.records.MedicalDataSource
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.google.common.testing.EqualsTester
-import com.google.common.truth.Truth.assertThat
-import java.time.Instant
-import org.junit.Assume
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@ExperimentalPersonalHealthRecordApi
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class MedicalDataSourceTest {
-
-    @Before
-    fun setup() {
-        Assume.assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-    }
-
-    @Test
-    fun validMedicalDataSource_equals() {
-        EqualsTester()
-            .addEqualityGroup(
-                MedicalDataSource(
-                    id = ID,
-                    packageName = PACKAGE_NAME,
-                    fhirBaseUri = FHIR_BASE_URI,
-                    displayName = DISPLAY_NAME,
-                    fhirVersion = FHIR_VERSION,
-                    lastDataUpdateTime = LAST_UPDATED_TIME
-                ),
-                MedicalDataSource(
-                    id = ID,
-                    packageName = PACKAGE_NAME,
-                    fhirBaseUri = FHIR_BASE_URI,
-                    displayName = DISPLAY_NAME,
-                    fhirVersion = FHIR_VERSION,
-                    lastDataUpdateTime = LAST_UPDATED_TIME
-                )
-            )
-            .addEqualityGroup(
-                MedicalDataSource(
-                    id = ID + "2",
-                    packageName = PACKAGE_NAME,
-                    fhirBaseUri = FHIR_BASE_URI,
-                    displayName = DISPLAY_NAME,
-                    fhirVersion = FHIR_VERSION,
-                    lastDataUpdateTime = LAST_UPDATED_TIME
-                )
-            )
-            .addEqualityGroup(
-                MedicalDataSource(
-                    id = ID,
-                    packageName = PACKAGE_NAME + "two",
-                    fhirBaseUri = FHIR_BASE_URI,
-                    displayName = DISPLAY_NAME,
-                    fhirVersion = FHIR_VERSION,
-                    lastDataUpdateTime = LAST_UPDATED_TIME
-                )
-            )
-            .addEqualityGroup(
-                MedicalDataSource(
-                    id = ID,
-                    packageName = PACKAGE_NAME,
-                    fhirBaseUri = FHIR_BASE_URI.buildUpon().appendPath("2/").build(),
-                    displayName = DISPLAY_NAME,
-                    fhirVersion = FHIR_VERSION,
-                    lastDataUpdateTime = LAST_UPDATED_TIME
-                )
-            )
-            .testEquals()
-            .addEqualityGroup(
-                MedicalDataSource(
-                    id = ID,
-                    packageName = PACKAGE_NAME,
-                    fhirBaseUri = FHIR_BASE_URI,
-                    displayName = "$DISPLAY_NAME Two",
-                    fhirVersion = FHIR_VERSION,
-                    lastDataUpdateTime = LAST_UPDATED_TIME
-                )
-            )
-            .testEquals()
-            .addEqualityGroup(
-                MedicalDataSource(
-                    id = ID,
-                    packageName = PACKAGE_NAME,
-                    fhirBaseUri = FHIR_BASE_URI,
-                    displayName = DISPLAY_NAME,
-                    fhirVersion = FhirVersion(4, 3, 0),
-                    lastDataUpdateTime = LAST_UPDATED_TIME
-                )
-            )
-            .testEquals()
-            .addEqualityGroup(
-                MedicalDataSource(
-                    id = ID,
-                    packageName = PACKAGE_NAME,
-                    fhirBaseUri = FHIR_BASE_URI,
-                    displayName = DISPLAY_NAME,
-                    fhirVersion = FHIR_VERSION,
-                    lastDataUpdateTime =
-                        Instant.parse(
-                            LAST_DATA_UPDATE_TIMESTAMP.replace("2025-01-27", "2025-01-28")
-                        )
-                )
-            )
-            .testEquals()
-    }
-
-    @Test
-    fun toString_expectCorrectString() {
-        val medicalDataSource =
-            MedicalDataSource(
-                id = ID,
-                packageName = PACKAGE_NAME,
-                fhirBaseUri = FHIR_BASE_URI,
-                displayName = DISPLAY_NAME,
-                fhirVersion = FHIR_VERSION,
-                lastDataUpdateTime = LAST_UPDATED_TIME
-            )
-
-        val toString = medicalDataSource.toString()
-
-        assertThat(toString).contains("id=testid")
-        assertThat(toString).contains("packageName=androidx.health.connect.client")
-        assertThat(toString).contains("fhirBaseUri=https://fhir.com/oauth/api/FHIR/R4/")
-        assertThat(toString).contains("displayName=Test Data Source")
-        assertThat(toString).contains("fhirVersion=FhirVersion")
-        assertThat(toString).contains("(4.0.1)")
-        assertThat(toString).contains("lastDataUpdateTime=$LAST_DATA_UPDATE_TIMESTAMP")
-    }
-
-    @SuppressLint("NewApi") // checked with feature availability check
-    @Test
-    fun toPlatformMedicalDataSource_expectCorrectConversion() {
-        val medicalDataSource =
-            MedicalDataSource(
-                id = ID,
-                packageName = PACKAGE_NAME,
-                fhirBaseUri = FHIR_BASE_URI,
-                displayName = DISPLAY_NAME,
-                fhirVersion = FHIR_VERSION,
-                lastDataUpdateTime = LAST_UPDATED_TIME
-            )
-
-        val platformMedicalDataSource = medicalDataSource.platformMedicalDataSource
-
-        assertThat(platformMedicalDataSource)
-            .isEqualTo(
-                PlatformMedicalDataSourceBuilder(
-                        ID,
-                        PACKAGE_NAME,
-                        FHIR_BASE_URI,
-                        DISPLAY_NAME,
-                        FHIR_VERSION.platformFhirVersion
-                    )
-                    .setLastDataUpdateTime(LAST_UPDATED_TIME)
-                    .build()
-            )
-    }
-
-    companion object {
-        private const val ID = "testid"
-        private const val PACKAGE_NAME = "androidx.health.connect.client"
-        private const val DISPLAY_NAME = "Test Data Source"
-        private const val LAST_DATA_UPDATE_TIMESTAMP = "2025-01-27T08:55:29.550677Z"
-        private val FHIR_BASE_URI = Uri.parse("https://fhir.com/oauth/api/FHIR/R4/")
-        private val LAST_UPDATED_TIME = Instant.parse(LAST_DATA_UPDATE_TIMESTAMP)
-        private val FHIR_VERSION: FhirVersion by lazy { FhirVersion(4, 0, 1) }
-    }
-}
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/records/MedicalResourceIdTest.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/records/MedicalResourceIdTest.kt
deleted file mode 100644
index 8cd022c..0000000
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/records/MedicalResourceIdTest.kt
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.platform.records
-
-import android.annotation.SuppressLint
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.isPersonalHealthRecordFeatureAvailableInPlatform
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_IMMUNIZATION
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_PATIENT
-import androidx.health.connect.client.records.MedicalResourceId
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.google.common.testing.EqualsTester
-import com.google.common.truth.Truth.assertThat
-import org.junit.Assume
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class MedicalResourceIdTest {
-    @Before
-    fun setup() {
-        Assume.assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-    }
-
-    @Test
-    fun validMedicalResourceId_equals() {
-        EqualsTester()
-            .addEqualityGroup(
-                MedicalResourceId(
-                    MEDICAL_DATA_SOURCE_ID_STRING,
-                    FHIR_RESOURCE_TYPE_PATIENT,
-                    "fhir_rs_id_1"
-                ),
-                MedicalResourceId(
-                    MEDICAL_DATA_SOURCE_ID_STRING,
-                    FHIR_RESOURCE_TYPE_PATIENT,
-                    "fhir_rs_id_1"
-                )
-            )
-            .addEqualityGroup(
-                MedicalResourceId(
-                    MEDICAL_DATA_SOURCE_ID_STRING,
-                    FHIR_RESOURCE_TYPE_PATIENT,
-                    "fhir_rs_id_2"
-                )
-            )
-            .testEquals()
-    }
-
-    @Test
-    fun toString_expectCorrectString() {
-        val medicalResourceId =
-            MedicalResourceId(
-                MEDICAL_DATA_SOURCE_ID_STRING,
-                FHIR_RESOURCE_TYPE_PATIENT,
-                "fhir_rs_id_1"
-            )
-
-        val toString = medicalResourceId.toString()
-
-        assertThat(toString)
-            .contains(
-                "(dataSourceId=3008de9d-8c24-4591-b58c-43eaf30fa168, fhirResourceType=9, fhirResourceId=fhir_rs_id_1)"
-            )
-    }
-
-    @SuppressLint("NewApi") // checked with feature availability check
-    @Test
-    fun toPlatformMedicalResourceId_expectCorrectConversion() {
-        val sdk =
-            MedicalResourceId(
-                MEDICAL_DATA_SOURCE_ID_STRING,
-                FHIR_RESOURCE_TYPE_PATIENT,
-                "fhir_rs_id_1"
-            )
-
-        assertThat(sdk.platformMedicalResourceId)
-            .isEqualTo(
-                PlatformMedicalResourceId(
-                    MEDICAL_DATA_SOURCE_ID_STRING,
-                    FHIR_RESOURCE_TYPE_PATIENT,
-                    "fhir_rs_id_1"
-                )
-            )
-    }
-
-    @Test
-    fun fromFhirReference_validReference() {
-        val medicalResourceId =
-            MedicalResourceId.fromFhirReference(
-                MEDICAL_DATA_SOURCE_ID_STRING,
-                "Immunization/034-AB16.0"
-            )
-
-        assertThat(medicalResourceId)
-            .isEqualTo(
-                MedicalResourceId(
-                    MEDICAL_DATA_SOURCE_ID_STRING,
-                    FHIR_RESOURCE_TYPE_IMMUNIZATION,
-                    "034-AB16.0"
-                )
-            )
-    }
-
-    companion object {
-        private const val MEDICAL_DATA_SOURCE_ID_STRING = "3008de9d-8c24-4591-b58c-43eaf30fa168"
-    }
-}
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/records/MedicalResourceTest.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/records/MedicalResourceTest.kt
deleted file mode 100644
index 079afb4..0000000
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/records/MedicalResourceTest.kt
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.platform.records
-
-import android.annotation.SuppressLint
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.isPersonalHealthRecordFeatureAvailableInPlatform
-import androidx.health.connect.client.records.FhirResource
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_PATIENT
-import androidx.health.connect.client.records.FhirVersion
-import androidx.health.connect.client.records.MedicalResource
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_MEDICATIONS
-import androidx.health.connect.client.records.MedicalResourceId
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.google.common.testing.EqualsTester
-import com.google.common.truth.Truth.assertThat
-import org.junit.Assume
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@ExperimentalPersonalHealthRecordApi
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class MedicalResourceTest {
-    @Before
-    fun setup() {
-        Assume.assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-    }
-
-    @Test
-    fun validMedicalResource_equals() {
-        EqualsTester()
-            .addEqualityGroup(
-                MedicalResource(
-                    MEDICAL_RESOURCE_TYPE_MEDICATIONS,
-                    MEDICAL_RESOURCE_ID,
-                    MEDICAL_DATA_SOURCE_ID_STRING,
-                    FHIR_VERSION_4_0_1,
-                    FHIR_RESOURCE_EMPTY
-                ),
-                MedicalResource(
-                    MEDICAL_RESOURCE_TYPE_MEDICATIONS,
-                    MEDICAL_RESOURCE_ID,
-                    MEDICAL_DATA_SOURCE_ID_STRING,
-                    FHIR_VERSION_4_0_1,
-                    FHIR_RESOURCE_EMPTY
-                )
-            )
-            .addEqualityGroup(
-                MedicalResource(
-                    MEDICAL_RESOURCE_TYPE_MEDICATIONS,
-                    MEDICAL_RESOURCE_ID,
-                    MEDICAL_DATA_SOURCE_ID_STRING,
-                    FhirVersion.parseFhirVersion("4.3.0"),
-                    FHIR_RESOURCE_EMPTY
-                )
-            )
-            .testEquals()
-    }
-
-    @Test
-    fun toString_expectCorrectString() {
-        val medicalResource =
-            MedicalResource(
-                MEDICAL_RESOURCE_TYPE_MEDICATIONS,
-                MEDICAL_RESOURCE_ID,
-                MEDICAL_DATA_SOURCE_ID_STRING,
-                FHIR_VERSION_4_0_1,
-                FHIR_RESOURCE_EMPTY
-            )
-
-        val toString = medicalResource.toString()
-
-        assertThat(toString).contains("type=9")
-        assertThat(toString).contains("dataSourceId=3008de9d-8c24-4591-b58c-43eaf30fa168")
-        assertThat(toString).contains("fhirVersion=FhirVersion")
-        assertThat(toString).contains("(4.0.1)")
-        assertThat(toString).contains("fhirResource=FhirResource")
-        assertThat(toString).contains("(type=9, id=id1, data={})")
-    }
-
-    @SuppressLint("NewApi") // checked with feature availability check
-    @Test
-    fun toPlatformMedicalResource_expectCorrectConversion() {
-        val sdk =
-            MedicalResource(
-                MEDICAL_RESOURCE_TYPE_MEDICATIONS,
-                MEDICAL_RESOURCE_ID,
-                MEDICAL_DATA_SOURCE_ID_STRING,
-                FHIR_VERSION_4_0_1,
-                FHIR_RESOURCE_EMPTY
-            )
-
-        val platform = sdk.platformMedicalResource
-
-        assertThat(platform)
-            .isEqualTo(
-                PlatformMedicalResourceBuilder(
-                        PlatformMedicalResource.MEDICAL_RESOURCE_TYPE_MEDICATIONS,
-                        MEDICAL_DATA_SOURCE_ID_STRING,
-                        FHIR_VERSION_4_0_1.platformFhirVersion,
-                        FHIR_RESOURCE_EMPTY.platformFhirResource
-                    )
-                    .build()
-            )
-    }
-
-    companion object {
-        private const val MEDICAL_DATA_SOURCE_ID_STRING = "3008de9d-8c24-4591-b58c-43eaf30fa168"
-        private val MEDICAL_RESOURCE_ID by lazy {
-            // lazy is needed, otherwise a MedicalResourceId would be constructed before the
-            // assumeTrue in setUp() is called. Same goes for other fields in this companion object.
-            MedicalResourceId(
-                MEDICAL_DATA_SOURCE_ID_STRING,
-                FHIR_RESOURCE_TYPE_PATIENT,
-                "fhir_rs_id"
-            )
-        }
-        private val FHIR_VERSION_4_0_1 by lazy { FhirVersion.Companion.parseFhirVersion("4.0.1") }
-        private val FHIR_RESOURCE_EMPTY by lazy {
-            FhirResource(FHIR_RESOURCE_TYPE_PATIENT, "id1", "{}")
-        }
-    }
-}
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/CreateMedicalDataSourceRequestTest.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/CreateMedicalDataSourceRequestTest.kt
deleted file mode 100644
index 65a8f8e..0000000
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/CreateMedicalDataSourceRequestTest.kt
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.platform.requests
-
-import android.annotation.SuppressLint
-import android.net.Uri
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.isPersonalHealthRecordFeatureAvailableInPlatform
-import androidx.health.connect.client.impl.platform.request.PlatformCreateMedicalDataSourceRequestBuilder
-import androidx.health.connect.client.records.FhirVersion
-import androidx.health.connect.client.request.CreateMedicalDataSourceRequest
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.google.common.testing.EqualsTester
-import com.google.common.truth.Truth.assertThat
-import org.junit.Assume
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@ExperimentalPersonalHealthRecordApi
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class CreateMedicalDataSourceRequestTest {
-
-    @Before
-    fun setup() {
-        Assume.assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-    }
-
-    @Test
-    fun validCreateMedicalDataSourceRequest_equals() {
-        EqualsTester()
-            .addEqualityGroup(
-                CreateMedicalDataSourceRequest(
-                    fhirBaseUri = FHIR_BASE_URI,
-                    displayName = DISPLAY_NAME,
-                    fhirVersion = FHIR_VERSION,
-                ),
-                CreateMedicalDataSourceRequest(
-                    fhirBaseUri = FHIR_BASE_URI,
-                    displayName = DISPLAY_NAME,
-                    fhirVersion = FHIR_VERSION,
-                )
-            )
-            .addEqualityGroup(
-                CreateMedicalDataSourceRequest(
-                    fhirBaseUri = FHIR_BASE_URI.buildUpon().appendPath("2/").build(),
-                    displayName = DISPLAY_NAME,
-                    fhirVersion = FHIR_VERSION,
-                )
-            )
-            .addEqualityGroup(
-                CreateMedicalDataSourceRequest(
-                    fhirBaseUri = FHIR_BASE_URI,
-                    displayName = "$DISPLAY_NAME Two",
-                    fhirVersion = FHIR_VERSION,
-                )
-            )
-            .addEqualityGroup(
-                CreateMedicalDataSourceRequest(
-                    fhirBaseUri = FHIR_BASE_URI,
-                    displayName = DISPLAY_NAME,
-                    fhirVersion = FhirVersion(4, 3, 0),
-                )
-            )
-            .testEquals()
-    }
-
-    @Test
-    fun toString_expectCorrectString() {
-        val createMedicalDataSourceRequest =
-            CreateMedicalDataSourceRequest(
-                fhirBaseUri = FHIR_BASE_URI,
-                displayName = DISPLAY_NAME,
-                fhirVersion = FHIR_VERSION,
-            )
-
-        val toString = createMedicalDataSourceRequest.toString()
-
-        assertThat(toString).contains("fhirBaseUri=https://fhir.com/oauth/api/FHIR/R4/")
-        assertThat(toString).contains("displayName=Test Data Source")
-        assertThat(toString).contains("fhirVersion=FhirVersion")
-        assertThat(toString).contains("(4.0.1)")
-    }
-
-    @SuppressLint("NewApi") // checked with feature availability check
-    @Test
-    fun toPlatformCreateMedicalDataSourceRequest_expectCorrectConversion() {
-        val createMedicalDataSourceRequest =
-            CreateMedicalDataSourceRequest(
-                fhirBaseUri = FHIR_BASE_URI,
-                displayName = DISPLAY_NAME,
-                fhirVersion = FHIR_VERSION,
-            )
-
-        val platformCreateMedicalDataSourceRequest =
-            createMedicalDataSourceRequest.platformCreateMedicalDataSourceRequest
-
-        assertThat(platformCreateMedicalDataSourceRequest)
-            .isEqualTo(
-                PlatformCreateMedicalDataSourceRequestBuilder(
-                        FHIR_BASE_URI,
-                        DISPLAY_NAME,
-                        FHIR_VERSION.platformFhirVersion,
-                    )
-                    .build()
-            )
-    }
-
-    companion object {
-        private const val DISPLAY_NAME = "Test Data Source"
-        private val FHIR_BASE_URI = Uri.parse("https://fhir.com/oauth/api/FHIR/R4/")
-        private val FHIR_VERSION: FhirVersion by lazy { FhirVersion(4, 0, 1) }
-    }
-}
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/DeleteMedicalResourcesRequestTest.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/DeleteMedicalResourcesRequestTest.kt
deleted file mode 100644
index 88058be..0000000
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/DeleteMedicalResourcesRequestTest.kt
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.platform.requests
-
-import android.annotation.SuppressLint
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.isPersonalHealthRecordFeatureAvailableInPlatform
-import androidx.health.connect.client.impl.platform.request.PlatformDeleteMedicalResourcesRequestBuilder
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_CONDITIONS
-import androidx.health.connect.client.request.DeleteMedicalResourcesRequest
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.google.common.testing.EqualsTester
-import com.google.common.truth.Truth.assertThat
-import org.junit.Assert.assertThrows
-import org.junit.Assume
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class DeleteMedicalResourcesRequestTest {
-
-    @Before
-    fun setup() {
-        Assume.assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-    }
-
-    @Test
-    fun validDeleteMedicalResourcesRequest_equals() {
-        EqualsTester()
-            .addEqualityGroup(
-                DeleteMedicalResourcesRequest(
-                    dataSourceIds = TEST_DATA_SOURCE_IDS,
-                    medicalResourceTypes = TEST_MEDICAL_RESOURCE_TYPES
-                ),
-                DeleteMedicalResourcesRequest(
-                    dataSourceIds = TEST_DATA_SOURCE_IDS,
-                    medicalResourceTypes = TEST_MEDICAL_RESOURCE_TYPES
-                )
-            )
-            .addEqualityGroup(DeleteMedicalResourcesRequest(dataSourceIds = TEST_DATA_SOURCE_IDS_2))
-            .addEqualityGroup(
-                DeleteMedicalResourcesRequest(
-                    medicalResourceTypes =
-                        TEST_MEDICAL_RESOURCE_TYPES + MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES
-                )
-            )
-            .addEqualityGroup(
-                DeleteMedicalResourcesRequest(
-                    medicalResourceTypes = setOf(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
-                )
-            )
-            .testEquals()
-    }
-
-    @Test
-    fun toString_expectCorrectString() {
-        val deleteMedicalResourcesRequest =
-            DeleteMedicalResourcesRequest(
-                dataSourceIds = TEST_DATA_SOURCE_IDS,
-                medicalResourceTypes = TEST_MEDICAL_RESOURCE_TYPES
-            )
-
-        val toString = deleteMedicalResourcesRequest.toString()
-
-        assertThat(toString).contains("dataSourceIds=$TEST_DATA_SOURCE_IDS")
-        assertThat(toString).contains("medicalResourceTypes=$TEST_MEDICAL_RESOURCE_TYPES")
-    }
-
-    @Test
-    fun invalidRequest_throwsException() {
-        assertThrows(IllegalArgumentException::class.java) {
-            DeleteMedicalResourcesRequest(emptySet(), emptySet())
-        }
-    }
-
-    @SuppressLint("NewApi") // checked with feature availability check
-    @Test
-    fun toPlatformDeleteMedicalResourcesRequest_expectCorrectConversion() {
-        val deleteMedicalResourcesRequest =
-            DeleteMedicalResourcesRequest(
-                dataSourceIds = TEST_DATA_SOURCE_IDS,
-                medicalResourceTypes = TEST_MEDICAL_RESOURCE_TYPES
-            )
-
-        val platformDeleteMedicalResourcesRequest =
-            deleteMedicalResourcesRequest.platformReadMedicalResourcesRequest
-
-        assertThat(platformDeleteMedicalResourcesRequest)
-            .isEqualTo(
-                PlatformDeleteMedicalResourcesRequestBuilder()
-                    .apply { TEST_DATA_SOURCE_IDS.forEach { addDataSourceId(it) } }
-                    .apply { TEST_MEDICAL_RESOURCE_TYPES.forEach { addMedicalResourceType(it) } }
-                    .build()
-            )
-    }
-
-    companion object {
-        private val TEST_DATA_SOURCE_IDS = setOf("3008de9d-8c24-4591-b58c-43eaf30fa168")
-        private val TEST_DATA_SOURCE_IDS_2 = setOf("ca761232-ed42-11ce-bacd-00aa0057b223")
-        private val TEST_MEDICAL_RESOURCE_TYPES = setOf(MEDICAL_RESOURCE_TYPE_CONDITIONS)
-    }
-}
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/GetMedicalDataSourcesRequestTest.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/GetMedicalDataSourcesRequestTest.kt
deleted file mode 100644
index d8f4545..0000000
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/GetMedicalDataSourcesRequestTest.kt
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.platform.requests
-
-import android.annotation.SuppressLint
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.isPersonalHealthRecordFeatureAvailableInPlatform
-import androidx.health.connect.client.impl.platform.request.PlatformGetMedicalDataSourcesRequestBuilder
-import androidx.health.connect.client.request.GetMedicalDataSourcesRequest
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.google.common.testing.EqualsTester
-import com.google.common.truth.Truth.assertThat
-import org.junit.Assume
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@ExperimentalPersonalHealthRecordApi
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class GetMedicalDataSourcesRequestTest {
-
-    @Before
-    fun setup() {
-        Assume.assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-    }
-
-    @Test
-    fun validGetMedicalDataSourcesRequest_equals() {
-        EqualsTester()
-            .addEqualityGroup(
-                GetMedicalDataSourcesRequest(
-                    packageNames = TEST_PACKAGE_NAMES,
-                ),
-                GetMedicalDataSourcesRequest(
-                    packageNames = TEST_PACKAGE_NAMES,
-                )
-            )
-            .addEqualityGroup(
-                GetMedicalDataSourcesRequest(
-                    packageNames = TEST_PACKAGE_NAMES + (TEST_PACKAGE_NAMES.first() + "two"),
-                )
-            )
-            .testEquals()
-    }
-
-    @Test
-    fun toString_expectCorrectString() {
-        val getMedicalDataSourcesRequest =
-            GetMedicalDataSourcesRequest(
-                packageNames = TEST_PACKAGE_NAMES,
-            )
-
-        val toString = getMedicalDataSourcesRequest.toString()
-
-        assertThat(toString).contains("packageNames=[androidx.health.connect]")
-    }
-
-    @SuppressLint("NewApi") // checked with feature availability check
-    @Test
-    fun toPlatformGetMedicalDataSourcesRequest_expectCorrectConversion() {
-        val getMedicalDataSourcesRequest =
-            GetMedicalDataSourcesRequest(packageNames = TEST_PACKAGE_NAMES)
-
-        val platformGetMedicalDataSourcesRequest =
-            getMedicalDataSourcesRequest.platformGetMedicalDataSourcesRequest
-
-        assertThat(platformGetMedicalDataSourcesRequest)
-            .isEqualTo(
-                PlatformGetMedicalDataSourcesRequestBuilder()
-                    .apply { TEST_PACKAGE_NAMES.forEach { addPackageName(it) } }
-                    .build()
-            )
-    }
-
-    companion object {
-        private val TEST_PACKAGE_NAMES = listOf("androidx.health.connect")
-    }
-}
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/ReadMedicalResourcesInitialRequestTest.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/ReadMedicalResourcesInitialRequestTest.kt
deleted file mode 100644
index 1ede59f..0000000
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/ReadMedicalResourcesInitialRequestTest.kt
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.platform.requests
-
-import android.annotation.SuppressLint
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.isPersonalHealthRecordFeatureAvailableInPlatform
-import androidx.health.connect.client.impl.platform.request.PlatformReadMedicalResourcesInitialRequestBuilder
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_CONDITIONS
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_VITAL_SIGNS
-import androidx.health.connect.client.request.ReadMedicalResourcesInitialRequest
-import androidx.health.connect.client.request.ReadMedicalResourcesRequest.Companion.DEFAULT_PAGE_SIZE
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.google.common.testing.EqualsTester
-import com.google.common.truth.Truth.assertThat
-import org.junit.Assert.assertThrows
-import org.junit.Assume
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class ReadMedicalResourcesInitialRequestTest {
-    @Before
-    fun setup() {
-        Assume.assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-    }
-
-    @Test
-    fun equalsTests() {
-        EqualsTester()
-            .addEqualityGroup(
-                ReadMedicalResourcesInitialRequest(
-                    MEDICAL_RESOURCE_TYPE_CONDITIONS,
-                    MEDICAL_DATA_SOURCE_IDS_1,
-                    DEFAULT_PAGE_SIZE
-                ),
-                ReadMedicalResourcesInitialRequest(
-                    MEDICAL_RESOURCE_TYPE_CONDITIONS,
-                    MEDICAL_DATA_SOURCE_IDS_1,
-                    DEFAULT_PAGE_SIZE
-                ),
-                ReadMedicalResourcesInitialRequest(
-                    MEDICAL_RESOURCE_TYPE_CONDITIONS,
-                    MEDICAL_DATA_SOURCE_IDS_1
-                    // page size is not specified, DEFAULT_PAGE_SIZE should be used, hence it should
-                    // be equal to others in this group
-                )
-            )
-            .addEqualityGroup(
-                ReadMedicalResourcesInitialRequest(
-                    MEDICAL_RESOURCE_TYPE_VITAL_SIGNS, // different type
-                    MEDICAL_DATA_SOURCE_IDS_1,
-                    DEFAULT_PAGE_SIZE
-                )
-            )
-            .addEqualityGroup(
-                ReadMedicalResourcesInitialRequest(
-                    MEDICAL_RESOURCE_TYPE_CONDITIONS,
-                    MEDICAL_DATA_SOURCE_IDS_2, // different data source
-                    DEFAULT_PAGE_SIZE
-                )
-            )
-            .addEqualityGroup(
-                ReadMedicalResourcesInitialRequest(
-                    MEDICAL_RESOURCE_TYPE_CONDITIONS,
-                    MEDICAL_DATA_SOURCE_IDS_1,
-                    DEFAULT_PAGE_SIZE + 1 // different page size
-                )
-            )
-            .testEquals()
-    }
-
-    @Test
-    fun invalidMedicalResourceType_throwsException() {
-        assertThrows(IllegalArgumentException::class.java) {
-            ReadMedicalResourcesInitialRequest(
-                -1, // Invalid medical resource type
-                MEDICAL_DATA_SOURCE_IDS_1,
-                DEFAULT_PAGE_SIZE
-            )
-        }
-    }
-
-    @Test
-    fun toString_expectCorrectString() {
-        val request =
-            ReadMedicalResourcesInitialRequest(
-                MEDICAL_RESOURCE_TYPE_CONDITIONS,
-                MEDICAL_DATA_SOURCE_IDS_1,
-                DEFAULT_PAGE_SIZE
-            )
-
-        val toString = request.toString()
-
-        assertThat(toString).contains("medicalResourceType=$MEDICAL_RESOURCE_TYPE_CONDITIONS")
-        assertThat(toString).contains("medicalDataSourceIds=$MEDICAL_DATA_SOURCE_IDS_1")
-        assertThat(toString).contains("pageSize=$DEFAULT_PAGE_SIZE")
-    }
-
-    @SuppressLint("NewApi") // checked with feature availability check
-    @Test
-    fun toPlatformRequest_expectCorrectConversion() {
-        val sdkRequest =
-            ReadMedicalResourcesInitialRequest(
-                MEDICAL_RESOURCE_TYPE_CONDITIONS,
-                MEDICAL_DATA_SOURCE_IDS_1,
-                DEFAULT_PAGE_SIZE
-            )
-
-        assertThat(sdkRequest.platformReadMedicalResourcesRequest)
-            .isEqualTo(
-                PlatformReadMedicalResourcesInitialRequestBuilder(
-                        android.health.connect.datatypes.MedicalResource
-                            .MEDICAL_RESOURCE_TYPE_CONDITIONS
-                    )
-                    .addDataSourceIds(MEDICAL_DATA_SOURCE_IDS_1)
-                    .setPageSize(DEFAULT_PAGE_SIZE)
-                    .build()
-            )
-    }
-
-    companion object {
-        private val MEDICAL_DATA_SOURCE_IDS_1 = setOf("3008de9d-8c24-4591-b58c-43eaf30fa168")
-        private val MEDICAL_DATA_SOURCE_IDS_2 = setOf("ca761232-ed42-11ce-bacd-00aa0057b223")
-    }
-}
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/ReadMedicalResourcesPageRequestTest.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/ReadMedicalResourcesPageRequestTest.kt
deleted file mode 100644
index e0101e1..0000000
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/ReadMedicalResourcesPageRequestTest.kt
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.platform.requests
-
-import android.annotation.SuppressLint
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.isPersonalHealthRecordFeatureAvailableInPlatform
-import androidx.health.connect.client.impl.platform.request.PlatformReadMedicalResourcesPageRequestBuilder
-import androidx.health.connect.client.request.ReadMedicalResourcesPageRequest
-import androidx.health.connect.client.request.ReadMedicalResourcesRequest.Companion.DEFAULT_PAGE_SIZE
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.google.common.testing.EqualsTester
-import com.google.common.truth.Truth.assertThat
-import org.junit.Assume
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class ReadMedicalResourcesPageRequestTest {
-
-    @Before
-    fun setup() {
-        Assume.assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-    }
-
-    @Test
-    fun equalsTests() {
-        EqualsTester()
-            .addEqualityGroup(
-                ReadMedicalResourcesPageRequest(PAGE_TOKEN, DEFAULT_PAGE_SIZE),
-                ReadMedicalResourcesPageRequest(PAGE_TOKEN, DEFAULT_PAGE_SIZE),
-                // page size is not specified, DEFAULT_PAGE_SIZE should be used, hence it should
-                // be equal to others in this group
-                ReadMedicalResourcesPageRequest(PAGE_TOKEN)
-            )
-            .addEqualityGroup(
-                ReadMedicalResourcesPageRequest("$PAGE_TOKEN-diff", DEFAULT_PAGE_SIZE)
-            )
-            .testEquals()
-    }
-
-    @Test
-    fun toString_expectCorrectString() {
-        val request = ReadMedicalResourcesPageRequest(PAGE_TOKEN, DEFAULT_PAGE_SIZE)
-
-        val toString = request.toString()
-
-        assertThat(toString).contains("pageToken=$PAGE_TOKEN")
-        assertThat(toString).contains("pageSize=$DEFAULT_PAGE_SIZE")
-    }
-
-    @SuppressLint("NewApi") // checked with feature availability check
-    @Test
-    fun toPlatformRequest_expectCorrectConversion() {
-        val sdkRequest = ReadMedicalResourcesPageRequest(PAGE_TOKEN, DEFAULT_PAGE_SIZE)
-
-        assertThat(sdkRequest.platformReadMedicalResourcesRequest)
-            .isEqualTo(
-                PlatformReadMedicalResourcesPageRequestBuilder(PAGE_TOKEN)
-                    .setPageSize(DEFAULT_PAGE_SIZE)
-                    .build()
-            )
-    }
-
-    companion object {
-        private const val PAGE_TOKEN = "pageToken"
-    }
-}
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/UpsertMedicalResourceRequestTest.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/UpsertMedicalResourceRequestTest.kt
deleted file mode 100644
index 892a209..0000000
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/requests/UpsertMedicalResourceRequestTest.kt
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.platform.requests
-
-import android.annotation.SuppressLint
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.isPersonalHealthRecordFeatureAvailableInPlatform
-import androidx.health.connect.client.impl.platform.request.PlatformUpsertMedicalResourceRequestBuilder
-import androidx.health.connect.client.records.FhirVersion
-import androidx.health.connect.client.request.UpsertMedicalResourceRequest
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.google.common.testing.EqualsTester
-import com.google.common.truth.Truth.assertThat
-import org.junit.Assume
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@ExperimentalPersonalHealthRecordApi
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class UpsertMedicalResourceRequestTest {
-    @Before
-    fun setup() {
-        Assume.assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-    }
-
-    @Test
-    fun equalsTests() {
-        EqualsTester()
-            .addEqualityGroup(
-                UpsertMedicalResourceRequest(
-                    MEDICAL_DATA_SOURCE_ID_STRING,
-                    FHIR_VERSION_4_0_1,
-                    DATA_JSON
-                ),
-                UpsertMedicalResourceRequest(
-                    MEDICAL_DATA_SOURCE_ID_STRING,
-                    FHIR_VERSION_4_0_1,
-                    DATA_JSON
-                ),
-            )
-            .addEqualityGroup(
-                UpsertMedicalResourceRequest(
-                    MEDICAL_DATA_SOURCE_ID_STRING,
-                    FHIR_VERSION_4_3_0,
-                    DATA_JSON
-                ),
-            )
-            .testEquals()
-    }
-
-    @Test
-    fun toString_expectCorrectString() {
-        val upsertMedicalResourceRequest =
-            UpsertMedicalResourceRequest(
-                MEDICAL_DATA_SOURCE_ID_STRING,
-                FHIR_VERSION_4_0_1,
-                DATA_JSON
-            )
-
-        val toString = upsertMedicalResourceRequest.toString()
-
-        assertThat(toString).contains("dataSourceId=3008de9d-8c24-4591-b58c-43eaf30fa168")
-        assertThat(toString).contains("data={}")
-        assertThat(toString).contains("fhirVersion=FhirVersion")
-        assertThat(toString).contains("(4.0.1)")
-    }
-
-    @SuppressLint("NewApi") // checked with feature availability check
-    @Test
-    fun toPlatformUpsertMedicalResourceRequest_expectCorrectConversion() {
-        val sdk =
-            UpsertMedicalResourceRequest(
-                MEDICAL_DATA_SOURCE_ID_STRING,
-                FHIR_VERSION_4_0_1,
-                DATA_JSON
-            )
-
-        assertThat(sdk.platformUpsertMedicalResourceRequest)
-            .isEqualTo(
-                PlatformUpsertMedicalResourceRequestBuilder(
-                        MEDICAL_DATA_SOURCE_ID_STRING,
-                        FHIR_VERSION_4_0_1.platformFhirVersion,
-                        DATA_JSON
-                    )
-                    .build()
-            )
-    }
-
-    companion object {
-        private const val MEDICAL_DATA_SOURCE_ID_STRING = "3008de9d-8c24-4591-b58c-43eaf30fa168"
-        private val FHIR_VERSION_4_0_1 by lazy { FhirVersion.Companion.parseFhirVersion("4.0.1") }
-        private val FHIR_VERSION_4_3_0 by lazy { FhirVersion.Companion.parseFhirVersion("4.3.0") }
-        private const val DATA_JSON = "{}"
-    }
-}
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/response/ReadMedicalResourcesResponseTest.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/response/ReadMedicalResourcesResponseTest.kt
deleted file mode 100644
index 6181fd0..0000000
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/platform/response/ReadMedicalResourcesResponseTest.kt
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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(ExperimentalPersonalHealthRecordApi::class)
-
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.isPersonalHealthRecordFeatureAvailableInPlatform
-import androidx.health.connect.client.records.FhirResource
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_IMMUNIZATION
-import androidx.health.connect.client.records.FhirVersion
-import androidx.health.connect.client.records.MedicalResource
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_VACCINES
-import androidx.health.connect.client.records.MedicalResourceId
-import androidx.health.connect.client.response.ReadMedicalResourcesResponse
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.google.common.testing.EqualsTester
-import com.google.common.truth.Truth.assertThat
-import org.junit.Assume
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class ReadMedicalResourcesResponseTest {
-    @Before
-    fun setup() {
-        Assume.assumeTrue(
-            "FEATURE_PERSONAL_HEALTH_RECORD is not available on this device!",
-            isPersonalHealthRecordFeatureAvailableInPlatform()
-        )
-    }
-
-    @Test
-    fun equalsTests() {
-        val medicalResources = listOf(MEDICAL_RESOURCE)
-        EqualsTester()
-            .addEqualityGroup(
-                ReadMedicalResourcesResponse(
-                    listOf(MEDICAL_RESOURCE),
-                    NEXT_PAGE_TOKEN,
-                    REMAINING_COUNT
-                ),
-                ReadMedicalResourcesResponse(
-                    listOf(MEDICAL_RESOURCE),
-                    NEXT_PAGE_TOKEN,
-                    REMAINING_COUNT
-                ),
-            )
-            .addEqualityGroup(
-                // different MedicalResource list
-                ReadMedicalResourcesResponse(
-                    listOf(MEDICAL_RESOURCE, MEDICAL_RESOURCE),
-                    NEXT_PAGE_TOKEN,
-                    REMAINING_COUNT
-                ),
-            )
-            .addEqualityGroup(
-                // different next page token
-                ReadMedicalResourcesResponse(
-                    listOf(MEDICAL_RESOURCE),
-                    NEXT_PAGE_TOKEN + "diff",
-                    REMAINING_COUNT
-                )
-            )
-            .addEqualityGroup(
-                // different remainingCount
-                ReadMedicalResourcesResponse(medicalResources, NEXT_PAGE_TOKEN, REMAINING_COUNT + 1)
-            )
-            .testEquals()
-    }
-
-    @Test
-    fun toString_expectCorrectString() {
-        val medicalResources = listOf(MEDICAL_RESOURCE)
-        val response =
-            ReadMedicalResourcesResponse(medicalResources, NEXT_PAGE_TOKEN, REMAINING_COUNT)
-
-        val toString = response.toString()
-
-        assertThat(toString).contains("ReadMedicalResourcesResponse")
-        assertThat(toString).contains("medicalResources=$medicalResources")
-        assertThat(toString).contains("nextPageToken=$NEXT_PAGE_TOKEN")
-        assertThat(toString).contains("remainingCount=$REMAINING_COUNT")
-    }
-
-    companion object {
-        private const val MEDICAL_DATA_SOURCE_ID_STRING = "3008de9d-8c24-4591-b58c-43eaf30fa168"
-        private val MEDICAL_RESOURCE_ID by lazy {
-            // lazy is needed, otherwise a MedicalResourceId would be constructed before the
-            // assumeTrue in setUp() is called. Same goes for other fields in this companion object.
-            MedicalResourceId(
-                MEDICAL_DATA_SOURCE_ID_STRING,
-                FHIR_RESOURCE_TYPE_IMMUNIZATION,
-                "fhir_rs_id"
-            )
-        }
-        private val FHIR_VERSION_4_0_1 by lazy { FhirVersion.Companion.parseFhirVersion("4.0.1") }
-        private val FHIR_RESOURCE_EMPTY by lazy {
-            FhirResource(FHIR_RESOURCE_TYPE_IMMUNIZATION, MEDICAL_RESOURCE_ID.fhirResourceId, "{}")
-        }
-        private val MEDICAL_RESOURCE by lazy {
-            MedicalResource(
-                MEDICAL_RESOURCE_TYPE_VACCINES,
-                MEDICAL_RESOURCE_ID,
-                MEDICAL_DATA_SOURCE_ID_STRING,
-                FHIR_VERSION_4_0_1,
-                FHIR_RESOURCE_EMPTY
-            )
-        }
-        private const val NEXT_PAGE_TOKEN = "nextPageToken"
-        private const val REMAINING_COUNT = 1000
-    }
-}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt
index a34bdda4..5bf5495 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt
@@ -23,49 +23,24 @@
 import android.os.UserManager
 import androidx.annotation.IntDef
 import androidx.annotation.RequiresApi
-import androidx.annotation.RequiresPermission
 import androidx.annotation.RestrictTo
 import androidx.core.content.pm.PackageInfoCompat
-import androidx.health.connect.client.HealthConnectClient.Companion.SDK_AVAILABLE
-import androidx.health.connect.client.HealthConnectClient.Companion.SDK_UNAVAILABLE
-import androidx.health.connect.client.HealthConnectClient.Companion.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED
-import androidx.health.connect.client.HealthConnectClient.Companion.getOrCreate
-import androidx.health.connect.client.HealthConnectClient.Companion.getSdkStatus
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_PERSONAL_HEALTH_RECORD
 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.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.FEATURE_CONSTANT_NAME_PHR
 import androidx.health.connect.client.feature.HealthConnectFeaturesUnavailableImpl
-import androidx.health.connect.client.feature.createExceptionDueToFeatureUnavailable
 import androidx.health.connect.client.impl.HealthConnectClientImpl
 import androidx.health.connect.client.impl.HealthConnectClientUpsideDownImpl
-import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND
-import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_VACCINES
-import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_WRITE_MEDICAL_DATA
-import androidx.health.connect.client.records.FhirResource
-import androidx.health.connect.client.records.MedicalDataSource
-import androidx.health.connect.client.records.MedicalResource
-import androidx.health.connect.client.records.MedicalResourceId
 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.CreateMedicalDataSourceRequest
-import androidx.health.connect.client.request.DeleteMedicalResourcesRequest
-import androidx.health.connect.client.request.GetMedicalDataSourcesRequest
-import androidx.health.connect.client.request.ReadMedicalResourcesInitialRequest
-import androidx.health.connect.client.request.ReadMedicalResourcesPageRequest
-import androidx.health.connect.client.request.ReadMedicalResourcesRequest
 import androidx.health.connect.client.request.ReadRecordsRequest
-import androidx.health.connect.client.request.UpsertMedicalResourceRequest
 import androidx.health.connect.client.response.ChangesResponse
 import androidx.health.connect.client.response.InsertRecordsResponse
-import androidx.health.connect.client.response.ReadMedicalResourcesResponse
 import androidx.health.connect.client.response.ReadRecordResponse
 import androidx.health.connect.client.response.ReadRecordsResponse
 import androidx.health.connect.client.time.TimeRangeFilter
@@ -297,12 +272,12 @@
     suspend fun getChangesToken(request: ChangesTokenRequest): String
 
     /**
-     * Retrieves changes in Health Connect, from a specific point in time represented by provided
-     * [changesToken].
+     * 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 Health
-     * Connect with updated [ChangesResponse.nextChangesToken].
+     * [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
@@ -326,399 +301,6 @@
      */
     suspend fun getChanges(changesToken: String): ChangesResponse
 
-    /**
-     * Inserts or updates a list of [MedicalResource]s using [UpsertMedicalResourceRequest]s.
-     *
-     * In each request, from [UpsertMedicalResourceRequest.dataSourceId], fhir resource type and
-     * fhir resource ID extracted from [UpsertMedicalResourceRequest.data], a [MedicalResourceId]
-     * will be constructed. If there already exists a [MedicalResource] with that ID in Health
-     * Connect, then it will be updated, otherwise a new [MedicalResource] will be inserted.
-     *
-     * For each [UpsertMedicalResourceRequest], one [MedicalResource] will be returned, regardless
-     * whether it's updated or inserted. The order of the [MedicalResource]s in the returned list
-     * will be the same as their corresponding [UpsertMedicalResourceRequest]s in the input list.
-     *
-     * Note that a [MedicalDataSource] needs to be created using [createMedicalDataSource] before
-     * any [MedicalResource]s can be upserted for this source.
-     *
-     * Regarding permissions:
-     * - Caller must hold [PERMISSION_WRITE_MEDICAL_DATA] in order to call this API, otherwise a
-     *   [SecurityException] will be thrown.
-     * - With [PERMISSION_WRITE_MEDICAL_DATA] granted, caller is permitted to call this API in
-     *   either foreground or background.
-     *
-     * Medical data is represented using the
-     * [Fast Healthcare Interoperability Resources (FHIR)]("https://hl7.org/fhir/") standard. The
-     * FHIR resource provided in [UpsertMedicalResourceRequest.data] is expected to be valid for the
-     * specified [FHIR version][UpsertMedicalResourceRequest.fhirVersion] according to the
-     * [FHIR spec](https://hl7.org/fhir/resourcelist.html). Structural validation checks such as
-     * resource structure, field types and presence of required fields will be performed, however
-     * these checks may not cover all FHIR spec requirements and are dependant on the backing
-     * implementation of Health Connect.
-     *
-     * Data written to Health Connect should be for a single individual only. However, the API
-     * allows for multiple Patient resources to be written to account for the possibility of
-     * multiple Patient resources being present in one individual's medical record.
-     *
-     * Each [UpsertMedicalResourceRequest] also has to meet the following requirements:
-     * - [UpsertMedicalResourceRequest.data] must contain an "id" field and a "resourceType" field.
-     *   The "resource type" must be one of the items in the accepted list of resource types in
-     *   [FhirResource].
-     * - The FHIR resource does not have a "contained" field (holds
-     *   [contained resources](https://build.fhir.org/references.html#contained)).
-     * - [FHIR version][UpsertMedicalResourceRequest.fhirVersion] of each request must match
-     *   [MedicalDataSource.fhirVersion] of [UpsertMedicalResourceRequest.dataSourceId]'s
-     *   corresponding [MedicalDataSource].
-     *
-     * If any request is failed to be processed for any reason, none of the requests will be
-     * inserted or updated in one transaction.
-     *
-     * This feature is dependent on the version of HealthConnect installed on the device. To check
-     * if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-     * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
-     * thrown if the feature is not available.
-     *
-     * @param requests List of upsert requests.
-     * @throws IllegalArgumentException if any request is failed to be processed for any reason such
-     *   as invalid [UpsertMedicalResourceRequest.dataSourceId]
-     * @throws SecurityException if caller does not hold [PERMISSION_WRITE_MEDICAL_DATA].
-     * @sample androidx.health.connect.client.samples.UpsertMedicalResourcesSample
-     */
-    @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA")
-    @ExperimentalPersonalHealthRecordApi
-    suspend fun upsertMedicalResources(
-        requests: List<UpsertMedicalResourceRequest>
-    ): List<MedicalResource> =
-        throw createExceptionDueToFeatureUnavailable(
-            FEATURE_CONSTANT_NAME_PHR,
-            "HealthConnectClient#upsetMedicalResources()"
-        )
-
-    /**
-     * Reads [MedicalResource]s by request, either [ReadMedicalResourcesInitialRequest] or
-     * [ReadMedicalResourcesPageRequest].
-     *
-     * A typical flow to read all [MedicalResource]s that satisfy a certain criteria would be:
-     * 1. Create a [ReadMedicalResourcesInitialRequest] with desired criteria, and make a request.
-     *    If successful, a [ReadMedicalResourcesResponse] should be returned.
-     * 2. Use returned [ReadMedicalResourcesResponse.nextPageToken] to create a
-     *    [ReadMedicalResourcesPageRequest] and make another request. Again, if successful, a
-     *    [ReadMedicalResourcesResponse] should be returned.
-     * 3. Repeat step 2 until [ReadMedicalResourcesResponse.nextPageToken] is null.
-     *
-     * Regarding permissions, only permitted [MedicalResource]s are returned. Specifically:
-     * - A caller without any read medical permissions such as
-     *   [PERMISSION_READ_MEDICAL_DATA_VACCINES], or the write medical permission
-     *   [PERMISSION_WRITE_MEDICAL_DATA] is not permitted to read any [MedicalResource], including
-     *   ones that it created.
-     * - A caller with the write permission is permitted to read its own [MedicalResource]s of any
-     *   type regardless whether it's in foreground or background.
-     * - A caller with only a read permission, when in background, is only permitted to read its own
-     *   [MedicalResource]s of the corresponding type. For example, if a caller only holds
-     *   [PERMISSION_READ_MEDICAL_DATA_VACCINES], then when in background it is only permitted to
-     *   read its own [MedicalResource]s with [MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES].
-     *   However, when it is in foreground or if it holds
-     *   [PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND], it is permitted to read all vaccines
-     *   [MedicalResource]s, including ones that were written by other apps.
-     *
-     * Each returned [MedicalResource] is not guaranteed to meet all requirements of the <a
-     * href="https://hl7.org/fhir/resourcelist.html">Fast Healthcare Interoperability Resources
-     * (FHIR) spec</a>. If required, clients should perform their own validations.
-     *
-     * This feature is dependent on the version of HealthConnect installed on the device. To check
-     * if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-     * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
-     * thrown if the feature is not available.
-     *
-     * @sample androidx.health.connect.client.samples.ReadMedicalResourcesByRequestSample
-     */
-    @ExperimentalPersonalHealthRecordApi
-    suspend fun readMedicalResources(
-        request: ReadMedicalResourcesRequest
-    ): ReadMedicalResourcesResponse =
-        throw createExceptionDueToFeatureUnavailable(
-            FEATURE_CONSTANT_NAME_PHR,
-            "HealthConnectClient#readMedicalResources(request: ReadMedicalResourcesRequest)"
-        )
-
-    /**
-     * Reads a collection of [MedicalResource]s given a list of [MedicalResourceId]s.
-     *
-     * The number and order of medical resources returned by this API is not guaranteed, depending
-     * on a number of factors:
-     * - If an empty list of IDs is provided, an empty list will be returned.
-     * - If any ID does not exist, no medical resource will be returned for that ID.
-     * - Only permitted [MedicalResource]s are returned. Specifically:
-     *     - A caller without any read medical permissions such as
-     *       [PERMISSION_READ_MEDICAL_DATA_VACCINES], or the write medical permission
-     *       [PERMISSION_WRITE_MEDICAL_DATA] is not permitted to read any [MedicalResource],
-     *       including ones that it created.
-     *     - A caller with the write permission is permitted to read its own [MedicalResource]s of
-     *       any type regardless whether it's in foreground or background.
-     *     - A caller with only a read permission, when in background, is only permitted to read its
-     *       own [MedicalResource]s of the corresponding type. For example, if a caller only holds
-     *       [PERMISSION_READ_MEDICAL_DATA_VACCINES], then when in background it is only permitted
-     *       to read its own [MedicalResource]s with
-     *       [MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES]. However, when it is in foreground or
-     *       if it holds [PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND], it is permitted to read all
-     *       vaccines [MedicalResource]s, including ones that were written by other apps.
-     *
-     * Each returned [MedicalResource] is not guaranteed to meet all requirements of the <a
-     * href="https://hl7.org/fhir/resourcelist.html">Fast Healthcare Interoperability Resources
-     * (FHIR) spec</a>. If required, clients should perform their own validations.
-     *
-     * This feature is dependent on the version of HealthConnect installed on the device. To check
-     * if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-     * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
-     * thrown if the feature is not available.
-     *
-     * @throws IllegalArgumentException if the size of [ids] is too large or any ID is deemed as
-     *   invalid.
-     * @sample androidx.health.connect.client.samples.ReadMedicalResourcesByIdsSample
-     */
-    @ExperimentalPersonalHealthRecordApi
-    suspend fun readMedicalResources(ids: List<MedicalResourceId>): List<MedicalResource> =
-        throw createExceptionDueToFeatureUnavailable(
-            FEATURE_CONSTANT_NAME_PHR,
-            "HealthConnectClient#readMedicalResources(ids: List<MedicalResourceId>)"
-        )
-
-    /**
-     * Deletes a list of [MedicalResource]s by the provided list of [MedicalResourceId]s.
-     * - If any ID in [ids] is invalid, the API will throw an [IllegalArgumentException], and
-     *   nothing will be deleted.
-     * - If any ID in [ids] does not exist, that ID will be ignored, while deletion on other IDs
-     *   will be performed.
-     *
-     * Regarding permissions:
-     * - Caller must hold [PERMISSION_WRITE_MEDICAL_DATA] in order to call this API, even then, it
-     *   can only delete its own data. If any of the items in [ids] belongs to another app, they
-     *   will be ignored.
-     * - Deletes are permitted in the foreground or background.
-     *
-     * This feature is dependent on the version of HealthConnect installed on the device. To check
-     * if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-     * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
-     * thrown if the feature is not available.
-     *
-     * @param ids The ids to delete.
-     * @throws SecurityException if caller does not hold [PERMISSION_WRITE_MEDICAL_DATA].
-     * @sample androidx.health.connect.client.samples.DeleteMedicalResourcesSample
-     */
-    @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA")
-    @ExperimentalPersonalHealthRecordApi
-    suspend fun deleteMedicalResources(ids: List<MedicalResourceId>): Unit =
-        throw createExceptionDueToFeatureUnavailable(
-            FEATURE_CONSTANT_NAME_PHR,
-            "HealthConnectClient#deleteMedicalResources(ids: List<MedicalResourceId>)"
-        )
-
-    /**
-     * Deletes [MedicalResource]s based on given filters in
-     * [request][DeleteMedicalResourcesRequest].
-     *
-     * Only [MedicalResource]s inserted by the calling app will be deleted. If the [request] matches
-     * any other [MedicalResource]s, these will be ignored.
-     *
-     * Regarding permissions:
-     * - Caller must hold [PERMISSION_WRITE_MEDICAL_DATA] in order to call this API.
-     * - Deletes are permitted in the foreground or background.
-     *
-     * This feature is dependent on the version of HealthConnect installed on the device. To check
-     * if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-     * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
-     * thrown if the feature is not available.
-     *
-     * @param request The request that contains the filters to delete.
-     * @throws SecurityException if caller does not hold [PERMISSION_WRITE_MEDICAL_DATA].
-     * @sample androidx.health.connect.client.samples.DeleteMedicalResourcesByRequestSample
-     */
-    @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA")
-    @ExperimentalPersonalHealthRecordApi
-    suspend fun deleteMedicalResources(request: DeleteMedicalResourcesRequest): Unit =
-        throw createExceptionDueToFeatureUnavailable(
-            FEATURE_CONSTANT_NAME_PHR,
-            "HealthConnectClient#deleteMedicalResources(request: DeleteMedicalResourcesRequest)"
-        )
-
-    /**
-     * Creates a [MedicalDataSource] using a [CreateMedicalDataSourceRequest].
-     *
-     * Regarding permissions:
-     * - Caller must hold [PERMISSION_WRITE_MEDICAL_DATA] in order to call this API, otherwise a
-     *   [SecurityException] will be thrown.
-     * - With [PERMISSION_WRITE_MEDICAL_DATA] granted, caller is permitted to call this API in
-     *   either foreground or background.
-     *
-     * Medical data is represented using the
-     * [Fast Healthcare Interoperability Resources (FHIR)](https://hl7.org/fhir/) standard.
-     *
-     * A [MedicalDataSource] needs to be created before any [MedicalResource]s for that source can
-     * be inserted. Separate [MedicalDataSource]s should be created for medical records coming from
-     * different sources (e.g. different FHIR endpoints, different healthcare systems), unless the
-     * data has been reconciled and all records have a unique combination of resource type and
-     * resource id.
-     *
-     * The [CreateMedicalDataSourceRequest.displayName] must be unique across all medical data
-     * sources created by an app, otherwise an [IllegalArgumentException] will be thrown. See
-     * [CreateMedicalDataSourceRequest.fhirBaseUri] for more details on the FHIR base URI. The data
-     * source can not be updated after creation.
-     *
-     * This feature is dependent on the version of HealthConnect installed on the device. To check
-     * if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-     * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
-     * thrown if the feature is not available.
-     *
-     * @param request request containing details of the [MedicalDataSource] to be created
-     * @return the created [MedicalDataSource]
-     * @throws [SecurityException] if caller does not hold [PERMISSION_WRITE_MEDICAL_DATA].
-     * @sample androidx.health.connect.client.samples.CreateMedicalDataSourceSample
-     */
-    @ExperimentalPersonalHealthRecordApi
-    @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA")
-    suspend fun createMedicalDataSource(
-        request: CreateMedicalDataSourceRequest
-    ): MedicalDataSource {
-        throw createExceptionDueToFeatureUnavailable(
-            FEATURE_CONSTANT_NAME_PHR,
-            "HealthConnectClient#createMedicalDataSource()"
-        )
-    }
-
-    /**
-     * Deletes a [MedicalDataSource] and all data contained within it.
-     *
-     * Regarding permissions:
-     * - Caller must hold [PERMISSION_WRITE_MEDICAL_DATA] in order to call this API, otherwise a
-     *   [SecurityException] will be thrown.
-     * - With [PERMISSION_WRITE_MEDICAL_DATA] granted, caller is permitted to call this API in
-     *   either foreground or background.
-     * - Caller may only delete data sources it created.
-     *
-     * Medical data is represented using the
-     * [Fast Healthcare Interoperability Resources (FHIR)](https://hl7.org/fhir/) standard.
-     *
-     * This feature is dependent on the version of HealthConnect installed on the device. To check
-     * if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-     * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
-     * thrown if the feature is not available.
-     *
-     * @param id The id of the data source to delete.
-     * @throws IllegalArgumentException if [id] is invalid, does not exist, or owned by another app.
-     * @sample androidx.health.connect.client.samples.DeleteMedicalDataSourceWithDataSample
-     */
-    @ExperimentalPersonalHealthRecordApi
-    @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA")
-    suspend fun deleteMedicalDataSourceWithData(id: String) {
-        throw createExceptionDueToFeatureUnavailable(
-            FEATURE_CONSTANT_NAME_PHR,
-            "HealthConnectClient#deleteMedicalDataSourceWithData()"
-        )
-    }
-
-    /**
-     * Gets the requested [MedicalDataSource]s using [GetMedicalDataSourcesRequest]. Number of data
-     * sources returned by this API will depend based on below factors:
-     * - If an empty [GetMedicalDataSourcesRequest] is passed, all data sources for all apps are
-     *   requested, and all which the caller is permitted to get will be returned. See below.
-     * - If [GetMedicalDataSourcesRequest.packageNames] is not empty, then only the data sources
-     *   created by those packages is being requested. All data sources created by those packages
-     *   which the caller is permitted to get will be returned. See below.
-     *
-     * There is no specific read permission for getting data sources. Instead, permission to read
-     * data sources is based on whether the caller has permission to read the data currently
-     * contained in that data source. Specifically:
-     * - A caller without any read medical permissions such as
-     *   [PERMISSION_READ_MEDICAL_DATA_VACCINES] or the write permission
-     *   [PERMISSION_WRITE_MEDICAL_DATA] is not permitted get any [MedicalDataSource]s, including
-     *   ones that it created.
-     * - A caller with the write permission is permitted to read its own [MedicalDataSource]s
-     *   regardless whether it's in foreground or background.
-     * - A caller with only a read permission, when in background, is only permitted to read its own
-     *   [MedicalDataSource]s that contains at least one [MedicalResource] with the type that the
-     *   read permission covers. However, when the caller is in foreground or if it holds
-     *   [PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND], it can also read other apps'
-     *   [MedicalDataSource]s as long as each of those [MedicalDataSource] contains at least one
-     *   [MedicalResource] with the corresponding type.
-     *     - For example, a client `A` created a [MedicalDataSource] `DS1`, then used `DS1` to
-     *       insert a [MedicalResource] `MR1` with type
-     *       [MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES]. Similarly another client `B` created
-     *       `DS2`, then used `DS2` to insert another [MedicalResource] `MR2` with the same
-     *       [MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES]. If `A` holds
-     *       [PERMISSION_READ_MEDICAL_DATA_VACCINES] and it is in background, it can only read
-     *       `DS1`. However, if `A` is in foreground or holds
-     *       [PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND], it can read both `DS1` and `DS2`.
-     *
-     * This feature is dependent on the version of HealthConnect installed on the device. To check
-     * if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-     * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
-     * thrown if the feature is not available.
-     *
-     * @param request containing details of the [MedicalDataSource]s to retrieve
-     * @return [MedicalDataSource]s matching the provided request
-     * @sample androidx.health.connect.client.samples.GetMedicalDataSourcesByRequestSample
-     */
-    @ExperimentalPersonalHealthRecordApi
-    suspend fun getMedicalDataSources(
-        request: GetMedicalDataSourcesRequest
-    ): List<MedicalDataSource> {
-        throw createExceptionDueToFeatureUnavailable(
-            FEATURE_CONSTANT_NAME_PHR,
-            "HealthConnectClient#getMedicalDataSources()"
-        )
-    }
-
-    /**
-     * Gets [MedicalDataSource]s for the provided list of [ids][MedicalDataSource.id].
-     *
-     * The returned list of data sources will be in the same order as the [ids].
-     *
-     * Number of data sources returned by this API will depend based on below factors:
-     * - If an empty list of [ids] is provided, no data sources will be returned.
-     * - If an id is invalid or non-existent, no data source will be returned for that id, this
-     *   means the returned list might have fewer elements than [ids].
-     * - Callers will only get data sources they are permitted to get. See below.
-     *
-     * There is no specific read permission for getting data sources. Instead, permission to read
-     * data sources is based on whether the caller has permission to read the data currently
-     * contained in that data source. Being permitted to get data sources is dependent on the
-     * following logic, in priority order, earlier statements take precedence.
-     * - A caller without any read medical permissions such as
-     *   [PERMISSION_READ_MEDICAL_DATA_VACCINES] or the write permission
-     *   [PERMISSION_WRITE_MEDICAL_DATA] is not permitted get any [MedicalDataSource]s, including
-     *   ones that it created.
-     * - A caller with the write permission is permitted to read its own [MedicalDataSource]s
-     *   regardless whether it's in foreground or background.
-     * - A caller with only a read permission, when in background, is only permitted to read its own
-     *   [MedicalDataSource]s that contains at least one [MedicalResource] with the type that the
-     *   read permission covers. However, when the caller is in foreground or if it holds
-     *   [PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND], it can also read other apps'
-     *   [MedicalDataSource]s as long as each of those [MedicalDataSource] contains at least one
-     *   [MedicalResource] with the corresponding type.
-     *     - For example, if a caller `A` created a [MedicalDataSource] `DS1`, then used `DS1` to
-     *       insert a [MedicalResource] `MR1` with type
-     *       [MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES], and another caller `B` created `DS2`.
-     *       If `A` holds [PERMISSION_READ_MEDICAL_DATA_VACCINES], it can only read `DS1` in
-     *       background. However, if it is in foreground or holds
-     *       [PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND], it can read both `DS1` and `DS2`.
-     *
-     * This feature is dependent on the version of HealthConnect installed on the device. To check
-     * if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-     * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
-     * thrown if the feature is not available.
-     *
-     * @param ids ids of the [MedicalDataSource]s to retrieve
-     * @return [MedicalDataSource]s matching the provided [ids]
-     * @sample androidx.health.connect.client.samples.GetMedicalDataSourcesByIdsSample
-     */
-    @ExperimentalPersonalHealthRecordApi
-    suspend fun getMedicalDataSources(ids: List<String>): List<MedicalDataSource> {
-        throw createExceptionDueToFeatureUnavailable(
-            FEATURE_CONSTANT_NAME_PHR,
-            "HealthConnectClient#getMedicalDataSources()"
-        )
-    }
-
     companion object {
         @RestrictTo(RestrictTo.Scope.LIBRARY)
         internal const val DEFAULT_PROVIDER_PACKAGE_NAME = "com.google.android.apps.healthdata"
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectFeatures.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectFeatures.kt
index aa9e756..c85b948 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectFeatures.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectFeatures.kt
@@ -18,7 +18,6 @@
 
 import androidx.annotation.IntDef
 import androidx.annotation.RestrictTo
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
 import androidx.health.connect.client.feature.HealthConnectPlatformVersion
 import androidx.health.connect.client.feature.HealthConnectVersionInfo
 
@@ -51,10 +50,6 @@
         /** Feature constant for mindfulness session. */
         @RestrictTo(RestrictTo.Scope.LIBRARY) const val FEATURE_MINDFULNESS_SESSION = 5
 
-        /** Feature constant for Personal Health Records APIs. */
-        @ExperimentalPersonalHealthRecordApi const val FEATURE_PERSONAL_HEALTH_RECORD = 6
-
-        @OptIn(ExperimentalPersonalHealthRecordApi::class)
         @Retention(AnnotationRetention.SOURCE)
         @IntDef(
             value =
@@ -63,7 +58,6 @@
                     FEATURE_SKIN_TEMPERATURE,
                     FEATURE_PLANNED_EXERCISE,
                     FEATURE_READ_HEALTH_DATA_HISTORY,
-                    FEATURE_PERSONAL_HEALTH_RECORD,
                     FEATURE_MINDFULNESS_SESSION
                 ]
         )
@@ -89,10 +83,6 @@
         private val SDK_EXT_13_PLATFORM_VERSION: HealthConnectPlatformVersion =
             HealthConnectPlatformVersion(buildVersionCode = 34, sdkExtensionVersion = 13)
 
-        private val SDK_EXT_16_PLATFORM_VERSION: HealthConnectPlatformVersion =
-            HealthConnectPlatformVersion(buildVersionCode = 34, sdkExtensionVersion = 16)
-
-        @OptIn(ExperimentalPersonalHealthRecordApi::class)
         internal val FEATURE_TO_VERSION_INFO_MAP: Map<Int, HealthConnectVersionInfo> =
             mapOf(
                 FEATURE_READ_HEALTH_DATA_IN_BACKGROUND to
@@ -108,9 +98,7 @@
                         platformVersion = SDK_EXT_13_PLATFORM_VERSION
                     ),
                 FEATURE_PLANNED_EXERCISE to
-                    HealthConnectVersionInfo(platformVersion = SDK_EXT_13_PLATFORM_VERSION),
-                FEATURE_PERSONAL_HEALTH_RECORD to
-                    HealthConnectVersionInfo(platformVersion = SDK_EXT_16_PLATFORM_VERSION),
+                    HealthConnectVersionInfo(platformVersion = SDK_EXT_13_PLATFORM_VERSION)
             )
     }
 }
diff --git a/health/connect/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
index 381d95d..c5e0f6f 100644
--- a/health/connect/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
@@ -16,7 +16,7 @@
 package androidx.health.connect.client.changes
 
 /**
- * Abstraction to represent a change in Health Connect.
+ * Abstraction to represent a change to Android Health Platform.
  *
  * @see androidx.health.data.client.response.ChangesResponse
  * @see UpsertionChange
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/feature/ExperimentalPersonalHealthRecordApi.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/feature/ExperimentalPersonalHealthRecordApi.kt
deleted file mode 100644
index 0067633..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/feature/ExperimentalPersonalHealthRecordApi.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.feature
-
-@RequiresOptIn(
-    message =
-        "This is a part of the Personal Health Record experimental Health Connect APIs and could change in the future."
-)
-@Retention(AnnotationRetention.BINARY)
-annotation class ExperimentalPersonalHealthRecordApi
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/feature/FeatureUtils.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/feature/FeatureUtils.kt
deleted file mode 100644
index edc4d63..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/feature/FeatureUtils.kt
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-// To prevent an empty UtilsKt class from being exposed in APi files
-@file:RestrictTo(RestrictTo.Scope.LIBRARY)
-
-package androidx.health.connect.client.feature
-
-import android.os.Build
-import androidx.annotation.RestrictTo
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_PERSONAL_HEALTH_RECORD
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_STATUS_AVAILABLE
-import kotlin.reflect.KClass
-
-internal const val FEATURE_CONSTANT_NAME_PHR = "FEATURE_PERSONAL_HEALTH_RECORD"
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-internal fun isPersonalHealthRecordFeatureAvailableInPlatform(): Boolean {
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
-        return false
-    }
-    return HealthConnectFeaturesPlatformImpl.getFeatureStatus(FEATURE_PERSONAL_HEALTH_RECORD) ==
-        FEATURE_STATUS_AVAILABLE
-}
-
-/** Create an [UnsupportedOperationException] with given [featureConstantName] and [apiName]. */
-internal fun createExceptionDueToFeatureUnavailable(featureConstantName: String, apiName: String) =
-    UnsupportedOperationException(
-        "\"$apiName\" must only be called if \"$featureConstantName\" feature is available. To check whether the feature is available, use `HealthConnectFeatures.getFeatureStatus(HealthConnectFeatures.$featureConstantName) == FEATURE_STATUS_AVAILABLE`."
-    )
-
-/**
- * Similar to [with], this method executes `block` if PHR feature is available, otherwise throwing
- * an [UnsupportedOperationException] pointing to `apiName`.
- */
-internal fun <T> withPhrFeatureCheck(kClass: KClass<*>, block: () -> T): T =
-    withPhrFeatureCheck("${kClass.simpleName}", block)
-
-/**
- * Similar to [with], this method executes `block` if PHR feature is available, otherwise throwing
- * an [UnsupportedOperationException] pointing to `apiName`.
- */
-internal fun <T> withPhrFeatureCheck(kClass: KClass<*>, methodName: String, block: () -> T): T =
-    withPhrFeatureCheck("${kClass.simpleName}#$methodName", block)
-
-/**
- * Similar to [with], this method executes `block` if PHR feature is available, otherwise throwing
- * an [UnsupportedOperationException] pointing to `apiName`.
- */
-internal fun <T> withPhrFeatureCheck(apiName: String, block: () -> T): T {
-    if (isPersonalHealthRecordFeatureAvailableInPlatform()) {
-        return block()
-    } else {
-        throw createExceptionDueToFeatureUnavailable(FEATURE_CONSTANT_NAME_PHR, apiName)
-    }
-}
-
-/**
- * Similar to [with], this method executes `block` if PHR feature is available, otherwise throwing
- * an [UnsupportedOperationException] pointing to `apiName`.
- */
-internal suspend fun <T> withPhrFeatureCheckSuspend(
-    kClass: KClass<*>,
-    methodName: String,
-    block: suspend () -> T
-): T {
-    return withPhrFeatureCheckSuspend("${kClass.simpleName}#$methodName", block)
-}
-
-/**
- * Similar to [with], this method executes `block` if PHR feature is available, otherwise throwing
- * an [UnsupportedOperationException] pointing to `apiName`.
- */
-internal suspend fun <T> withPhrFeatureCheckSuspend(apiName: String, block: suspend () -> T): T {
-    if (isPersonalHealthRecordFeatureAvailableInPlatform()) {
-        return block()
-    } else {
-        throw createExceptionDueToFeatureUnavailable(FEATURE_CONSTANT_NAME_PHR, apiName)
-    }
-}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/feature/HealthConnectFeaturesPlatformImpl.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/feature/HealthConnectFeaturesPlatformImpl.kt
index 899c2b9..d6888ed 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/feature/HealthConnectFeaturesPlatformImpl.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/feature/HealthConnectFeaturesPlatformImpl.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-@file:RequiresApi(api = Build.VERSION_CODES.R)
+@file:RequiresApi(api = 34)
 
 package androidx.health.connect.client.feature
 
@@ -23,8 +23,6 @@
 import androidx.annotation.RequiresApi
 import androidx.annotation.VisibleForTesting
 import androidx.health.connect.client.HealthConnectFeatures
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_STATUS_AVAILABLE
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_STATUS_UNAVAILABLE
 import androidx.health.connect.client.HealthConnectFeatures.Companion.Feature
 import androidx.health.connect.client.HealthConnectFeatures.Companion.FeatureStatus
 
@@ -35,44 +33,38 @@
 internal class HealthConnectFeaturesPlatformImpl : HealthConnectFeatures {
 
     @FeatureStatus
-    override fun getFeatureStatus(@Feature feature: Int): Int = Companion.getFeatureStatus(feature)
+    override fun getFeatureStatus(@Feature feature: Int): Int {
+        return HealthConnectFeatures.FEATURE_TO_VERSION_INFO_MAP.getFeatureStatus(feature)
+    }
 
+    @VisibleForTesting
     internal companion object {
-        /**
-         * Checks whether the given feature is available.
-         *
-         * @param feature the feature to be checked. One of the "FEATURE_" constants in this class.
-         * @return one of [FEATURE_STATUS_UNAVAILABLE] or [FEATURE_STATUS_AVAILABLE]
-         */
-        fun getFeatureStatus(@Feature feature: Int): Int {
-            return HealthConnectFeatures.FEATURE_TO_VERSION_INFO_MAP.getFeatureStatus(feature)
-        }
-
         @VisibleForTesting
         internal fun Map<Int, HealthConnectVersionInfo>.getFeatureStatus(
             @Feature feature: Int
         ): Int {
             val minimumRequiredVersion =
-                this[feature]?.platformVersion ?: return FEATURE_STATUS_UNAVAILABLE
+                this[feature]?.platformVersion
+                    ?: return HealthConnectFeatures.FEATURE_STATUS_UNAVAILABLE
 
             if (minimumRequiredVersion.buildVersionCode > Build.VERSION.SDK_INT) {
-                return FEATURE_STATUS_UNAVAILABLE
+                return HealthConnectFeatures.FEATURE_STATUS_UNAVAILABLE
             }
 
             // If there is no sdkExtension for the feature, then it is supported across all
             // extension versions of the platform build version.
             if (minimumRequiredVersion.sdkExtensionVersion == null) {
-                return FEATURE_STATUS_AVAILABLE
+                return HealthConnectFeatures.FEATURE_STATUS_AVAILABLE
             }
 
             if (
                 minimumRequiredVersion.sdkExtensionVersion <=
                     SdkExtensions.getExtensionVersion(minimumRequiredVersion.buildVersionCode)
             ) {
-                return FEATURE_STATUS_AVAILABLE
+                return HealthConnectFeatures.FEATURE_STATUS_AVAILABLE
             }
 
-            return FEATURE_STATUS_UNAVAILABLE
+            return HealthConnectFeatures.FEATURE_STATUS_UNAVAILABLE
         }
     }
 }
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImpl.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImpl.kt
index 810f8e4..b2793eb 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImpl.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImpl.kt
@@ -29,8 +29,6 @@
 import android.os.RemoteException
 import android.os.ext.SdkExtensions
 import androidx.annotation.RequiresApi
-import androidx.annotation.RequiresExtension
-import androidx.annotation.RequiresPermission
 import androidx.annotation.VisibleForTesting
 import androidx.core.os.asOutcomeReceiver
 import androidx.health.connect.client.ExperimentalDeduplicationApi
@@ -43,15 +41,11 @@
 import androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod
 import androidx.health.connect.client.changes.DeletionChange
 import androidx.health.connect.client.changes.UpsertionChange
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
 import androidx.health.connect.client.feature.HealthConnectFeaturesPlatformImpl
-import androidx.health.connect.client.feature.withPhrFeatureCheckSuspend
 import androidx.health.connect.client.impl.platform.aggregate.aggregateFallback
 import androidx.health.connect.client.impl.platform.aggregate.isPlatformSupportedMetric
 import androidx.health.connect.client.impl.platform.records.toPlatformRecord
 import androidx.health.connect.client.impl.platform.records.toPlatformRecordClass
-import androidx.health.connect.client.impl.platform.records.toSdkMedicalDataSource
-import androidx.health.connect.client.impl.platform.records.toSdkMedicalResource
 import androidx.health.connect.client.impl.platform.records.toSdkRecord
 import androidx.health.connect.client.impl.platform.request.toPlatformLocalTimeRangeFilter
 import androidx.health.connect.client.impl.platform.request.toPlatformRequest
@@ -60,24 +54,15 @@
 import androidx.health.connect.client.impl.platform.response.toSdkResponse
 import androidx.health.connect.client.impl.platform.toKtException
 import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_PREFIX
-import androidx.health.connect.client.records.MedicalDataSource
-import androidx.health.connect.client.records.MedicalResource
-import androidx.health.connect.client.records.MedicalResourceId
 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.CreateMedicalDataSourceRequest
-import androidx.health.connect.client.request.DeleteMedicalResourcesRequest
-import androidx.health.connect.client.request.GetMedicalDataSourcesRequest
-import androidx.health.connect.client.request.ReadMedicalResourcesRequest
 import androidx.health.connect.client.request.ReadRecordsRequest
 import androidx.health.connect.client.request.ReadRecordsRequest.Companion.DEDUPLICATION_STRATEGY_DISABLED
-import androidx.health.connect.client.request.UpsertMedicalResourceRequest
 import androidx.health.connect.client.response.ChangesResponse
 import androidx.health.connect.client.response.InsertRecordsResponse
-import androidx.health.connect.client.response.ReadMedicalResourcesResponse
 import androidx.health.connect.client.response.ReadRecordResponse
 import androidx.health.connect.client.response.ReadRecordsResponse
 import androidx.health.connect.client.time.TimeRangeFilter
@@ -441,187 +426,6 @@
         }
     }
 
-    @ExperimentalPersonalHealthRecordApi
-    @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA")
-    @RequiresExtension(extension = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, version = 16)
-    override suspend fun createMedicalDataSource(
-        request: CreateMedicalDataSourceRequest
-    ): MedicalDataSource =
-        withPhrFeatureCheckSuspend(
-            this::class,
-            "createMedicalDataSource(request: CreateMedicalDataSourceRequest)"
-        ) {
-            wrapPlatformException {
-                    suspendCancellableCoroutine { continuation ->
-                        healthConnectManager.createMedicalDataSource(
-                            request.platformCreateMedicalDataSourceRequest,
-                            executor,
-                            continuation.asOutcomeReceiver()
-                        )
-                    }
-                }
-                .toSdkMedicalDataSource()
-        }
-
-    @ExperimentalPersonalHealthRecordApi
-    @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA")
-    @RequiresExtension(extension = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, version = 16)
-    override suspend fun deleteMedicalDataSourceWithData(id: String) {
-        withPhrFeatureCheckSuspend(this::class, "deleteMedicalDataSourceWithData(id: String)") {
-            wrapPlatformException {
-                suspendCancellableCoroutine { continuation ->
-                    healthConnectManager.deleteMedicalDataSourceWithData(
-                        id,
-                        executor,
-                        continuation.asOutcomeReceiver()
-                    )
-                }
-            }
-        }
-    }
-
-    @ExperimentalPersonalHealthRecordApi
-    @RequiresExtension(extension = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, version = 16)
-    override suspend fun getMedicalDataSources(
-        request: GetMedicalDataSourcesRequest
-    ): List<MedicalDataSource> =
-        withPhrFeatureCheckSuspend(
-            this::class,
-            "getMedicalDataSources(request: GetMedicalDataSourcesRequest)"
-        ) {
-            wrapPlatformException {
-                    suspendCancellableCoroutine { continuation ->
-                        healthConnectManager.getMedicalDataSources(
-                            request.platformGetMedicalDataSourcesRequest,
-                            executor,
-                            continuation.asOutcomeReceiver()
-                        )
-                    }
-                }
-                .map { it.toSdkMedicalDataSource() }
-        }
-
-    @ExperimentalPersonalHealthRecordApi
-    @RequiresExtension(extension = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, version = 16)
-    override suspend fun getMedicalDataSources(ids: List<String>): List<MedicalDataSource> =
-        withPhrFeatureCheckSuspend(this::class, "getMedicalDataSources(ids: List<String>)") {
-            wrapPlatformException {
-                    suspendCancellableCoroutine { continuation ->
-                        healthConnectManager.getMedicalDataSources(
-                            ids,
-                            executor,
-                            continuation.asOutcomeReceiver()
-                        )
-                    }
-                }
-                .map { it.toSdkMedicalDataSource() }
-        }
-
-    @ExperimentalPersonalHealthRecordApi
-    @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA")
-    @RequiresExtension(Build.VERSION_CODES.UPSIDE_DOWN_CAKE, 16)
-    override suspend fun upsertMedicalResources(
-        requests: List<UpsertMedicalResourceRequest>
-    ): List<MedicalResource> =
-        withPhrFeatureCheckSuspend(this::class, "upsertMedicalResources()") {
-            wrapPlatformException {
-                    suspendCancellableCoroutine { continuation ->
-                        healthConnectManager.upsertMedicalResources(
-                            requests.map { it.platformUpsertMedicalResourceRequest },
-                            executor,
-                            continuation.asOutcomeReceiver()
-                        )
-                    }
-                }
-                .map { it.toSdkMedicalResource() }
-        }
-
-    @ExperimentalPersonalHealthRecordApi
-    @RequiresExtension(Build.VERSION_CODES.UPSIDE_DOWN_CAKE, 16)
-    override suspend fun readMedicalResources(
-        request: ReadMedicalResourcesRequest
-    ): ReadMedicalResourcesResponse =
-        withPhrFeatureCheckSuspend(
-            this::class,
-            "readMedicalResources(request: ReadMedicalResourcesRequest)"
-        ) {
-            wrapPlatformException {
-                    suspendCancellableCoroutine { continuation ->
-                        healthConnectManager.readMedicalResources(
-                            request.platformReadMedicalResourcesRequest,
-                            executor,
-                            continuation.asOutcomeReceiver()
-                        )
-                    }
-                }
-                .let { platformResponse ->
-                    ReadMedicalResourcesResponse(
-                        platformResponse.medicalResources.map { it.toSdkMedicalResource() },
-                        platformResponse.nextPageToken,
-                        platformResponse.remainingCount
-                    )
-                }
-        }
-
-    @ExperimentalPersonalHealthRecordApi
-    @RequiresExtension(Build.VERSION_CODES.UPSIDE_DOWN_CAKE, 16)
-    override suspend fun readMedicalResources(ids: List<MedicalResourceId>): List<MedicalResource> =
-        withPhrFeatureCheckSuspend(
-            this::class,
-            "readMedicalResources(ids: List<MedicalResourceId>)"
-        ) {
-            wrapPlatformException {
-                    suspendCancellableCoroutine { continuation ->
-                        healthConnectManager.readMedicalResources(
-                            ids.map { it.platformMedicalResourceId },
-                            executor,
-                            continuation.asOutcomeReceiver()
-                        )
-                    }
-                }
-                .map { it.toSdkMedicalResource() }
-        }
-
-    @ExperimentalPersonalHealthRecordApi
-    @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA")
-    @RequiresExtension(Build.VERSION_CODES.UPSIDE_DOWN_CAKE, 16)
-    override suspend fun deleteMedicalResources(ids: List<MedicalResourceId>) {
-        withPhrFeatureCheckSuspend(
-            HealthConnectClientUpsideDownImpl::class,
-            "deleteMedicalResources(ids: List<MedicalResourceId>)"
-        ) {
-            wrapPlatformException {
-                suspendCancellableCoroutine { continuation ->
-                    healthConnectManager.deleteMedicalResources(
-                        ids.map { it.platformMedicalResourceId },
-                        executor,
-                        continuation.asOutcomeReceiver()
-                    )
-                }
-            }
-        }
-    }
-
-    @ExperimentalPersonalHealthRecordApi
-    @RequiresPermission("android.permission.health.WRITE_MEDICAL_DATA")
-    @RequiresExtension(Build.VERSION_CODES.UPSIDE_DOWN_CAKE, 16)
-    override suspend fun deleteMedicalResources(request: DeleteMedicalResourcesRequest) {
-        withPhrFeatureCheckSuspend(
-            HealthConnectClientUpsideDownImpl::class,
-            "deleteMedicalResources(request: DeleteMedicalResourcesRequest)"
-        ) {
-            wrapPlatformException {
-                suspendCancellableCoroutine { continuation ->
-                    healthConnectManager.deleteMedicalResources(
-                        request.platformReadMedicalResourcesRequest,
-                        executor,
-                        continuation.asOutcomeReceiver()
-                    )
-                }
-            }
-        }
-    }
-
     private suspend fun <T> wrapPlatformException(function: suspend () -> T): T {
         return try {
             function()
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/platform/records/IntDefMappings.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/platform/records/IntDefMappings.kt
index 70068ea..ee069f3 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/platform/records/IntDefMappings.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/platform/records/IntDefMappings.kt
@@ -21,40 +21,13 @@
 
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
 import androidx.health.connect.client.records.BloodGlucoseRecord
 import androidx.health.connect.client.records.BloodPressureRecord
 import androidx.health.connect.client.records.BodyTemperatureMeasurementLocation
 import androidx.health.connect.client.records.CervicalMucusRecord
 import androidx.health.connect.client.records.ExerciseSegment
 import androidx.health.connect.client.records.ExerciseSessionRecord
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_CONDITION
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_ENCOUNTER
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_IMMUNIZATION
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_LOCATION
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_MEDICATION
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_MEDICATION_REQUEST
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_OBSERVATION
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_ORGANIZATION
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_PATIENT
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_PRACTITIONER
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE
-import androidx.health.connect.client.records.FhirResource.Companion.FHIR_RESOURCE_TYPE_PROCEDURE
 import androidx.health.connect.client.records.MealType
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_CONDITIONS
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_MEDICATIONS
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_PREGNANCY
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_PROCEDURES
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_VACCINES
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_VISITS
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_VITAL_SIGNS
 import androidx.health.connect.client.records.MenstruationFlowRecord
 import androidx.health.connect.client.records.OvulationTestRecord
 import androidx.health.connect.client.records.PlannedExerciseStep
@@ -133,7 +106,6 @@
         ExerciseSessionRecord.EXERCISE_TYPE_GOLF to
             PlatformExerciseSessionType.EXERCISE_SESSION_TYPE_GOLF,
         ExerciseSessionRecord.EXERCISE_TYPE_GUIDED_BREATHING to
-            @Suppress("DEPRECATION")
             PlatformExerciseSessionType.EXERCISE_SESSION_TYPE_GUIDED_BREATHING,
         ExerciseSessionRecord.EXERCISE_TYPE_GYMNASTICS to
             PlatformExerciseSessionType.EXERCISE_SESSION_TYPE_GYMNASTICS,
@@ -567,61 +539,6 @@
         Metadata.RECORDING_METHOD_MANUAL_ENTRY to PlatformMetadata.RECORDING_METHOD_MANUAL_ENTRY
     )
 
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-internal val SDK_TO_PLATFORM_FHIR_RESOURCE_TYPE: Map<Int, Int> =
-    mapOf(
-        FHIR_RESOURCE_TYPE_IMMUNIZATION to PlatformFhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION,
-        FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE to
-            PlatformFhirResource.FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-        FHIR_RESOURCE_TYPE_OBSERVATION to PlatformFhirResource.FHIR_RESOURCE_TYPE_OBSERVATION,
-        FHIR_RESOURCE_TYPE_CONDITION to PlatformFhirResource.FHIR_RESOURCE_TYPE_CONDITION,
-        FHIR_RESOURCE_TYPE_PROCEDURE to PlatformFhirResource.FHIR_RESOURCE_TYPE_PROCEDURE,
-        FHIR_RESOURCE_TYPE_MEDICATION to PlatformFhirResource.FHIR_RESOURCE_TYPE_MEDICATION,
-        FHIR_RESOURCE_TYPE_MEDICATION_REQUEST to
-            PlatformFhirResource.FHIR_RESOURCE_TYPE_MEDICATION_REQUEST,
-        FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT to
-            PlatformFhirResource.FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT,
-        FHIR_RESOURCE_TYPE_PATIENT to PlatformFhirResource.FHIR_RESOURCE_TYPE_PATIENT,
-        FHIR_RESOURCE_TYPE_PRACTITIONER to PlatformFhirResource.FHIR_RESOURCE_TYPE_PRACTITIONER,
-        FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE to
-            PlatformFhirResource.FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE,
-        FHIR_RESOURCE_TYPE_ENCOUNTER to PlatformFhirResource.FHIR_RESOURCE_TYPE_ENCOUNTER,
-        FHIR_RESOURCE_TYPE_LOCATION to PlatformFhirResource.FHIR_RESOURCE_TYPE_LOCATION,
-        FHIR_RESOURCE_TYPE_ORGANIZATION to PlatformFhirResource.FHIR_RESOURCE_TYPE_ORGANIZATION
-    )
-
-internal val PLATFORM_TO_SDK_FHIR_RESOURCE_TYPE: Map<Int, Int> =
-    SDK_TO_PLATFORM_FHIR_RESOURCE_TYPE.reversed()
-
-@OptIn(ExperimentalPersonalHealthRecordApi::class)
-internal val SDK_TO_PLATFORM_MEDICAL_RESOURCE_TYPE: Map<Int, Int> =
-    mapOf(
-        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES to
-            PlatformMedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
-        MEDICAL_RESOURCE_TYPE_CONDITIONS to
-            PlatformMedicalResource.MEDICAL_RESOURCE_TYPE_CONDITIONS,
-        MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS to
-            PlatformMedicalResource.MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS,
-        MEDICAL_RESOURCE_TYPE_MEDICATIONS to
-            PlatformMedicalResource.MEDICAL_RESOURCE_TYPE_MEDICATIONS,
-        MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS to
-            PlatformMedicalResource.MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS,
-        MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS to
-            PlatformMedicalResource.MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS,
-        MEDICAL_RESOURCE_TYPE_PREGNANCY to PlatformMedicalResource.MEDICAL_RESOURCE_TYPE_PREGNANCY,
-        MEDICAL_RESOURCE_TYPE_PROCEDURES to
-            PlatformMedicalResource.MEDICAL_RESOURCE_TYPE_PROCEDURES,
-        MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY to
-            PlatformMedicalResource.MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY,
-        MEDICAL_RESOURCE_TYPE_VACCINES to PlatformMedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES,
-        MEDICAL_RESOURCE_TYPE_VISITS to PlatformMedicalResource.MEDICAL_RESOURCE_TYPE_VISITS,
-        MEDICAL_RESOURCE_TYPE_VITAL_SIGNS to
-            PlatformMedicalResource.MEDICAL_RESOURCE_TYPE_VITAL_SIGNS
-    )
-
-internal val PLATFORM_TO_SDK_MEDICAL_RESOURCE_TYPE: Map<Int, Int> =
-    SDK_TO_PLATFORM_MEDICAL_RESOURCE_TYPE.reversed()
-
 internal fun Int.toPlatformExerciseCategory(): Int {
     return SDK_TO_PLATFORM_BLOOD_GLUCOSE_SPECIMEN_SOURCE[this]
         ?: PlatformPlannedExerciseStep.EXERCISE_CATEGORY_UNKNOWN
@@ -711,18 +628,6 @@
     return SDK_TO_PLATFORM_RECORDING_METHOD[this] ?: PlatformMetadata.RECORDING_METHOD_UNKNOWN
 }
 
-internal fun Int.toPlatformFhirResourceType(): Int {
-    // PHR does not support FHIR UNKNOWN type, see ag/29700288
-    return SDK_TO_PLATFORM_FHIR_RESOURCE_TYPE[this]
-        ?: throw IllegalArgumentException("SDK => Platform: Invalid FHIR resource type.")
-}
-
-internal fun Int.toPlatformMedicalResourceType(): Int {
-    // PHR does not support UNKNOWN type for medical resource, see ag/29703206
-    return SDK_TO_PLATFORM_MEDICAL_RESOURCE_TYPE[this]
-        ?: throw IllegalArgumentException("SDK => Platform: Invalid medical resource type.")
-}
-
 internal fun Int.toSdkBloodPressureBodyPosition(): Int {
     return PLATFORM_TO_SDK_BLOOD_PRESSURE_BODY_POSITION[this]
         ?: BloodPressureRecord.BODY_POSITION_UNKNOWN
@@ -807,13 +712,3 @@
 private fun Map<Int, Int>.reversed(): Map<Int, Int> {
     return entries.associate { (k, v) -> v to k }
 }
-
-internal fun Int.toSdkFhirResourceType(): Int {
-    return PLATFORM_TO_SDK_FHIR_RESOURCE_TYPE[this]
-        ?: throw IllegalArgumentException("Platform => SDK: Invalid FHIR resource type.")
-}
-
-internal fun Int.toSdkMedicalResourceType(): Int {
-    return PLATFORM_TO_SDK_MEDICAL_RESOURCE_TYPE[this]
-        ?: throw IllegalArgumentException("Platform => SDK: Invalid medical resource type.")
-}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/platform/records/PlatformRecordAliases.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/platform/records/PlatformRecordAliases.kt
index 2c8adc6..78e1e43 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/platform/records/PlatformRecordAliases.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/platform/records/PlatformRecordAliases.kt
@@ -438,22 +438,3 @@
 internal typealias PlatformVelocity = android.health.connect.datatypes.units.Velocity
 
 internal typealias PlatformVolume = android.health.connect.datatypes.units.Volume
-
-internal typealias PlatformFhirVersion = android.health.connect.datatypes.FhirVersion
-
-internal typealias PlatformFhirResource = android.health.connect.datatypes.FhirResource
-
-internal typealias PlatformFhirResourceBuilder =
-    android.health.connect.datatypes.FhirResource.Builder
-
-internal typealias PlatformMedicalDataSource = android.health.connect.datatypes.MedicalDataSource
-
-internal typealias PlatformMedicalDataSourceBuilder =
-    android.health.connect.datatypes.MedicalDataSource.Builder
-
-internal typealias PlatformMedicalResourceId = android.health.connect.MedicalResourceId
-
-internal typealias PlatformMedicalResource = android.health.connect.datatypes.MedicalResource
-
-internal typealias PlatformMedicalResourceBuilder =
-    android.health.connect.datatypes.MedicalResource.Builder
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/platform/records/RecordConverters.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/platform/records/RecordConverters.kt
index 3d41095..15c100a 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/platform/records/RecordConverters.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/platform/records/RecordConverters.kt
@@ -16,7 +16,6 @@
 
 @file:RestrictTo(RestrictTo.Scope.LIBRARY)
 @file:RequiresApi(api = 34)
-@file:OptIn(ExperimentalPersonalHealthRecordApi::class)
 
 package androidx.health.connect.client.impl.platform.records
 
@@ -25,7 +24,6 @@
 import androidx.annotation.RequiresApi
 import androidx.annotation.RequiresExtension
 import androidx.annotation.RestrictTo
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
 import androidx.health.connect.client.records.ActiveCaloriesBurnedRecord
 import androidx.health.connect.client.records.BasalBodyTemperatureRecord
 import androidx.health.connect.client.records.BasalMetabolicRateRecord
@@ -46,8 +44,6 @@
 import androidx.health.connect.client.records.ExerciseRouteResult
 import androidx.health.connect.client.records.ExerciseSegment
 import androidx.health.connect.client.records.ExerciseSessionRecord
-import androidx.health.connect.client.records.FhirResource
-import androidx.health.connect.client.records.FhirVersion
 import androidx.health.connect.client.records.FloorsClimbedRecord
 import androidx.health.connect.client.records.HeartRateRecord
 import androidx.health.connect.client.records.HeartRateVariabilityRmssdRecord
@@ -55,9 +51,6 @@
 import androidx.health.connect.client.records.HydrationRecord
 import androidx.health.connect.client.records.IntermenstrualBleedingRecord
 import androidx.health.connect.client.records.LeanBodyMassRecord
-import androidx.health.connect.client.records.MedicalDataSource
-import androidx.health.connect.client.records.MedicalResource
-import androidx.health.connect.client.records.MedicalResourceId
 import androidx.health.connect.client.records.MenstruationFlowRecord
 import androidx.health.connect.client.records.MenstruationPeriodRecord
 import androidx.health.connect.client.records.NutritionRecord
@@ -1319,35 +1312,3 @@
 
 internal fun PlatformExerciseSegment.toSdkExerciseSegment() =
     ExerciseSegment(startTime, endTime, segmentType.toSdkExerciseSegmentType(), repetitionsCount)
-
-@SuppressLint("NewApi") // Guarded by sdk extension check
-internal fun PlatformMedicalResourceId.toSdkMedicalResourceId() =
-    MedicalResourceId(dataSourceId, fhirResourceType.toSdkFhirResourceType(), fhirResourceId)
-
-@SuppressLint("NewApi") // Guarded by sdk extension check
-internal fun PlatformFhirVersion.toSdkFhirVersion() = FhirVersion(major, minor, patch)
-
-@SuppressLint("NewApi") // Guarded by sdk extension check
-internal fun PlatformMedicalDataSource.toSdkMedicalDataSource() =
-    MedicalDataSource(
-        id = id,
-        packageName = packageName,
-        fhirBaseUri = fhirBaseUri,
-        displayName = displayName,
-        fhirVersion = FhirVersion(fhirVersion.major, fhirVersion.minor, fhirVersion.patch),
-        lastDataUpdateTime = lastDataUpdateTime
-    )
-
-@SuppressLint("NewApi") // Guarded by sdk extension check
-internal fun PlatformFhirResource.toSdkFhirResource() =
-    FhirResource(type.toSdkFhirResourceType(), id, data)
-
-@SuppressLint("NewApi") // Guarded by sdk extension check
-internal fun PlatformMedicalResource.toSdkMedicalResource() =
-    MedicalResource(
-        type.toSdkMedicalResourceType(),
-        id.toSdkMedicalResourceId(),
-        dataSourceId,
-        fhirVersion.toSdkFhirVersion(),
-        fhirResource.toSdkFhirResource()
-    )
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/platform/request/PlatformRequestAliases.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/platform/request/PlatformRequestAliases.kt
deleted file mode 100644
index be90ec1..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/platform/request/PlatformRequestAliases.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-@file:RequiresApi(api = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
-
-package androidx.health.connect.client.impl.platform.request
-
-import android.os.Build
-import androidx.annotation.RequiresApi
-import androidx.annotation.RestrictTo
-
-internal typealias PlatformCreateMedicalDataSourceRequest =
-    android.health.connect.CreateMedicalDataSourceRequest
-
-internal typealias PlatformCreateMedicalDataSourceRequestBuilder =
-    android.health.connect.CreateMedicalDataSourceRequest.Builder
-
-internal typealias PlatformGetMedicalDataSourcesRequest =
-    android.health.connect.GetMedicalDataSourcesRequest
-
-internal typealias PlatformGetMedicalDataSourcesRequestBuilder =
-    android.health.connect.GetMedicalDataSourcesRequest.Builder
-
-internal typealias PlatformUpsertMedicalResourceRequest =
-    android.health.connect.UpsertMedicalResourceRequest
-
-internal typealias PlatformUpsertMedicalResourceRequestBuilder =
-    android.health.connect.UpsertMedicalResourceRequest.Builder
-
-internal typealias PlatformReadMedicalResourcesRequest =
-    android.health.connect.ReadMedicalResourcesRequest
-
-internal typealias PlatformReadMedicalResourcesInitialRequest =
-    android.health.connect.ReadMedicalResourcesInitialRequest
-
-internal typealias PlatformReadMedicalResourcesInitialRequestBuilder =
-    android.health.connect.ReadMedicalResourcesInitialRequest.Builder
-
-internal typealias PlatformReadMedicalResourcesPageRequest =
-    android.health.connect.ReadMedicalResourcesPageRequest
-
-internal typealias PlatformReadMedicalResourcesPageRequestBuilder =
-    android.health.connect.ReadMedicalResourcesPageRequest.Builder
-
-internal typealias PlatformDeleteMedicalResourcesRequest =
-    android.health.connect.DeleteMedicalResourcesRequest
-
-internal typealias PlatformDeleteMedicalResourcesRequestBuilder =
-    android.health.connect.DeleteMedicalResourcesRequest.Builder
diff --git a/health/connect/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
index 04c1312..ffef8f3 100644
--- a/health/connect/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
@@ -18,7 +18,6 @@
 import androidx.annotation.RestrictTo
 import androidx.health.connect.client.HealthConnectClient
 import androidx.health.connect.client.HealthConnectFeatures
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
 import androidx.health.connect.client.records.ActiveCaloriesBurnedRecord
 import androidx.health.connect.client.records.BasalBodyTemperatureRecord
 import androidx.health.connect.client.records.BasalMetabolicRateRecord
@@ -186,198 +185,6 @@
         const val PERMISSION_READ_HEALTH_DATA_HISTORY =
             PERMISSION_PREFIX + "READ_HEALTH_DATA_HISTORY"
 
-        /**
-         * Permission to write medical data records. This permission allows for the write of medical
-         * data of any type. Note that read permissions are specified per-type.
-         *
-         * This feature is dependent on the version of HealthConnect installed on the device. To
-         * check if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-         * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. If not available,
-         * this permission will not be granted if requested.
-         *
-         * @sample androidx.health.connect.client.samples.RequestMedicalPermissions
-         */
-        @ExperimentalPersonalHealthRecordApi
-        const val PERMISSION_WRITE_MEDICAL_DATA = PERMISSION_PREFIX + "WRITE_MEDICAL_DATA"
-
-        /**
-         * Allows an application to read the user's data about allergies and intolerances.
-         *
-         * This feature is dependent on the version of HealthConnect installed on the device. To
-         * check if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-         * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. If not available,
-         * this permission will not be granted if requested.
-         *
-         * @sample androidx.health.connect.client.samples.RequestMedicalPermissions
-         */
-        @ExperimentalPersonalHealthRecordApi
-        const val PERMISSION_READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES =
-            PERMISSION_PREFIX + "READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"
-
-        /**
-         * Allows an application to read the user's data about medical conditions.
-         *
-         * This feature is dependent on the version of HealthConnect installed on the device. To
-         * check if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-         * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. If not available,
-         * this permission will not be granted if requested.
-         *
-         * @sample androidx.health.connect.client.samples.RequestMedicalPermissions
-         */
-        @ExperimentalPersonalHealthRecordApi
-        const val PERMISSION_READ_MEDICAL_DATA_CONDITIONS =
-            PERMISSION_PREFIX + "READ_MEDICAL_DATA_CONDITIONS"
-
-        /**
-         * Allows an application to read the user's laboratory result data.
-         *
-         * This feature is dependent on the version of HealthConnect installed on the device. To
-         * check if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-         * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. If not available,
-         * this permission will not be granted if requested.
-         *
-         * @sample androidx.health.connect.client.samples.RequestMedicalPermissions
-         */
-        @ExperimentalPersonalHealthRecordApi
-        const val PERMISSION_READ_MEDICAL_DATA_LABORATORY_RESULTS =
-            PERMISSION_PREFIX + "READ_MEDICAL_DATA_LABORATORY_RESULTS"
-
-        /**
-         * Allows an application to read the user's medication data.
-         *
-         * This feature is dependent on the version of HealthConnect installed on the device. To
-         * check if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-         * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. If not available,
-         * this permission will not be granted if requested.
-         *
-         * @sample androidx.health.connect.client.samples.RequestMedicalPermissions
-         */
-        @ExperimentalPersonalHealthRecordApi
-        const val PERMISSION_READ_MEDICAL_DATA_MEDICATIONS =
-            PERMISSION_PREFIX + "READ_MEDICAL_DATA_MEDICATIONS"
-
-        /**
-         * Allows an application to read the user's personal details.
-         *
-         * This is demographic information such as name, date of birth, contact details like address
-         * or telephone number and so on. For more examples see the FHIR Patient resource at
-         * https://www.hl7.org/fhir/patient.html.
-         *
-         * This feature is dependent on the version of HealthConnect installed on the device. To
-         * check if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-         * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. If not available,
-         * this permission will not be granted if requested.
-         *
-         * @sample androidx.health.connect.client.samples.RequestMedicalPermissions
-         */
-        @ExperimentalPersonalHealthRecordApi
-        const val PERMISSION_READ_MEDICAL_DATA_PERSONAL_DETAILS =
-            PERMISSION_PREFIX + "READ_MEDICAL_DATA_PERSONAL_DETAILS"
-
-        /**
-         * Allows an application to read the user's data about the practitioners who have interacted
-         * with them in their medical record. This is the information about the clinicians (doctors,
-         * nurses, etc) but also other practitioners (masseurs, physiotherapists, etc) who have been
-         * involved with the patient.
-         *
-         * This feature is dependent on the version of HealthConnect installed on the device. To
-         * check if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-         * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. If not available,
-         * this permission will not be granted if requested.
-         *
-         * @sample androidx.health.connect.client.samples.RequestMedicalPermissions
-         */
-        @ExperimentalPersonalHealthRecordApi
-        const val PERMISSION_READ_MEDICAL_DATA_PRACTITIONER_DETAILS =
-            PERMISSION_PREFIX + "READ_MEDICAL_DATA_PRACTITIONER_DETAILS"
-
-        /**
-         * Allows an application to read the user's pregnancy data.
-         *
-         * This feature is dependent on the version of HealthConnect installed on the device. To
-         * check if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-         * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. If not available,
-         * this permission will not be granted if requested.
-         *
-         * @sample androidx.health.connect.client.samples.RequestMedicalPermissions
-         */
-        @ExperimentalPersonalHealthRecordApi
-        const val PERMISSION_READ_MEDICAL_DATA_PREGNANCY =
-            PERMISSION_PREFIX + "READ_MEDICAL_DATA_PREGNANCY"
-
-        /**
-         * Allows an application to read the user's data about medical procedures.
-         *
-         * This feature is dependent on the version of HealthConnect installed on the device. To
-         * check if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-         * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. If not available,
-         * this permission will not be granted if requested.
-         *
-         * @sample androidx.health.connect.client.samples.RequestMedicalPermissions
-         */
-        @ExperimentalPersonalHealthRecordApi
-        const val PERMISSION_READ_MEDICAL_DATA_PROCEDURES =
-            PERMISSION_PREFIX + "READ_MEDICAL_DATA_PROCEDURES"
-
-        /**
-         * Allows an application to read the user's social history data.
-         *
-         * This feature is dependent on the version of HealthConnect installed on the device. To
-         * check if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-         * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. If not available,
-         * this permission will not be granted if requested.
-         *
-         * @sample androidx.health.connect.client.samples.RequestMedicalPermissions
-         */
-        @ExperimentalPersonalHealthRecordApi
-        const val PERMISSION_READ_MEDICAL_DATA_SOCIAL_HISTORY =
-            PERMISSION_PREFIX + "READ_MEDICAL_DATA_SOCIAL_HISTORY"
-
-        /**
-         * Allows an application to read the user's data about immunizations and vaccinations.
-         *
-         * This feature is dependent on the version of HealthConnect installed on the device. To
-         * check if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-         * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. If not available,
-         * this permission will not be granted if requested.
-         *
-         * @sample androidx.health.connect.client.samples.RequestMedicalPermissions
-         */
-        @ExperimentalPersonalHealthRecordApi
-        const val PERMISSION_READ_MEDICAL_DATA_VACCINES =
-            PERMISSION_PREFIX + "READ_MEDICAL_DATA_VACCINES"
-
-        /**
-         * Allows an application to read the user's information about their encounters with health
-         * care practitioners, including things like location, time of appointment, and name of
-         * organization the visit was with. Despite the name visit it covers remote encounters such
-         * as telephone or videoconference appointments.
-         *
-         * This feature is dependent on the version of HealthConnect installed on the device. To
-         * check if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-         * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. If not available,
-         * this permission will not be granted if requested.
-         *
-         * @sample androidx.health.connect.client.samples.RequestMedicalPermissions
-         */
-        @ExperimentalPersonalHealthRecordApi
-        const val PERMISSION_READ_MEDICAL_DATA_VISITS =
-            PERMISSION_PREFIX + "READ_MEDICAL_DATA_VISITS"
-
-        /**
-         * Allows an application to read the user's vital signs data.
-         *
-         * This feature is dependent on the version of HealthConnect installed on the device. To
-         * check if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-         * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. If not available,
-         * this permission will not be granted if requested.
-         *
-         * @sample androidx.health.connect.client.samples.RequestMedicalPermissions
-         */
-        @ExperimentalPersonalHealthRecordApi
-        const val PERMISSION_READ_MEDICAL_DATA_VITAL_SIGNS =
-            PERMISSION_PREFIX + "READ_MEDICAL_DATA_VITAL_SIGNS"
-
         // Read permissions for ACTIVITY.
         internal const val READ_ACTIVE_CALORIES_BURNED =
             PERMISSION_PREFIX + "READ_ACTIVE_CALORIES_BURNED"
@@ -575,30 +382,6 @@
             )
 
         /**
-         * Exposes all PHR write and read permissions.
-         *
-         * @return A list of permissions as Strings
-         */
-        @OptIn(ExperimentalPersonalHealthRecordApi::class)
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        @JvmField
-        public val ALL_PERSONAL_HEALTH_RECORD_PERMISSIONS: List<String> = buildList {
-            add(PERMISSION_WRITE_MEDICAL_DATA)
-            add(PERMISSION_READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES)
-            add(PERMISSION_READ_MEDICAL_DATA_CONDITIONS)
-            add(PERMISSION_READ_MEDICAL_DATA_LABORATORY_RESULTS)
-            add(PERMISSION_READ_MEDICAL_DATA_MEDICATIONS)
-            add(PERMISSION_READ_MEDICAL_DATA_PERSONAL_DETAILS)
-            add(PERMISSION_READ_MEDICAL_DATA_PRACTITIONER_DETAILS)
-            add(PERMISSION_READ_MEDICAL_DATA_PREGNANCY)
-            add(PERMISSION_READ_MEDICAL_DATA_PROCEDURES)
-            add(PERMISSION_READ_MEDICAL_DATA_SOCIAL_HISTORY)
-            add(PERMISSION_READ_MEDICAL_DATA_VACCINES)
-            add(PERMISSION_READ_MEDICAL_DATA_VISITS)
-            add(PERMISSION_READ_MEDICAL_DATA_VITAL_SIGNS)
-        }
-
-        /**
          * Exposes all write and read permissions.
          *
          * @return A list of permissions as Strings
@@ -611,10 +394,8 @@
                     listOf(WRITE_PERMISSION_PREFIX + it.value, READ_PERMISSION_PREFIX + it.value)
                 }
             )
-            addAll(ALL_PERSONAL_HEALTH_RECORD_PERMISSIONS)
             add(PERMISSION_WRITE_EXERCISE_ROUTE)
             add(PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND)
-            add(PERMISSION_READ_HEALTH_DATA_HISTORY)
         }
     }
 }
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/FhirResource.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/FhirResource.kt
deleted file mode 100644
index 9ee125b..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/FhirResource.kt
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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 android.annotation.SuppressLint
-import androidx.annotation.IntDef
-import androidx.annotation.RestrictTo
-import androidx.health.connect.client.HealthConnectFeatures
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.withPhrFeatureCheck
-import androidx.health.connect.client.impl.platform.records.PlatformFhirResource
-import androidx.health.connect.client.impl.platform.records.PlatformFhirResourceBuilder
-import androidx.health.connect.client.impl.platform.records.toPlatformFhirResourceType
-
-/**
- * A class to capture the FHIR resource data. This is the class used for all supported FHIR resource
- * types, which is a subset of the resource list on
- * [the official FHIR website](https://build.fhir.org/resourcelist.html) and might expand in the
- * future.
- *
- * FHIR stands for the [Fast Healthcare Interoperability Resources](https://hl7.org/fhir/).
- *
- * This feature is dependent on the version of HealthConnect installed on the device. To check if
- * it's available call [HealthConnectFeatures.getFeatureStatus] and pass
- * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An
- * [UnsupportedOperationException] would be thrown if the feature is not available.
- *
- * @property type The type of this FHIR resource. This is extracted from the `resourceType` field in
- *   [data]. The list of supported types is a subset of the resource list on
- *   [the official FHIR website](https://build.fhir.org/resourcelist.html) and might expand in the
- *   future.
- * @property id The FHIR resource ID. This is extracted from the `id` field in [data]. More about
- *   FHIR resource ID in
- *   [https://www.hl7.org/fhir/resource.html#id](https://www.hl7.org/fhir/resource.html#id).
- * @property data The FHIR resource data in JSON representation.
- */
-@ExperimentalPersonalHealthRecordApi
-class FhirResource(@FhirResourceType val type: Int, val id: String, val data: String) {
-    @SuppressLint("NewApi") // already checked with a feature availability check
-    internal val platformFhirResource: PlatformFhirResource =
-        withPhrFeatureCheck(this::class) {
-            PlatformFhirResourceBuilder(type.toPlatformFhirResourceType(), id, data).build()
-        }
-
-    override fun toString() = toString(this, mapOf("type" to type, "id" to id, "data" to data))
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is FhirResource) return false
-
-        if (type != other.type) return false
-        if (id != other.id) return false
-        if (data != other.data) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = type
-        result = 31 * result + id.hashCode()
-        result = 31 * result + data.hashCode()
-        return result
-    }
-
-    companion object {
-        /** FHIR resource type for [Immunization](https://www.hl7.org/fhir/immunization.html). */
-        const val FHIR_RESOURCE_TYPE_IMMUNIZATION = 1
-
-        /**
-         * FHIR resource type for
-         * [AllergyIntolerance](https://www.hl7.org/fhir/allergyintolerance.html).
-         */
-        const val FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE = 2
-
-        /**
-         * FHIR resource type for a [FHIR Observation](https://www.hl7.org/fhir/observation.html).
-         */
-        const val FHIR_RESOURCE_TYPE_OBSERVATION = 3
-
-        /** FHIR resource type for a [FHIR Condition](https://www.hl7.org/fhir/condition.html). */
-        const val FHIR_RESOURCE_TYPE_CONDITION = 4
-
-        /** FHIR resource type for a [FHIR Procedure](https://www.hl7.org/fhir/procedure.html). */
-        const val FHIR_RESOURCE_TYPE_PROCEDURE = 5
-
-        /** FHIR resource type for a [FHIR Medication](https://www.hl7.org/fhir/medication.html). */
-        const val FHIR_RESOURCE_TYPE_MEDICATION = 6
-
-        /**
-         * FHIR resource type for a
-         * [FHIR MedicationRequest](https://www.hl7.org/fhir/medicationrequest.html).
-         */
-        const val FHIR_RESOURCE_TYPE_MEDICATION_REQUEST = 7
-
-        /**
-         * FHIR resource type for a
-         * [FHIR MedicationStatement](https://www.hl7.org/fhir/medicationstatement.html).
-         */
-        const val FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT = 8
-
-        /** FHIR resource type for a [FHIR Patient](https://www.hl7.org/fhir/patient.html). */
-        const val FHIR_RESOURCE_TYPE_PATIENT = 9
-
-        /**
-         * FHIR resource type for a [FHIR Practitioner](https://www.hl7.org/fhir/practitioner.html).
-         */
-        const val FHIR_RESOURCE_TYPE_PRACTITIONER = 10
-
-        /**
-         * FHIR resource type for a
-         * [FHIR PractitionerRole](https://www.hl7.org/fhir/practitionerrole.html).
-         */
-        const val FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE = 11
-
-        /** FHIR resource type for a [FHIR Encounter](https://www.hl7.org/fhir/encounter.html). */
-        const val FHIR_RESOURCE_TYPE_ENCOUNTER = 12
-
-        /** FHIR resource type for a [FHIR Location](https://www.hl7.org/fhir/location.html). */
-        const val FHIR_RESOURCE_TYPE_LOCATION = 13
-
-        /**
-         * FHIR resource type for a [FHIR Organization](https://www.hl7.org/fhir/organization.html).
-         */
-        const val FHIR_RESOURCE_TYPE_ORGANIZATION = 14
-
-        /** List of possible FHIR resource types. */
-        @RestrictTo(RestrictTo.Scope.LIBRARY)
-        @IntDef(
-            FHIR_RESOURCE_TYPE_IMMUNIZATION,
-            FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-            FHIR_RESOURCE_TYPE_OBSERVATION,
-            FHIR_RESOURCE_TYPE_CONDITION,
-            FHIR_RESOURCE_TYPE_PROCEDURE,
-            FHIR_RESOURCE_TYPE_MEDICATION,
-            FHIR_RESOURCE_TYPE_MEDICATION_REQUEST,
-            FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT,
-            FHIR_RESOURCE_TYPE_PATIENT,
-            FHIR_RESOURCE_TYPE_PRACTITIONER,
-            FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE,
-            FHIR_RESOURCE_TYPE_ENCOUNTER,
-            FHIR_RESOURCE_TYPE_LOCATION,
-            FHIR_RESOURCE_TYPE_ORGANIZATION
-        )
-        @Retention(AnnotationRetention.SOURCE)
-        annotation class FhirResourceType
-    }
-}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/FhirVersion.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/FhirVersion.kt
deleted file mode 100644
index 3896052..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/FhirVersion.kt
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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 android.annotation.SuppressLint
-import androidx.health.connect.client.HealthConnectFeatures
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.withPhrFeatureCheck
-import androidx.health.connect.client.impl.platform.records.PlatformFhirVersion
-
-/**
- * Represents the FHIR version. This is designed according to
- * [the official FHIR versions](https://build.fhir.org/versions.html#versions) of the Fast
- * Healthcare Interoperability Resources (FHIR) standard. "label", which represents a 'working'
- * version, is not supported for now.
- *
- * The versions R4 (4.0.1) and R4B (4.3.0) are supported in Health Connect. Use
- * [isSupportedFhirVersion] to check whether a FHIR version is supported.
- *
- * This feature is dependent on the version of HealthConnect installed on the device. To check if
- * it's available call [HealthConnectFeatures.getFeatureStatus] and pass
- * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An
- * [UnsupportedOperationException] would be thrown if the feature is not available.
- */
-@ExperimentalPersonalHealthRecordApi
-class FhirVersion(val major: Int, val minor: Int, val patch: Int) : Comparable<FhirVersion> {
-    @SuppressLint("NewApi") // already checked with a feature availability check
-    internal val platformFhirVersion: PlatformFhirVersion =
-        withPhrFeatureCheck(this::class) {
-            PlatformFhirVersion.parseFhirVersion("$major.$minor.$patch")
-        }
-
-    override fun compareTo(other: FhirVersion): Int {
-        if (major != other.major) {
-            return if (major > other.major) 1 else -1
-        }
-        if (minor != other.minor) {
-            return if (minor > other.minor) 1 else -1
-        }
-        if (patch != other.patch) {
-            return if (patch > other.patch) 1 else -1
-        }
-        return 0
-    }
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is FhirVersion) return false
-
-        if (major != other.major) return false
-        if (minor != other.minor) return false
-        if (patch != other.patch) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = major
-        result = 31 * result + minor
-        result = 31 * result + patch
-        return result
-    }
-
-    override fun toString(): String {
-        return "${this::class.java.simpleName}@${Integer.toHexString(System.identityHashCode(this))}($major.$minor.$patch)"
-    }
-
-    /**
-     * Returns `true` if this [FhirVersion] is supported, `false` otherwise.
-     *
-     * This method is dependent on the version of HealthConnect installed on the device. To check if
-     * it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-     * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument.
-     */
-    @SuppressLint("NewApi") // checked by `getFeatureStatus()`
-    fun isSupportedFhirVersion(): Boolean =
-        withPhrFeatureCheck(this::class, "isSupportedFhirVersion") {
-            platformFhirVersion.isSupportedFhirVersion
-        }
-
-    companion object {
-        private val VERSION_REGEX = Regex("(\\d+)\\.(\\d+)\\.(\\d+)")
-
-        /**
-         * Creates a [FhirVersion] object with the version of string format.
-         *
-         * The format should look like "4.0.1" which contains 3 numbers - major, minor and patch,
-         * separated by ".". This aligns with
-         * [the official FHIR versions](https://build.fhir.org/versions.html#versions). Note that
-         * the "label" is not supported for now, which represents a 'working' version.
-         */
-        @JvmStatic
-        fun parseFhirVersion(fhirVersionString: String): FhirVersion {
-            val result = VERSION_REGEX.find(fhirVersionString)
-            require(result != null) { "Invalid FHIR version string: $fhirVersionString" }
-            return FhirVersion(
-                result.groupValues[1].toInt(),
-                result.groupValues[2].toInt(),
-                result.groupValues[3].toInt()
-            )
-        }
-    }
-}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/MedicalDataSource.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/MedicalDataSource.kt
deleted file mode 100644
index 3a1d593..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/MedicalDataSource.kt
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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 android.annotation.SuppressLint
-import android.net.Uri
-import androidx.health.connect.client.HealthConnectFeatures
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.withPhrFeatureCheck
-import androidx.health.connect.client.impl.platform.records.PlatformMedicalDataSource
-import androidx.health.connect.client.impl.platform.records.PlatformMedicalDataSourceBuilder
-import java.time.Instant
-
-/**
- * A class to hold the data source information of medical data. Each [MedicalResource] is associated
- * with a `MedicalDataSource`.
- *
- * The medical data is represented using the Fast Healthcare Interoperability Resources
- * ([FHIR](https://hl7.org/fhir/)) standard.
- *
- * This feature is dependent on the version of HealthConnect installed on the device. To check if
- * it's available call [HealthConnectFeatures.getFeatureStatus] and pass
- * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An
- * [UnsupportedOperationException] would be thrown if the feature is not available.
- *
- * @property id The unique identifier of this `MedicalDataSource`, generated by HealthConnect at
- *   creation time.
- * @property packageName The package name of the app that created this `MedicalDataSource`.
- * @property fhirBaseUri The FHIR base URI of this `MedicalDataSource`.
- * @property displayName The display name that describes this `MedicalDataSource`. This must be be
- *   unique per app.
- * @property fhirVersion The FHIR version of this `MedicalDataSource`. All [MedicalResource]s
- *   inserted under this `MedicalDataSource` must have the same FHIR version.
- * @property lastDataUpdateTime An [Instant] indicating a point in time when this
- *   `MedicalDataSource` was **last** used to update or insert any [MedicalResource]. `null` if that
- *   has never happened or no data is linked to this `MedicalDataSource`.
- */
-@ExperimentalPersonalHealthRecordApi
-class MedicalDataSource(
-    val id: String,
-    val packageName: String,
-    val fhirBaseUri: Uri,
-    val displayName: String,
-    val fhirVersion: FhirVersion,
-    val lastDataUpdateTime: Instant?
-) {
-    @SuppressLint("NewApi") // already checked with a feature availability check
-    internal val platformMedicalDataSource: PlatformMedicalDataSource =
-        withPhrFeatureCheck(this::class) {
-            PlatformMedicalDataSourceBuilder(
-                    id,
-                    packageName,
-                    fhirBaseUri,
-                    displayName,
-                    fhirVersion.platformFhirVersion
-                )
-                .setLastDataUpdateTime(lastDataUpdateTime)
-                .build()
-        }
-
-    override fun toString() =
-        toString(
-            this,
-            mapOf(
-                "id" to id,
-                "packageName" to packageName,
-                "fhirBaseUri" to fhirBaseUri,
-                "displayName" to displayName,
-                "fhirVersion" to fhirVersion,
-                "lastDataUpdateTime" to lastDataUpdateTime,
-            )
-        )
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (javaClass != other?.javaClass) return false
-
-        other as MedicalDataSource
-
-        if (id != other.id) return false
-        if (packageName != other.packageName) return false
-        if (fhirBaseUri != other.fhirBaseUri) return false
-        if (displayName != other.displayName) return false
-        if (fhirVersion != other.fhirVersion) return false
-        if (lastDataUpdateTime != other.lastDataUpdateTime) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = id.hashCode()
-        result = 31 * result + packageName.hashCode()
-        result = 31 * result + fhirBaseUri.hashCode()
-        result = 31 * result + displayName.hashCode()
-        result = 31 * result + fhirVersion.hashCode()
-        result = 31 * result + (lastDataUpdateTime?.hashCode() ?: 0)
-        return result
-    }
-}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/MedicalResource.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/MedicalResource.kt
deleted file mode 100644
index b542697..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/MedicalResource.kt
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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 android.annotation.SuppressLint
-import androidx.annotation.IntDef
-import androidx.annotation.RestrictTo
-import androidx.health.connect.client.HealthConnectFeatures
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.withPhrFeatureCheck
-import androidx.health.connect.client.impl.platform.records.PlatformMedicalResource
-import androidx.health.connect.client.impl.platform.records.PlatformMedicalResourceBuilder
-import androidx.health.connect.client.impl.platform.records.toPlatformMedicalResourceType
-import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_VACCINES
-import androidx.health.connect.client.records.MedicalResource.Companion.MEDICAL_RESOURCE_TYPE_VACCINES
-
-/**
- * A class to hold medical resource data.
- *
- * Unlike FHIR resource which is represented in Health Connect with [FhirResource],
- * `MedicalResource` is a Health Connect specific concept. A `MedicalResource` contains more than
- * just a [FhirResource], notably, it also contains:
- * - A [dataSourceId] representing ID of a [MedicalDataSource] where data of this `MedicalResource`
- *   come from.
- * - A [MedicalResourceType] indicating how HealthConnect categorizes the [FhirResource]. Each
- *   [MedicalResourceType] is tied to a read permission. For example, a client can only read
- *   `MedicalResource`s with [MEDICAL_RESOURCE_TYPE_VACCINES] if it holds
- *   [PERMISSION_READ_MEDICAL_DATA_VACCINES].
- *
- * The data representation follows the
- * [Fast Healthcare Interoperability Resources (FHIR)](https://hl7.org/fhir/) standard.
- *
- * This feature is dependent on the version of HealthConnect installed on the device. To check if
- * it's available call [HealthConnectFeatures.getFeatureStatus] and pass
- * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An
- * [UnsupportedOperationException] would be thrown if the feature is not available.
- *
- * @property type The [MedicalResourceType] of this `MedicalResource`, this is assigned by Health
- *   Connect at insertion time. Clients should be aware that this list is non exhaustive and may
- *   increase in future releases when additional types will need to be handled.
- * @property id The unique ID of this `MedicalResource` represented by a [MedicalResourceId].
- * @property dataSourceId The ID of the [MedicalDataSource] where this `MedicalResource` comes from.
- * @property fhirVersion The FHIR version of [fhirResource].
- * @property fhirResource The [FhirResource] that this `MedicalResource` represents.
- */
-@ExperimentalPersonalHealthRecordApi
-class MedicalResource(
-    @MedicalResourceType val type: Int,
-    val id: MedicalResourceId,
-    val dataSourceId: String,
-    val fhirVersion: FhirVersion,
-    val fhirResource: FhirResource,
-) {
-    @SuppressLint("NewApi") // already checked with a feature availability check
-    internal val platformMedicalResource: PlatformMedicalResource =
-        withPhrFeatureCheck(this::class) {
-            PlatformMedicalResourceBuilder(
-                    type.toPlatformMedicalResourceType(),
-                    dataSourceId,
-                    fhirVersion.platformFhirVersion,
-                    fhirResource.platformFhirResource
-                )
-                .build()
-        }
-
-    override fun toString(): String =
-        toString(
-            this,
-            mapOf(
-                "type" to type,
-                "dataSourceId" to dataSourceId,
-                "fhirVersion" to fhirVersion,
-                "fhirResource" to fhirResource,
-            )
-        )
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is MedicalResource) return false
-
-        if (type != other.type) return false
-        if (id != other.id) return false
-        if (dataSourceId != other.dataSourceId) return false
-        if (fhirVersion != other.fhirVersion) return false
-        if (fhirResource != other.fhirResource) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = type
-        result = 31 * result + id.hashCode()
-        result = 31 * result + dataSourceId.hashCode()
-        result = 31 * result + fhirVersion.hashCode()
-        result = 31 * result + fhirResource.hashCode()
-        return result
-    }
-
-    companion object {
-        /** Medical resource type that labels data as vaccines. */
-        const val MEDICAL_RESOURCE_TYPE_VACCINES = 1
-
-        /** Medical resource type that labels data as allergies or intolerances. */
-        const val MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES = 2
-
-        /** Medical resource type that labels data as to do with pregnancy. */
-        const val MEDICAL_RESOURCE_TYPE_PREGNANCY = 3
-
-        /** Medical resource type that labels data as social history. */
-        const val MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY = 4
-
-        /** Medical resource type that labels data as vital signs. */
-        const val MEDICAL_RESOURCE_TYPE_VITAL_SIGNS = 5
-
-        /** Medical resource type that labels data as results (Laboratory or pathology). */
-        const val MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS = 6
-
-        /**
-         * Medical resource type that labels data as medical conditions (clinical condition,
-         * problem, diagnosis etc).
-         */
-        const val MEDICAL_RESOURCE_TYPE_CONDITIONS = 7
-
-        /**
-         * Medical resource type that labels data as procedures (actions taken on or for a patient).
-         */
-        const val MEDICAL_RESOURCE_TYPE_PROCEDURES = 8
-
-        /** Medical resource type that labels data as medication related. */
-        const val MEDICAL_RESOURCE_TYPE_MEDICATIONS = 9
-
-        /**
-         * Medical resource type that labels data as related to personal details, including
-         * demographic information such as name, date of birth, and contact details such as address
-         * or telephone numbers.
-         */
-        const val MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS = 10
-
-        /**
-         * Medical resource type that labels data as related to practitioners. This is information
-         * about the doctors, nurses, masseurs, physios, etc who have been involved with the user.
-         */
-        const val MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS = 11
-
-        /**
-         * Medical resource type that labels data as related to an encounter with a practitioner.
-         * This includes visits to healthcare providers and remote encounters such as telephone and
-         * videoconference appointments, and information about the time, location and organization
-         * who is being met.
-         */
-        const val MEDICAL_RESOURCE_TYPE_VISITS = 12
-
-        @RestrictTo(RestrictTo.Scope.LIBRARY)
-        @IntDef(
-            MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
-            MEDICAL_RESOURCE_TYPE_CONDITIONS,
-            MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS,
-            MEDICAL_RESOURCE_TYPE_MEDICATIONS,
-            MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS,
-            MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS,
-            MEDICAL_RESOURCE_TYPE_PREGNANCY,
-            MEDICAL_RESOURCE_TYPE_PROCEDURES,
-            MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY,
-            MEDICAL_RESOURCE_TYPE_VACCINES,
-            MEDICAL_RESOURCE_TYPE_VISITS,
-            MEDICAL_RESOURCE_TYPE_VITAL_SIGNS
-        )
-        @Retention(AnnotationRetention.SOURCE)
-        annotation class MedicalResourceType
-    }
-}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/MedicalResourceId.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/MedicalResourceId.kt
deleted file mode 100644
index baa357d..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/MedicalResourceId.kt
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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 android.annotation.SuppressLint
-import androidx.health.connect.client.HealthConnectFeatures
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.withPhrFeatureCheck
-import androidx.health.connect.client.impl.platform.records.PlatformMedicalResourceId
-import androidx.health.connect.client.impl.platform.records.toPlatformFhirResourceType
-import androidx.health.connect.client.impl.platform.records.toSdkMedicalResourceId
-import androidx.health.connect.client.records.FhirResource.Companion.FhirResourceType
-
-/**
- * A class to represent a unique identifier of a medical resource.
- *
- * This class contains a set of properties that together represent a unique identifier of a
- * [MedicalResource].
- *
- * The medical resource data representation follows the
- * [Fast Healthcare Interoperability Resources (FHIR)](https://hl7.org/fhir/) standard.
- *
- * This feature is dependent on the version of HealthConnect installed on the device. To check if
- * it's available call [HealthConnectFeatures.getFeatureStatus] and pass
- * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An
- * [UnsupportedOperationException] would be thrown if the feature is not available.
- *
- * @property dataSourceId The ID of the [MedicalDataSource] where the data comes from.
- * @property fhirResourceType The type of the FHIR resource. It should be one of the values in
- *   [FhirResourceType].
- * @property fhirResourceId The ID of the FHIR resource. This must be unique per
- *   [MedicalDataSource].
- */
-@ExperimentalPersonalHealthRecordApi
-class MedicalResourceId(
-    val dataSourceId: String,
-    @FhirResourceType val fhirResourceType: Int,
-    val fhirResourceId: String
-) {
-    @SuppressLint("NewApi") // already checked with a feature availability check
-    internal val platformMedicalResourceId: PlatformMedicalResourceId =
-        withPhrFeatureCheck(this::class) {
-            PlatformMedicalResourceId(
-                dataSourceId,
-                fhirResourceType.toPlatformFhirResourceType(),
-                fhirResourceId
-            )
-        }
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is MedicalResourceId) return false
-
-        if (fhirResourceType != other.fhirResourceType) return false
-        if (dataSourceId != other.dataSourceId) return false
-        if (fhirResourceId != other.fhirResourceId) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = fhirResourceType
-        result = 31 * result + dataSourceId.hashCode()
-        result = 31 * result + fhirResourceId.hashCode()
-        return result
-    }
-
-    override fun toString() =
-        toString(
-            this,
-            mapOf(
-                "dataSourceId" to dataSourceId,
-                "fhirResourceType" to fhirResourceType,
-                "fhirResourceId" to fhirResourceId
-            )
-        )
-
-    companion object {
-        /**
-         * Creates a [MedicalResourceId] instance from `dataSourceId` and `fhirReference`.
-         *
-         * This method is dependent on the version of HealthConnect installed on the device. To
-         * check if it's available call [HealthConnectFeatures.getFeatureStatus] and pass
-         * [HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD] as an argument.
-         *
-         * @param dataSourceId Represents ID of a [MedicalDataSource] where the data comes from.
-         * @param fhirReference The FHIR reference string typically extracted from the "reference"
-         *   field in one FHIR resource (source), pointing to another FHIR resource (target) within
-         *   the same data source, for example "Patient/034AB16".
-         * @throws IllegalArgumentException if the provided `dataSourceId` is not a valid ID, the
-         *   referenced resource type is not a valid [FhirResource] type supported by Health
-         *   Connect, or `fhirReference` does not match with the pattern of
-         *   `$fhir_resource_type/$fhir_resource_id`, where the FHIR resource type should align with
-         *   the resource list in
-         *   [the official FHIR website](https://build.fhir.org/resourcelist.html), and the FHIR
-         *   resource ID should also follow the pattern described in
-         *   [the official FHIR datatypes](https://build.fhir.org/datatypes.html#id).
-         */
-        @SuppressLint("NewApi") // checked with feature availability
-        @JvmStatic
-        fun fromFhirReference(dataSourceId: String, fhirReference: String): MedicalResourceId =
-            withPhrFeatureCheck(this::class, "fromFhirReference") {
-                PlatformMedicalResourceId.fromFhirReference(dataSourceId, fhirReference)
-                    .toSdkMedicalResourceId()
-            }
-    }
-}
diff --git a/health/connect/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
index b17eb15..402e1ab 100644
--- a/health/connect/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
@@ -52,11 +52,3 @@
     requireNotLess(min, name)
     requireNotMore(max, name)
 }
-
-internal fun toString(obj: Any, fieldMap: Map<String, Any?>): String {
-    val content =
-        fieldMap.entries.joinToString(separator = ", ", prefix = "(", postfix = ")") {
-            "${it.key}=${it.value}"
-        }
-    return "${obj.javaClass.simpleName}@${Integer.toHexString(System.identityHashCode(obj))}: $content"
-}
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
index 2bc628b..72fd060 100644
--- 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
@@ -34,8 +34,9 @@
     @param:RecordingMethod @property:RecordingMethod @get:RecordingMethod val recordingMethod: Int,
 
     /**
-     * Unique identifier of this data, assigned by Health Connect at insertion time. When [Record]
-     * is created before insertion, this takes a sentinel value, any assigned value will be ignored.
+     * 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 id: String = EMPTY_ID,
 
diff --git a/health/connect/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
index bba3fed..25cab19 100644
--- a/health/connect/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
@@ -21,7 +21,7 @@
 import androidx.health.connect.client.time.TimeRangeFilter
 
 /**
- * Request object to read aggregations for given [AggregateMetric]s in Health Connect.
+ * Request object to read aggregations for given [AggregateMetric]s in Android Health Platform.
  *
  * @param metrics Set of [AggregateMetric]s to aggregate.
  * @param timeRangeFilter The [TimeRangeFilter] to read from.
diff --git a/health/connect/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
index 21d8b20..0a42c02c 100644
--- a/health/connect/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
@@ -21,7 +21,7 @@
 import kotlin.reflect.KClass
 
 /**
- * Request object to fetch Changes-Token for given [recordTypes] in Health Connect.
+ * Request object to fetch Changes-Token for given [recordTypes] in Android Health Platform.
  *
  * @param recordTypes Set of [Record] types the token will observe change for.
  * @param dataOriginFilters Optional set of [DataOrigin] filters, default is empty set for no
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/CreateMedicalDataSourceRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/CreateMedicalDataSourceRequest.kt
deleted file mode 100644
index 088a6f0..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/CreateMedicalDataSourceRequest.kt
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.request
-
-import android.annotation.SuppressLint
-import android.net.Uri
-import androidx.health.connect.client.HealthConnectFeatures
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_PERSONAL_HEALTH_RECORD
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.withPhrFeatureCheck
-import androidx.health.connect.client.impl.platform.request.PlatformCreateMedicalDataSourceRequest
-import androidx.health.connect.client.impl.platform.request.PlatformCreateMedicalDataSourceRequestBuilder
-import androidx.health.connect.client.records.FhirVersion
-import androidx.health.connect.client.records.toString
-import kotlin.String
-
-/**
- * A create request for
- * [androidx.health.connect.client.HealthConnectClient.createMedicalDataSource].
- *
- * The medical data is represented using the Fast Healthcare Interoperability Resources
- * ([FHIR](https://hl7.org/fhir/)) standard.
- *
- * This feature is dependent on the version of HealthConnect installed on the device. To check if
- * it's available call [HealthConnectFeatures.getFeatureStatus] and pass
- * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
- * thrown if the feature is not available.
- *
- * @property fhirBaseUri The FHIR base URI of the data source. For data coming from a FHIR server
- *   this should be the [FHIR base URL](https://hl7.org/fhir/R4/http.html#root) (e.g.
- *   `https://example.com/fhir/`). If the data is generated by an app without a FHIR URL,
- *   `fhirBaseUri` should be a unique and understandable URI defined by the app (e.g. `myapp://..`)
- *   that points to the source of the data. As an example, if a client app supports an
- *   [app deep linking](https://developer.android.com/training/app-links/deep-linking), this
- *   deeplink could be used as [fhirBaseUri]. The maximum length for the URI is 2000 characters.
- * @property displayName The display name that describes the data source. The maximum length for the
- *   display name is 90 characters. This must be unique per app.
- * @property fhirVersion The FHIR version of the medical data that will be linked to this data
- *   source. This has to be a version supported by Health Connect, as documented on the
- *   [FhirVersion].
- */
-@ExperimentalPersonalHealthRecordApi
-class CreateMedicalDataSourceRequest(
-    val fhirBaseUri: Uri,
-    val displayName: String,
-    val fhirVersion: FhirVersion
-) {
-    @SuppressLint("NewApi") // already checked with a feature availability check
-    internal val platformCreateMedicalDataSourceRequest: PlatformCreateMedicalDataSourceRequest =
-        withPhrFeatureCheck(this::class) {
-            PlatformCreateMedicalDataSourceRequestBuilder(
-                    fhirBaseUri,
-                    displayName,
-                    fhirVersion.platformFhirVersion
-                )
-                .build()
-        }
-
-    override fun toString() =
-        toString(
-            this,
-            mapOf(
-                "fhirBaseUri" to fhirBaseUri,
-                "displayName" to displayName,
-                "fhirVersion" to fhirVersion
-            )
-        )
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (javaClass != other?.javaClass) return false
-
-        other as CreateMedicalDataSourceRequest
-
-        if (fhirBaseUri != other.fhirBaseUri) return false
-        if (displayName != other.displayName) return false
-        if (fhirVersion != other.fhirVersion) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = fhirBaseUri.hashCode()
-        result = 31 * result + displayName.hashCode()
-        result = 31 * result + fhirVersion.hashCode()
-        return result
-    }
-}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/DeleteMedicalResourcesRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/DeleteMedicalResourcesRequest.kt
deleted file mode 100644
index bf79764..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/DeleteMedicalResourcesRequest.kt
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.request
-
-import android.annotation.SuppressLint
-import androidx.health.connect.client.HealthConnectClient
-import androidx.health.connect.client.HealthConnectFeatures
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_PERSONAL_HEALTH_RECORD
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.withPhrFeatureCheck
-import androidx.health.connect.client.impl.platform.request.PlatformDeleteMedicalResourcesRequest
-import androidx.health.connect.client.impl.platform.request.PlatformDeleteMedicalResourcesRequestBuilder
-import androidx.health.connect.client.records.MedicalDataSource
-import androidx.health.connect.client.records.MedicalResource
-import androidx.health.connect.client.records.MedicalResource.Companion.MedicalResourceType
-import androidx.health.connect.client.records.toString
-
-/**
- * A class to delete [MedicalResource]s with [HealthConnectClient.deleteMedicalResources].
- *
- * At least one of [dataSourceIds] and [medicalResourceTypes] must be non-empty.
- *
- * This feature is dependent on the version of HealthConnect installed on the device. To check if
- * it's available call [HealthConnectFeatures.getFeatureStatus] and pass
- * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
- * thrown if the feature is not available.
- *
- * @property dataSourceIds IDs of [MedicalDataSource]s to delete [MedicalResource]s from. This being
- *   empty is equivalent as if all [MedicalDataSource]s are set.
- * @property medicalResourceTypes [MedicalResourceType]s of [MedicalResource]s to delete. This being
- *   empty is equivalent as if all [MedicalResourceType]s are set.
- * @throws IllegalArgumentException if both of [dataSourceIds] and [medicalResourceTypes] are empty.
- * @see [HealthConnectClient.deleteMedicalResources]
- */
-@ExperimentalPersonalHealthRecordApi
-class DeleteMedicalResourcesRequest(
-    val dataSourceIds: Set<String> = emptySet<String>(),
-    val medicalResourceTypes: Set<Int> = emptySet<Int>()
-) {
-    @SuppressLint("NewApi") // already checked with a feature availability check
-    internal val platformReadMedicalResourcesRequest: PlatformDeleteMedicalResourcesRequest =
-        withPhrFeatureCheck(this::class) {
-            PlatformDeleteMedicalResourcesRequestBuilder()
-                .also { builder -> dataSourceIds.forEach { builder.addDataSourceId(it) } }
-                .also { builder ->
-                    medicalResourceTypes.forEach { builder.addMedicalResourceType(it) }
-                }
-                .build()
-        }
-
-    override fun toString() =
-        toString(
-            this,
-            mapOf("dataSourceIds" to dataSourceIds, "medicalResourceTypes" to medicalResourceTypes)
-        )
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is DeleteMedicalResourcesRequest) return false
-
-        if (dataSourceIds != other.dataSourceIds) return false
-        if (medicalResourceTypes != other.medicalResourceTypes) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = dataSourceIds.hashCode()
-        result = 31 * result + medicalResourceTypes.hashCode()
-        return result
-    }
-}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/GetMedicalDataSourcesRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/GetMedicalDataSourcesRequest.kt
deleted file mode 100644
index 884def7..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/GetMedicalDataSourcesRequest.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.request
-
-import android.annotation.SuppressLint
-import androidx.health.connect.client.HealthConnectClient
-import androidx.health.connect.client.HealthConnectFeatures
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_PERSONAL_HEALTH_RECORD
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.withPhrFeatureCheck
-import androidx.health.connect.client.impl.platform.request.PlatformGetMedicalDataSourcesRequest
-import androidx.health.connect.client.impl.platform.request.PlatformGetMedicalDataSourcesRequestBuilder
-import androidx.health.connect.client.records.MedicalDataSource
-import androidx.health.connect.client.records.toString
-
-/**
- * Request to read medical data sources using [HealthConnectManager#getMedicalDataSources]
- *
- * If no package names are set in a request, all data sources from all packages will be returned.
- * Otherwise the response is limited to the requested package names per permission enforced in
- * [HealthConnectClient.getMedicalDataSources]
- *
- * This feature is dependent on the version of HealthConnect installed on the device. To check if
- * it's available call [HealthConnectFeatures.getFeatureStatus] and pass
- * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
- * thrown if the feature is not available.
- *
- * @property packageNames Only [MedicalDataSource]s created by the apps with these package names
- *   will be returned.
- */
-@ExperimentalPersonalHealthRecordApi
-class GetMedicalDataSourcesRequest(val packageNames: List<String>) {
-
-    @SuppressLint("NewApi") // already checked with a feature availability check
-    internal val platformGetMedicalDataSourcesRequest: PlatformGetMedicalDataSourcesRequest =
-        withPhrFeatureCheck(this::class) {
-            PlatformGetMedicalDataSourcesRequestBuilder()
-                .apply { packageNames.forEach { addPackageName(it) } }
-                .build()
-        }
-
-    override fun toString() =
-        toString(
-            this,
-            mapOf(
-                "packageNames" to packageNames,
-            )
-        )
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (javaClass != other?.javaClass) return false
-
-        other as GetMedicalDataSourcesRequest
-
-        if (packageNames != other.packageNames) return false
-        if (platformGetMedicalDataSourcesRequest != other.platformGetMedicalDataSourcesRequest)
-            return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = packageNames.hashCode()
-        result = 31 * result + platformGetMedicalDataSourcesRequest.hashCode()
-        return result
-    }
-}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/ReadMedicalResourcesInitialRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/ReadMedicalResourcesInitialRequest.kt
deleted file mode 100644
index a76493a..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/ReadMedicalResourcesInitialRequest.kt
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.request
-
-import android.annotation.SuppressLint
-import androidx.health.connect.client.HealthConnectClient
-import androidx.health.connect.client.HealthConnectFeatures
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_PERSONAL_HEALTH_RECORD
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.withPhrFeatureCheck
-import androidx.health.connect.client.impl.platform.records.toPlatformMedicalResourceType
-import androidx.health.connect.client.impl.platform.request.PlatformReadMedicalResourcesInitialRequestBuilder
-import androidx.health.connect.client.impl.platform.request.PlatformReadMedicalResourcesRequest
-import androidx.health.connect.client.records.MedicalDataSource
-import androidx.health.connect.client.records.MedicalResource
-import androidx.health.connect.client.records.MedicalResource.Companion.MedicalResourceType
-import androidx.health.connect.client.records.toString
-import androidx.health.connect.client.request.ReadMedicalResourcesRequest.Companion.DEFAULT_PAGE_SIZE
-
-/**
- * A class to make **initial** requests when reading [MedicalResource]s with
- * [HealthConnectClient.readMedicalResources].
- *
- * This feature is dependent on the version of HealthConnect installed on the device. To check if
- * it's available call [HealthConnectFeatures.getFeatureStatus] and pass
- * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
- * thrown if the feature is not available.
- *
- * @property pageSize The maximum number of [MedicalResource]s to be read. Default value is
- *   [DEFAULT_PAGE_SIZE]. An [IllegalArgumentException] might be thrown if [pageSize] is deemed as
- *   invalid, such as too large.
- * @property medicalResourceType Only [MedicalResource]s with this [MedicalResourceType] will be
- *   returned. An [IllegalArgumentException] might be thrown if an invalid type is used, see
- *   [MedicalResourceType] for valid values.
- * @property medicalDataSourceIds Only [MedicalResource]s belong to one of the [MedicalDataSource]s
- *   represented by these IDs will be returned. An empty set is permitted, it means
- *   [MedicalResource]s from all available apps will be included in the response. An
- *   [IllegalArgumentException] might be thrown if any ID is deemed as invalid.
- * @see [HealthConnectClient.readMedicalResources]
- */
-@ExperimentalPersonalHealthRecordApi
-class ReadMedicalResourcesInitialRequest(
-    @MedicalResourceType val medicalResourceType: Int,
-    val medicalDataSourceIds: Set<String>,
-    pageSize: Int = DEFAULT_PAGE_SIZE
-) : ReadMedicalResourcesRequest(pageSize) {
-    @SuppressLint("NewApi") // already checked with a feature availability check
-    override val platformReadMedicalResourcesRequest: PlatformReadMedicalResourcesRequest =
-        withPhrFeatureCheck(this::class) {
-            PlatformReadMedicalResourcesInitialRequestBuilder(
-                    medicalResourceType.toPlatformMedicalResourceType()
-                )
-                .addDataSourceIds(medicalDataSourceIds)
-                .setPageSize(pageSize)
-                .build()
-        }
-
-    override fun toString(): String =
-        toString(
-            this,
-            mapOf(
-                "medicalResourceType" to medicalResourceType,
-                "medicalDataSourceIds" to medicalDataSourceIds,
-                "pageSize" to pageSize,
-            )
-        )
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is ReadMedicalResourcesInitialRequest) return false
-        if (!super.equals(other)) return false
-
-        if (medicalResourceType != other.medicalResourceType) return false
-        if (medicalDataSourceIds != other.medicalDataSourceIds) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = super.hashCode()
-        result = 31 * result + medicalResourceType
-        result = 31 * result + medicalDataSourceIds.hashCode()
-        return result
-    }
-}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/ReadMedicalResourcesPageRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/ReadMedicalResourcesPageRequest.kt
deleted file mode 100644
index f1dc250..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/ReadMedicalResourcesPageRequest.kt
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.request
-
-import android.annotation.SuppressLint
-import androidx.health.connect.client.HealthConnectClient
-import androidx.health.connect.client.HealthConnectFeatures
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_PERSONAL_HEALTH_RECORD
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.withPhrFeatureCheck
-import androidx.health.connect.client.impl.platform.request.PlatformReadMedicalResourcesPageRequestBuilder
-import androidx.health.connect.client.impl.platform.request.PlatformReadMedicalResourcesRequest
-import androidx.health.connect.client.records.MedicalResource
-import androidx.health.connect.client.records.toString
-import androidx.health.connect.client.request.ReadMedicalResourcesRequest.Companion.DEFAULT_PAGE_SIZE
-import androidx.health.connect.client.response.ReadMedicalResourcesResponse
-
-/**
- * A class to make **subsequent** requests when reading [MedicalResource]s with
- * [HealthConnectClient.readMedicalResources].
- *
- * This class should only be used after a successful initial request has been made with
- * [ReadMedicalResourcesInitialRequest].
- *
- * This feature is dependent on the version of HealthConnect installed on the device. To check if
- * it's available call [HealthConnectFeatures.getFeatureStatus] and pass
- * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
- * thrown if the feature is not available.
- *
- * @property pageSize The maximum number of [MedicalResource]s to be read. Default value is
- *   [DEFAULT_PAGE_SIZE]. An [IllegalArgumentException] might be thrown if [pageSize] is deemed as
- *   invalid, such as too large.
- * @property pageToken The token to read the next page, this should be obtained from
- *   [ReadMedicalResourcesResponse.nextPageToken].
- * @see [HealthConnectClient.readMedicalResources]
- */
-@ExperimentalPersonalHealthRecordApi
-class ReadMedicalResourcesPageRequest(val pageToken: String, pageSize: Int = DEFAULT_PAGE_SIZE) :
-    ReadMedicalResourcesRequest(pageSize) {
-
-    @SuppressLint("NewApi") // already checked with a feature availability check
-    override val platformReadMedicalResourcesRequest: PlatformReadMedicalResourcesRequest =
-        withPhrFeatureCheck(this::class) {
-            PlatformReadMedicalResourcesPageRequestBuilder(pageToken).setPageSize(pageSize).build()
-        }
-
-    override fun toString(): String =
-        toString(
-            this,
-            mapOf(
-                "pageToken" to pageToken,
-                "pageSize" to pageSize,
-            )
-        )
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is ReadMedicalResourcesPageRequest) return false
-        if (!super.equals(other)) return false
-
-        if (pageToken != other.pageToken) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = super.hashCode()
-        result = 31 * result + pageToken.hashCode()
-        return result
-    }
-}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/ReadMedicalResourcesRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/ReadMedicalResourcesRequest.kt
deleted file mode 100644
index cbfb4be..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/ReadMedicalResourcesRequest.kt
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.request
-
-import androidx.health.connect.client.HealthConnectClient
-import androidx.health.connect.client.HealthConnectFeatures
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_PERSONAL_HEALTH_RECORD
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.impl.platform.request.PlatformReadMedicalResourcesRequest
-import androidx.health.connect.client.records.MedicalResource
-
-/**
- * A base class for reading [MedicalResource]s with [HealthConnectClient.readMedicalResources].
- *
- * This feature is dependent on the version of HealthConnect installed on the device. To check if
- * it's available call [HealthConnectFeatures.getFeatureStatus] and pass
- * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
- * thrown if the feature is not available.
- *
- * @property pageSize The maximum number of [MedicalResource]s to be read.
- * @see [HealthConnectClient.readMedicalResources]
- */
-@ExperimentalPersonalHealthRecordApi
-abstract class ReadMedicalResourcesRequest internal constructor(val pageSize: Int) {
-    internal abstract val platformReadMedicalResourcesRequest: PlatformReadMedicalResourcesRequest
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is ReadMedicalResourcesRequest) return false
-
-        if (pageSize != other.pageSize) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        return pageSize
-    }
-
-    companion object {
-        /** Default value for [ReadMedicalResourcesRequest.pageSize]. */
-        const val DEFAULT_PAGE_SIZE = 1000
-    }
-}
diff --git a/health/connect/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
index c3c69f3..f0120f9 100644
--- a/health/connect/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
@@ -45,7 +45,8 @@
     )
 
 /**
- * Request object to read [Record]s in Health Connect determined by time range and other filters.
+ * Request object to read [Record]s in Android Health Platform determined by time range and other
+ * filters.
  *
  * Returned collection will contain a
  * [androidx.health.connect.client.response.ReadRecordsResponse.pageToken] if number of records
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/UpsertMedicalResourceRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/UpsertMedicalResourceRequest.kt
deleted file mode 100644
index ffe3931..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/UpsertMedicalResourceRequest.kt
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.request
-
-import android.annotation.SuppressLint
-import androidx.health.connect.client.HealthConnectFeatures
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.feature.withPhrFeatureCheck
-import androidx.health.connect.client.impl.platform.request.PlatformUpsertMedicalResourceRequest
-import androidx.health.connect.client.impl.platform.request.PlatformUpsertMedicalResourceRequestBuilder
-import androidx.health.connect.client.records.FhirVersion
-import androidx.health.connect.client.records.MedicalDataSource
-import androidx.health.connect.client.records.MedicalResource
-import androidx.health.connect.client.records.MedicalResourceId
-import androidx.health.connect.client.records.toString
-
-/**
- * A request class for both inserting and updating [MedicalResource]s.
- *
- * From [dataSourceId], fhir resource type and fhir resource ID extracted from [data], a
- * [MedicalResourceId] will be constructed. If there already exists a [MedicalResource] with that
- * [MedicalResourceId] in Health Connect, then that [MedicalResource] will be updated, otherwise a
- * new [MedicalResource] will be inserted.
- *
- * The data representation follows the
- * [Fast Healthcare Interoperability Resources (FHIR)](https://hl7.org/fhir/) standard.
- *
- * This feature is dependent on the version of HealthConnect installed on the device. To check if
- * it's available call [HealthConnectFeatures.getFeatureStatus] and pass
- * [HealthConnectFeatures.Companion.FEATURE_PERSONAL_HEALTH_RECORD] as an argument.
- *
- * @property dataSourceId The ID of an **existing** [MedicalDataSource] where the data being
- *   inserted comes from.
- * @property fhirVersion The FHIR version being used for [data]. This must match [dataSourceId]'s
- *   [MedicalDataSource.fhirVersion].
- * @property data The FHIR resource data in JSON representation.
- */
-@ExperimentalPersonalHealthRecordApi
-class UpsertMedicalResourceRequest(
-    val dataSourceId: String,
-    val fhirVersion: FhirVersion,
-    val data: String
-) {
-    @SuppressLint("NewApi") // already checked with a feature availability check
-    internal val platformUpsertMedicalResourceRequest: PlatformUpsertMedicalResourceRequest =
-        withPhrFeatureCheck(UpsertMedicalResourceRequest::class.java.simpleName) {
-            PlatformUpsertMedicalResourceRequestBuilder(
-                    dataSourceId,
-                    fhirVersion.platformFhirVersion,
-                    data
-                )
-                .build()
-        }
-
-    override fun toString(): String =
-        toString(
-            this,
-            mapOf(
-                "dataSourceId" to dataSourceId,
-                "fhirVersion" to fhirVersion,
-                "data" to data,
-            )
-        )
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is UpsertMedicalResourceRequest) return false
-
-        if (dataSourceId != other.dataSourceId) return false
-        if (fhirVersion != other.fhirVersion) return false
-        if (data != other.data) return false
-        if (platformUpsertMedicalResourceRequest != other.platformUpsertMedicalResourceRequest)
-            return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = dataSourceId.hashCode()
-        result = 31 * result + fhirVersion.hashCode()
-        result = 31 * result + data.hashCode()
-        result = 31 * result + platformUpsertMedicalResourceRequest.hashCode()
-        return result
-    }
-}
diff --git a/health/connect/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
index 0bfdf52..b2d38ab 100644
--- a/health/connect/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
@@ -24,7 +24,7 @@
  * If [changesTokenExpired] is true, clients need to generate a new one. This typically happens when
  * clients have not synced changelog for extended period of time.
  *
- * @property changes List of observed changes from Health Connect.
+ * @property changes List of observed changes from Android Health Platform.
  * @property nextChangesToken Changes-token to keep for future calls.
  * @property hasMore Whether there are more changes available to be fetched again.
  * @property changesTokenExpired Whether requested Changes-Token has expired.
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/response/ReadMedicalResourcesResponse.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/response/ReadMedicalResourcesResponse.kt
deleted file mode 100644
index 6c69b86..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/response/ReadMedicalResourcesResponse.kt
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.response
-
-import androidx.health.connect.client.HealthConnectClient
-import androidx.health.connect.client.HealthConnectFeatures
-import androidx.health.connect.client.HealthConnectFeatures.Companion.FEATURE_PERSONAL_HEALTH_RECORD
-import androidx.health.connect.client.feature.ExperimentalPersonalHealthRecordApi
-import androidx.health.connect.client.records.MedicalResource
-import androidx.health.connect.client.records.toString
-import androidx.health.connect.client.request.ReadMedicalResourcesPageRequest
-
-/**
- * A class to hold responses for requests made with [HealthConnectClient.readMedicalResources].
- *
- * This feature is dependent on the version of HealthConnect installed on the device. To check if
- * it's available call [HealthConnectFeatures.getFeatureStatus] and pass
- * [FEATURE_PERSONAL_HEALTH_RECORD] as an argument. An [UnsupportedOperationException] would be
- * thrown if the feature is not available.
- *
- * @property medicalResources A list of [MedicalResource]s.
- * @property nextPageToken A token which can be used with [ReadMedicalResourcesPageRequest] to read
- *   the next page. `null` if there are no more pages available.
- * @property remainingCount The total number of [MedicalResource]s remaining, excluding the ones in
- *   this response.
- * @see [HealthConnectClient.readMedicalResources]
- */
-@ExperimentalPersonalHealthRecordApi
-class ReadMedicalResourcesResponse(
-    val medicalResources: List<MedicalResource>,
-    val nextPageToken: String?,
-    val remainingCount: Int
-) {
-    override fun toString(): String =
-        toString(
-            this,
-            mapOf(
-                "medicalResources" to medicalResources,
-                "nextPageToken" to nextPageToken,
-                "remainingCount" to remainingCount
-            )
-        )
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is ReadMedicalResourcesResponse) return false
-
-        if (remainingCount != other.remainingCount) return false
-        if (medicalResources != other.medicalResources) return false
-        if (nextPageToken != other.nextPageToken) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = remainingCount
-        result = 31 * result + medicalResources.hashCode()
-        result = 31 * result + (nextPageToken?.hashCode() ?: 0)
-        return result
-    }
-}
diff --git a/health/connect/connect-client/src/test/java/androidx/health/connect/client/feature/HealthConnectFeaturesPlatformImplTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/feature/HealthConnectFeaturesPlatformImplTest.kt
index cf4c11a..9d9e453 100644
--- a/health/connect/connect-client/src/test/java/androidx/health/connect/client/feature/HealthConnectFeaturesPlatformImplTest.kt
+++ b/health/connect/connect-client/src/test/java/androidx/health/connect/client/feature/HealthConnectFeaturesPlatformImplTest.kt
@@ -22,6 +22,7 @@
 import androidx.health.connect.client.feature.HealthConnectFeaturesPlatformImpl.Companion.getFeatureStatus
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import com.google.common.truth.Truth.assertThat
+import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.annotation.Config
@@ -33,8 +34,8 @@
 private const val FEATURE_ADDED_IN_CURRENT_U_EXT = 4
 private const val FEATURE_ADDED_IN_V = 5
 
-private const val PREVIOUS_U_EXT = 11
-private const val CURRENT_U_EXT = 12
+private const val PREVIOUS_U_EXT = 12
+private const val CURRENT_U_EXT = 13
 private val FEATURE_TO_VERSION_INFO_MAP: Map<Int, HealthConnectVersionInfo> =
     mapOf(
         FEATURE_ADDED_IN_U to
@@ -68,12 +69,10 @@
 
 // TODO(b/271840604): Added test case for Android V once this library compiles against SDK 35.
 @RunWith(AndroidJUnit4::class)
-@Config(
-    minSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE,
-    maxSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE
-)
+@Config(minSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
 class HealthConnectFeaturesPlatformImplTest {
 
+    @Ignore // b/376314864
     @Test
     fun getFeatureStatus_currentUExtension() {
         setUExtensionLevel(CURRENT_U_EXT)
@@ -86,6 +85,7 @@
         assertUnavailable(FEATURE_ADDED_IN_V, FEATURE_NON_EXISTENT)
     }
 
+    @Ignore // b/376314864
     @Test
     fun getFeatureStatus_previousUExtension() {
         setUExtensionLevel(PREVIOUS_U_EXT)
diff --git a/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/HealthConnectClientImplTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/HealthConnectClientImplTest.kt
index b197c38..0484e26 100644
--- a/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/HealthConnectClientImplTest.kt
+++ b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/HealthConnectClientImplTest.kt
@@ -137,9 +137,7 @@
 
 @Suppress("GoodTime") // Safe to use in test setup
 @RunWith(AndroidJUnit4::class)
-@OptIn(
-    kotlinx.coroutines.ExperimentalCoroutinesApi::class,
-)
+@OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
 class HealthConnectClientImplTest {
 
     private lateinit var healthConnectClient: HealthConnectClientImpl
diff --git a/health/connect/connect-testing/build.gradle b/health/connect/connect-testing/build.gradle
index 4ea267e..8d7085f 100644
--- a/health/connect/connect-testing/build.gradle
+++ b/health/connect/connect-testing/build.gradle
@@ -47,7 +47,7 @@
     }
     namespace = "androidx.health.connect.testing"
     testOptions.unitTests.includeAndroidResources = true
-    compileSdk = 36
+    compileSdk = 35
 }
 
 androidx {
diff --git a/health/connect/connect-testing/samples/build.gradle b/health/connect/connect-testing/samples/build.gradle
index c79f293..6cc75d9 100644
--- a/health/connect/connect-testing/samples/build.gradle
+++ b/health/connect/connect-testing/samples/build.gradle
@@ -51,5 +51,5 @@
     defaultConfig {
         minSdk = 26
     }
-    compileSdk = 36
+    compileSdk = 35
 }
diff --git a/hilt/integration-tests/viewmodelapp/build.gradle b/hilt/integration-tests/viewmodelapp/build.gradle
index e3dbeec..6e7d83b 100644
--- a/hilt/integration-tests/viewmodelapp/build.gradle
+++ b/hilt/integration-tests/viewmodelapp/build.gradle
@@ -37,13 +37,13 @@
 }
 
 dependencies {
-    implementation("androidx.activity:activity:1.10.1")
+    implementation(project(":activity:activity-ktx"))
     implementation(project(":fragment:fragment-ktx"))
     implementation(libs.kotlinStdlib)
     implementation(libs.hiltAndroid)
     ksp(libs.hiltCompiler)
 
-    androidTestImplementation("androidx.activity:activity:1.10.1")
+    androidTestImplementation(project(":activity:activity-ktx"))
     androidTestImplementation(project(":fragment:fragment-ktx"))
     androidTestImplementation(libs.truth)
     androidTestImplementation(libs.testCore)
diff --git a/hilt/integration-tests/workerapp/build.gradle b/hilt/integration-tests/workerapp/build.gradle
index 3a116fb..cab8619 100644
--- a/hilt/integration-tests/workerapp/build.gradle
+++ b/hilt/integration-tests/workerapp/build.gradle
@@ -37,7 +37,7 @@
 }
 
 dependencies {
-    implementation("androidx.activity:activity:1.10.1")
+    implementation(project(":activity:activity"))
     implementation(project(":work:work-runtime-ktx"))
     implementation(project(":hilt:hilt-work"))
     ksp(project(":hilt:hilt-compiler"))
@@ -45,7 +45,7 @@
     implementation(libs.hiltAndroid)
     ksp(libs.hiltCompiler)
 
-    androidTestImplementation("androidx.activity:activity:1.10.1")
+    androidTestImplementation(project(":activity:activity"))
     androidTestImplementation(libs.truth)
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testExtJunit)
diff --git a/javascriptengine/javascriptengine/src/androidTest/java/androidx/javascriptengine/WebViewJavaScriptSandboxTest.java b/javascriptengine/javascriptengine/src/androidTest/java/androidx/javascriptengine/WebViewJavaScriptSandboxTest.java
index 2315800..250957c 100644
--- a/javascriptengine/javascriptengine/src/androidTest/java/androidx/javascriptengine/WebViewJavaScriptSandboxTest.java
+++ b/javascriptengine/javascriptengine/src/androidTest/java/androidx/javascriptengine/WebViewJavaScriptSandboxTest.java
@@ -34,7 +34,6 @@
 import org.junit.Assert;
 import org.junit.Assume;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -849,7 +848,6 @@
 
     @Test
     @LargeTest
-    @Ignore("b/401528686")
     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
@@ -954,7 +952,6 @@
 
     @Test
     @LargeTest
-    @Ignore("b/401528686")
     public void testIsolateCreationAfterOom() throws Throwable {
         final long maxHeapSize = REASONABLE_HEAP_SIZE;
         // We need to beat the v8 optimizer to ensure it really allocates the required memory. Note
@@ -1501,7 +1498,6 @@
 
     @Test
     @LargeTest
-    @Ignore("b/401528686")
     public void testOomOutsideOfEvaluation() throws Throwable {
         final Context context = ApplicationProvider.getApplicationContext();
         final ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
diff --git a/libraryversions.toml b/libraryversions.toml
index 91dda80..e59cca5 100644
--- a/libraryversions.toml
+++ b/libraryversions.toml
@@ -4,9 +4,9 @@
 ANNOTATION_EXPERIMENTAL = "1.5.0-alpha01"
 APPCOMPAT = "1.8.0-alpha01"
 APPFUNCTIONS = "1.0.0-alpha01"
-APPSEARCH = "1.1.0"
+APPSEARCH = "1.1.0-rc01"
 ARCH_CORE = "2.3.0-alpha01"
-ASYNCLAYOUTINFLATER = "1.1.0"
+ASYNCLAYOUTINFLATER = "1.1.0-rc01"
 AUTOFILL = "1.3.0-rc01"
 BENCHMARK = "1.4.0-alpha10"
 BIOMETRIC = "1.4.0-alpha03"
@@ -22,16 +22,16 @@
 CAR_APP = "1.8.0-alpha01"
 COLLECTION = "1.5.0"
 COMPOSE = "1.9.0-alpha01"
-COMPOSE_MATERIAL3 = "1.4.0-alpha11"
-COMPOSE_MATERIAL3_ADAPTIVE = "1.2.0-alpha02"
+COMPOSE_MATERIAL3 = "1.4.0-alpha10"
+COMPOSE_MATERIAL3_ADAPTIVE = "1.2.0-alpha01"
 COMPOSE_MATERIAL3_COMMON = "1.0.0-alpha01"
-COMPOSE_MATERIAL3_XR = "1.0.0-alpha06"
+COMPOSE_MATERIAL3_XR = "1.0.0-alpha05"
 COMPOSE_RUNTIME = "1.9.0-alpha01"
 CONSTRAINTLAYOUT = "2.3.0-alpha01"
 CONSTRAINTLAYOUT_COMPOSE = "1.2.0-alpha01"
 CONSTRAINTLAYOUT_CORE = "1.2.0-alpha01"
 COORDINATORLAYOUT = "1.3.0-rc01"
-CORE = "1.16.0-rc01"
+CORE = "1.16.0-beta01"
 CORE_ANIMATION = "1.0.0"
 CORE_ANIMATION_TESTING = "1.0.0"
 CORE_APPDIGEST = "1.0.0-alpha01"
@@ -59,7 +59,7 @@
 DOCUMENTFILE = "1.1.0-alpha02"
 DRAGANDDROP = "1.1.0-alpha01"
 DRAWERLAYOUT = "1.3.0-alpha01"
-DYNAMICANIMATION = "1.1.0"
+DYNAMICANIMATION = "1.1.0-rc01"
 EMOJI = "1.2.0-alpha03"
 EMOJI2 = "1.5.0-rc01"
 ENTERPRISE = "1.1.0-rc01"
@@ -74,7 +74,7 @@
 GRAPHICS_PATH = "1.0.0-rc01"
 GRAPHICS_SHAPES = "1.1.0-alpha01"
 GRIDLAYOUT = "1.1.0-beta02"
-HEALTH_CONNECT = "1.3.0-alpha01"
+HEALTH_CONNECT = "1.1.0-beta01"
 HEALTH_CONNECT_TESTING_QUARANTINE = "1.0.0-alpha03"
 HEALTH_SERVICES_CLIENT = "1.1.0-alpha05"
 HEIFWRITER = "1.1.0-alpha05"
@@ -110,13 +110,12 @@
 PERFORMANCE = "1.0.0-alpha01"
 PREFERENCE = "1.3.0-alpha01"
 PRINT = "1.1.0-beta01"
-PRIVACYSANDBOX_ACTIVITY = "1.0.0-alpha02"
+PRIVACYSANDBOX_ACTIVITY = "1.0.0-alpha01"
 PRIVACYSANDBOX_ADS = "1.1.0-beta12"
-PRIVACYSANDBOX_ONDEVICEPERSONALIZATION = "1.0.0-alpha01"
 PRIVACYSANDBOX_PLUGINS = "1.0.0-alpha03"
 PRIVACYSANDBOX_SDKRUNTIME = "1.0.0-alpha17"
 PRIVACYSANDBOX_TOOLS = "1.0.0-alpha13"
-PRIVACYSANDBOX_UI = "1.0.0-alpha15"
+PRIVACYSANDBOX_UI = "1.0.0-alpha14"
 PROFILEINSTALLER = "1.5.0-alpha01"
 RECOMMENDATION = "1.1.0-alpha01"
 RECYCLERVIEW = "1.5.0-alpha01"
@@ -152,7 +151,7 @@
 TRACING = "1.3.0-beta01"
 TRACING_DRIVER = "1.0.0-alpha01"
 TRACING_PERFETTO = "1.0.0"
-TRANSITION = "1.6.0-rc01"
+TRANSITION = "1.6.0-beta01"
 TV = "1.0.0-alpha12"
 TVPROVIDER = "1.1.0-alpha02"
 TV_MATERIAL = "1.1.0-alpha01"
@@ -163,21 +162,21 @@
 VIEWPAGER = "1.1.0-rc01"
 VIEWPAGER2 = "1.2.0-alpha01"
 WEAR = "1.4.0-alpha01"
-WEAR_COMPOSE = "1.5.0-alpha12"
-WEAR_COMPOSE_MATERIAL3 = "1.0.0-alpha35"
+WEAR_COMPOSE = "1.5.0-alpha11"
+WEAR_COMPOSE_MATERIAL3 = "1.0.0-alpha34"
 WEAR_CORE = "1.0.0-alpha01"
 WEAR_INPUT = "1.2.0-alpha03"
 WEAR_INPUT_TESTING = "1.2.0-alpha03"
 WEAR_ONGOING = "1.1.0-alpha02"
 WEAR_PHONE_INTERACTIONS = "1.1.0-rc01"
-WEAR_PROTOLAYOUT = "1.3.0-beta01"
+WEAR_PROTOLAYOUT = "1.3.0-alpha10"
 WEAR_REMOTE_INTERACTIONS = "1.1.0-rc01"
-WEAR_TILES = "1.5.0-beta01"
+WEAR_TILES = "1.5.0-alpha10"
 WEAR_TOOLING_PREVIEW = "1.0.0-rc01"
 WEAR_WATCHFACE = "1.3.0-alpha06"
 WEBKIT = "1.14.0-alpha01"
 # Adding a comment to prevent merge conflicts for Window artifact
-WINDOW = "1.7.0-alpha01"
+WINDOW = "1.5.0-alpha01"
 WINDOW_EXTENSIONS = "1.5.0-alpha01"
 WINDOW_EXTENSIONS_CORE = "1.1.0-alpha01"
 WINDOW_SIDECAR = "1.0.0-rc01"
@@ -277,7 +276,6 @@
 PRINT = { group = "androidx.print", atomicGroupVersion = "versions.PRINT" }
 PRIVACYSANDBOX_ACTIVITY = { group = "androidx.privacysandbox.activity", atomicGroupVersion = "versions.PRIVACYSANDBOX_ACTIVITY" }
 PRIVACYSANDBOX_ADS = { group = "androidx.privacysandbox.ads", atomicGroupVersion = "versions.PRIVACYSANDBOX_ADS" }
-PRIVACYSANDBOX_ONDEVICEPERSONALIZATION = { group = "androidx.privacysandbox.ondevicepersonalization", atomicGroupVersion = "versions.PRIVACYSANDBOX_ONDEVICEPERSONALIZATION" }
 PRIVACYSANDBOX_PLUGINS = { group = "androidx.privacysandbox.plugins", atomicGroupVersion = "versions.PRIVACYSANDBOX_PLUGINS" }
 PRIVACYSANDBOX_SDKRUNTIME = { group = "androidx.privacysandbox.sdkruntime", atomicGroupVersion = "versions.PRIVACYSANDBOX_SDKRUNTIME" }
 PRIVACYSANDBOX_TOOLS = { group = "androidx.privacysandbox.tools", atomicGroupVersion = "versions.PRIVACYSANDBOX_TOOLS" }
diff --git a/lifecycle/lifecycle-viewmodel-compose/build.gradle b/lifecycle/lifecycle-viewmodel-compose/build.gradle
index c3ceac6..9e950e2 100644
--- a/lifecycle/lifecycle-viewmodel-compose/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-compose/build.gradle
@@ -89,7 +89,7 @@
                 // but it doesn't work in androidx.
                 // See aosp/1804059
                 implementation(project(":lifecycle:lifecycle-common-java8"))
-                implementation("androidx.activity:activity-compose:1.10.1")
+                implementation(project(":activity:activity-compose"))
             }
         }
     }
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/commonMain/kotlin/androidx/lifecycle/serialization/SavedStateHandleDelegate.kt b/lifecycle/lifecycle-viewmodel-savedstate/src/commonMain/kotlin/androidx/lifecycle/serialization/SavedStateHandleDelegate.kt
index 5823da04..ca977e4 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/src/commonMain/kotlin/androidx/lifecycle/serialization/SavedStateHandleDelegate.kt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/src/commonMain/kotlin/androidx/lifecycle/serialization/SavedStateHandleDelegate.kt
@@ -33,8 +33,7 @@
  * @sample androidx.lifecycle.delegateExplicitKey
  * @param key An optional [String] key to use for storing the value in the [SavedStateHandle]. A
  *   default key will be generated if it's omitted or when 'null' is passed.
- * @param configuration The [SavedStateConfiguration] to use. Defaults to
- *   [SavedStateConfiguration.DEFAULT].
+ * @param configuration The [SavedStateConfiguration] to use.
  * @param init The function to provide the initial value of the property.
  * @return A property delegate that manages the saving and restoring of the value.
  */
@@ -52,8 +51,7 @@
  * @param serializer The [KSerializer] to use for serializing and deserializing the value.
  * @param key An optional [String] key to use for storing the value in the [SavedStateHandle]. A
  *   default key will be generated if it's omitted or when 'null' is passed.
- * @param configuration The [SavedStateConfiguration] to use. Defaults to
- *   [SavedStateConfiguration.DEFAULT].
+ * @param configuration The [SavedStateConfiguration] to use.
  * @param init The function to provide the initial value of the property.
  * @return A property delegate that manages the saving and restoring of the value.
  */
diff --git a/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavType.android.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavType.android.kt
index 910b068..774685d 100644
--- a/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavType.android.kt
+++ b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavType.android.kt
@@ -35,8 +35,11 @@
     public actual open fun parseValue(value: String, previousValue: T): T = parseValue(value)
 
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public actual fun parseAndPut(bundle: SavedState, key: String, value: String): T =
-        navTypeParseAndPut(bundle, key, value)
+    public actual fun parseAndPut(bundle: SavedState, key: String, value: String): T {
+        val parsedValue = parseValue(value)
+        put(bundle, key, parsedValue)
+        return parsedValue
+    }
 
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public actual fun parseAndPut(
@@ -44,47 +47,73 @@
         key: String,
         value: String?,
         previousValue: T
-    ): T = navTypeParseAndPut(bundle, key, value, previousValue)
+    ): T {
+        if (!bundle.read { contains(key) }) {
+            throw IllegalArgumentException("There is no previous value in this savedState.")
+        }
+        if (value != null) {
+            val parsedCombinedValue = parseValue(value, previousValue)
+            put(bundle, key, parsedCombinedValue)
+            return parsedCombinedValue
+        }
+        return previousValue
+    }
 
-    public actual open fun serializeAsValue(value: T): String = value.toString()
+    public actual open fun serializeAsValue(value: T): String {
+        return value.toString()
+    }
 
     public actual open val name: String = "nav_type"
 
     public actual open fun valueEquals(value: T, other: T): Boolean = value == other
 
-    override fun toString(): String = name
+    override fun toString(): String {
+        return name
+    }
 
     public actual companion object {
         @Suppress("NON_FINAL_MEMBER_IN_OBJECT", "UNCHECKED_CAST") // this needs to be open to
         // maintain api compatibility and type cast are unchecked
         @JvmStatic
         public actual open fun fromArgType(type: String?, packageName: String?): NavType<*> {
-            return navTypeFromArgType(type)
-                ?: when {
-                    ReferenceType.name == type -> return ReferenceType
-                    !type.isNullOrEmpty() -> {
-                        try {
-                            var className: String
-                            className =
-                                if (type.startsWith(".") && packageName != null) {
-                                    packageName + type
-                                } else {
-                                    type
-                                }
-                            val isArray = type.endsWith("[]")
-                            if (isArray) className = className.substring(0, className.length - 2)
-                            val clazz = Class.forName(className)
-                            return requireNotNull(
-                                parseSerializableOrParcelableType(clazz, isArray)
-                            ) {
-                                "$className is not Serializable or Parcelable."
+            when {
+                IntType.name == type -> return IntType
+                IntArrayType.name == type -> return IntArrayType
+                IntListType.name == type -> return IntListType
+                LongType.name == type -> return LongType
+                LongArrayType.name == type -> return LongArrayType
+                LongListType.name == type -> return LongListType
+                BoolType.name == type -> return BoolType
+                BoolArrayType.name == type -> return BoolArrayType
+                BoolListType.name == type -> return BoolListType
+                StringType.name == type -> return StringType
+                StringArrayType.name == type -> return StringArrayType
+                StringListType.name == type -> return StringListType
+                FloatType.name == type -> return FloatType
+                FloatArrayType.name == type -> return FloatArrayType
+                FloatListType.name == type -> return FloatListType
+                ReferenceType.name == type -> return ReferenceType
+                !type.isNullOrEmpty() -> {
+                    try {
+                        var className: String
+                        className =
+                            if (type.startsWith(".") && packageName != null) {
+                                packageName + type
+                            } else {
+                                type
                             }
-                        } catch (e: ClassNotFoundException) {
-                            throw RuntimeException(e)
+                        val isArray = type.endsWith("[]")
+                        if (isArray) className = className.substring(0, className.length - 2)
+                        val clazz = Class.forName(className)
+                        return requireNotNull(parseSerializableOrParcelableType(clazz, isArray)) {
+                            "$className is not Serializable or Parcelable."
                         }
+                    } catch (e: ClassNotFoundException) {
+                        throw RuntimeException(e)
                     }
-                    else -> StringType
                 }
+            }
+            return StringType
         }
 
         @Suppress("UNCHECKED_CAST")
@@ -112,42 +141,74 @@
                 else -> null
             }
 
+        @Suppress("UNCHECKED_CAST") // needed for cast to NavType<Any>
         @JvmStatic
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        public actual fun inferFromValue(value: String): NavType<Any> = navTypeInferFromValue(value)
+        public actual fun inferFromValue(value: String): NavType<Any> {
+            // because we allow Long literals without the L suffix at runtime,
+            // the order of IntType and LongType parsing has to be reversed compared to Safe Args
+            try {
+                IntType.parseValue(value)
+                return IntType as NavType<Any>
+            } catch (e: IllegalArgumentException) {
+                // ignored, proceed to check next type
+            }
+            try {
+                LongType.parseValue(value)
+                return LongType as NavType<Any>
+            } catch (e: IllegalArgumentException) {
+                // ignored, proceed to check next type
+            }
+            try {
+                FloatType.parseValue(value)
+                return FloatType as NavType<Any>
+            } catch (e: IllegalArgumentException) {
+                // ignored, proceed to check next type
+            }
+            try {
+                BoolType.parseValue(value)
+                return BoolType as NavType<Any>
+            } catch (e: IllegalArgumentException) {
+                // ignored, proceed to check next type
+            }
+            return StringType as NavType<Any>
+        }
 
         @Suppress("UNCHECKED_CAST") // needed for cast to NavType<Any>
         @JvmStatic
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         public actual fun inferFromValueType(value: Any?): NavType<Any> {
-            return navTypeInferFromValueType(value)
-                ?: when {
-                    value is Array<*> && value.isArrayOf<String>() ->
-                        StringArrayType as NavType<Any>
-                    value!!.javaClass.isArray &&
-                        Parcelable::class
-                            .java
-                            .isAssignableFrom(value.javaClass.componentType!!) -> {
-                        ParcelableArrayType(value.javaClass.componentType as Class<Parcelable>)
-                            as NavType<Any>
-                    }
-                    value.javaClass.isArray &&
-                        Serializable::class
-                            .java
-                            .isAssignableFrom(value.javaClass.componentType!!) -> {
-                        SerializableArrayType(value.javaClass.componentType as Class<Serializable>)
-                            as NavType<Any>
-                    }
-                    value is Parcelable -> ParcelableType(value.javaClass) as NavType<Any>
-                    value is Enum<*> -> EnumType(value.javaClass) as NavType<Any>
-                    value is Serializable -> SerializableType(value.javaClass) as NavType<Any>
-                    else -> {
-                        throw IllegalArgumentException(
-                            "Object of type ${value.javaClass.name} is not supported for navigation " +
-                                "arguments."
-                        )
-                    }
+            return when {
+                value is Int -> IntType as NavType<Any>
+                value is IntArray -> IntArrayType as NavType<Any>
+                value is Long -> LongType as NavType<Any>
+                value is LongArray -> LongArrayType as NavType<Any>
+                value is Float -> FloatType as NavType<Any>
+                value is FloatArray -> FloatArrayType as NavType<Any>
+                value is Boolean -> BoolType as NavType<Any>
+                value is BooleanArray -> BoolArrayType as NavType<Any>
+                value is String || value == null -> StringType as NavType<Any>
+                value is Array<*> && value.isArrayOf<String>() -> StringArrayType as NavType<Any>
+                value.javaClass.isArray &&
+                    Parcelable::class.java.isAssignableFrom(value.javaClass.componentType!!) -> {
+                    ParcelableArrayType(value.javaClass.componentType as Class<Parcelable>)
+                        as NavType<Any>
                 }
+                value.javaClass.isArray &&
+                    Serializable::class.java.isAssignableFrom(value.javaClass.componentType!!) -> {
+                    SerializableArrayType(value.javaClass.componentType as Class<Serializable>)
+                        as NavType<Any>
+                }
+                value is Parcelable -> ParcelableType(value.javaClass) as NavType<Any>
+                value is Enum<*> -> EnumType(value.javaClass) as NavType<Any>
+                value is Serializable -> SerializableType(value.javaClass) as NavType<Any>
+                else -> {
+                    throw IllegalArgumentException(
+                        "Object of type ${value.javaClass.name} is not supported for navigation " +
+                            "arguments."
+                    )
+                }
+            }
         }
 
         @JvmField public actual val IntType: NavType<Int> = IntNavType()
diff --git a/navigation/navigation-common/src/commonMain/kotlin/androidx/navigation/NavType.kt b/navigation/navigation-common/src/commonMain/kotlin/androidx/navigation/NavType.kt
index 4ef5c3c..9a17a96 100644
--- a/navigation/navigation-common/src/commonMain/kotlin/androidx/navigation/NavType.kt
+++ b/navigation/navigation-common/src/commonMain/kotlin/androidx/navigation/NavType.kt
@@ -16,21 +16,6 @@
 package androidx.navigation
 
 import androidx.annotation.RestrictTo
-import androidx.navigation.NavType.Companion.BoolArrayType
-import androidx.navigation.NavType.Companion.BoolListType
-import androidx.navigation.NavType.Companion.BoolType
-import androidx.navigation.NavType.Companion.FloatArrayType
-import androidx.navigation.NavType.Companion.FloatListType
-import androidx.navigation.NavType.Companion.FloatType
-import androidx.navigation.NavType.Companion.IntArrayType
-import androidx.navigation.NavType.Companion.IntListType
-import androidx.navigation.NavType.Companion.IntType
-import androidx.navigation.NavType.Companion.LongArrayType
-import androidx.navigation.NavType.Companion.LongListType
-import androidx.navigation.NavType.Companion.LongType
-import androidx.navigation.NavType.Companion.StringArrayType
-import androidx.navigation.NavType.Companion.StringListType
-import androidx.navigation.NavType.Companion.StringType
 import androidx.savedstate.SavedState
 import androidx.savedstate.read
 import androidx.savedstate.write
@@ -301,98 +286,6 @@
     }
 }
 
-internal fun <T> NavType<T>.navTypeParseAndPut(bundle: SavedState, key: String, value: String): T {
-    val parsedValue = parseValue(value)
-    put(bundle, key, parsedValue)
-    return parsedValue
-}
-
-internal fun <T> NavType<T>.navTypeParseAndPut(
-    bundle: SavedState,
-    key: String,
-    value: String?,
-    previousValue: T
-): T {
-    if (!bundle.read { contains(key) }) {
-        throw IllegalArgumentException("There is no previous value in this savedState.")
-    }
-    if (value != null) {
-        val parsedCombinedValue = parseValue(value, previousValue)
-        put(bundle, key, parsedCombinedValue)
-        return parsedCombinedValue
-    }
-    return previousValue
-}
-
-internal fun navTypeFromArgType(type: String?): NavType<*>? {
-    when {
-        IntType.name == type -> return IntType
-        IntArrayType.name == type -> return IntArrayType
-        IntListType.name == type -> return IntListType
-        LongType.name == type -> return LongType
-        LongArrayType.name == type -> return LongArrayType
-        LongListType.name == type -> return LongListType
-        BoolType.name == type -> return BoolType
-        BoolArrayType.name == type -> return BoolArrayType
-        BoolListType.name == type -> return BoolListType
-        StringType.name == type -> return StringType
-        StringArrayType.name == type -> return StringArrayType
-        StringListType.name == type -> return StringListType
-        FloatType.name == type -> return FloatType
-        FloatArrayType.name == type -> return FloatArrayType
-        FloatListType.name == type -> return FloatListType
-    }
-    return null
-}
-
-@Suppress("UNCHECKED_CAST") // needed for cast to NavType<Any>
-internal fun navTypeInferFromValue(value: String): NavType<Any> {
-    // because we allow Long literals without the L suffix at runtime,
-    // the order of IntType and LongType parsing has to be reversed compared to Safe Args
-    try {
-        IntType.parseValue(value)
-        return IntType as NavType<Any>
-    } catch (_: IllegalArgumentException) {
-        // ignored, proceed to check next type
-    }
-    try {
-        LongType.parseValue(value)
-        return LongType as NavType<Any>
-    } catch (_: IllegalArgumentException) {
-        // ignored, proceed to check next type
-    }
-    try {
-        FloatType.parseValue(value)
-        return FloatType as NavType<Any>
-    } catch (_: IllegalArgumentException) {
-        // ignored, proceed to check next type
-    }
-    try {
-        BoolType.parseValue(value)
-        return BoolType as NavType<Any>
-    } catch (_: IllegalArgumentException) {
-        // ignored, proceed to check next type
-    }
-    return StringType as NavType<Any>
-}
-
-@Suppress("UNCHECKED_CAST") // needed for cast to NavType<Any>
-internal fun navTypeInferFromValueType(value: Any?): NavType<Any>? {
-    return when (value) {
-        is Int -> IntType as NavType<Any>
-        is IntArray -> IntArrayType as NavType<Any>
-        is Long -> LongType as NavType<Any>
-        is LongArray -> LongArrayType as NavType<Any>
-        is Float -> FloatType as NavType<Any>
-        is FloatArray -> FloatArrayType as NavType<Any>
-        is Boolean -> BoolType as NavType<Any>
-        is BooleanArray -> BoolArrayType as NavType<Any>
-        is String,
-        null -> StringType as NavType<Any>
-        else -> null
-    }
-}
-
 internal class IntNavType : NavType<Int>(false) {
     override val name: String
         get() = "integer"
diff --git a/navigation/navigation-common/src/nonAndroidMain/kotlin/androidx/navigation/NavType.nonAndroid.kt b/navigation/navigation-common/src/nonAndroidMain/kotlin/androidx/navigation/NavType.nonAndroid.kt
index 842306b..9c18841 100644
--- a/navigation/navigation-common/src/nonAndroidMain/kotlin/androidx/navigation/NavType.nonAndroid.kt
+++ b/navigation/navigation-common/src/nonAndroidMain/kotlin/androidx/navigation/NavType.nonAndroid.kt
@@ -28,11 +28,14 @@
 
     public actual abstract fun parseValue(value: String): T
 
-    public actual open fun parseValue(value: String, previousValue: T): T = parseValue(value)
+    public actual open fun parseValue(value: String, previousValue: T): T {
+        implementedInJetBrainsFork()
+    }
 
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public actual fun parseAndPut(bundle: SavedState, key: String, value: String): T =
-        navTypeParseAndPut(bundle, key, value)
+    public actual fun parseAndPut(bundle: SavedState, key: String, value: String): T {
+        implementedInJetBrainsFork()
+    }
 
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public actual fun parseAndPut(
@@ -40,58 +43,83 @@
         key: String,
         value: String?,
         previousValue: T
-    ): T = navTypeParseAndPut(bundle, key, value, previousValue)
+    ): T {
+        implementedInJetBrainsFork()
+    }
 
-    public actual open fun serializeAsValue(value: T): String = value.toString()
+    public actual open fun serializeAsValue(value: T): String {
+        implementedInJetBrainsFork()
+    }
 
-    public actual open val name: String = "nav_type"
+    public actual open val name: String
+        get() = implementedInJetBrainsFork()
 
-    public actual open fun valueEquals(value: T, other: T): Boolean = value == other
+    public actual open fun valueEquals(value: T, other: T): Boolean {
+        implementedInJetBrainsFork()
+    }
 
     public actual companion object {
         @JvmStatic
         @Suppress("NON_FINAL_MEMBER_IN_OBJECT")
-        public actual open fun fromArgType(type: String?, packageName: String?): NavType<*> =
-            navTypeFromArgType(type)
-                ?: if (!type.isNullOrEmpty()) {
-                    throw IllegalArgumentException(
-                        "Object of type $type is not supported for navigation arguments."
-                    )
-                } else {
-                    StringType
-                }
+        public actual open fun fromArgType(type: String?, packageName: String?): NavType<*> {
+            implementedInJetBrainsFork()
+        }
 
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         @JvmStatic
-        public actual fun inferFromValue(value: String): NavType<Any> = navTypeInferFromValue(value)
+        public actual fun inferFromValue(value: String): NavType<Any> {
+            implementedInJetBrainsFork()
+        }
 
-        @Suppress("UNCHECKED_CAST") // needed for cast to NavType<Any>
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         @JvmStatic
-        public actual fun inferFromValueType(value: Any?): NavType<Any> =
-            navTypeInferFromValueType(value)
-                ?: if (value is Array<*>) {
-                    StringArrayType as NavType<Any>
-                } else {
-                    throw IllegalArgumentException(
-                        "$value is not supported for navigation arguments."
-                    )
-                }
+        public actual fun inferFromValueType(value: Any?): NavType<Any> {
+            implementedInJetBrainsFork()
+        }
 
-        public actual val IntType: NavType<Int> = IntNavType()
-        public actual val IntArrayType: NavType<IntArray?> = IntArrayNavType()
-        public actual val IntListType: NavType<List<Int>?> = IntListNavType()
-        public actual val LongType: NavType<Long> = LongNavType()
-        public actual val LongArrayType: NavType<LongArray?> = LongArrayNavType()
-        public actual val LongListType: NavType<List<Long>?> = LongListNavType()
-        public actual val FloatType: NavType<Float> = FloatNavType()
-        public actual val FloatArrayType: NavType<FloatArray?> = FloatArrayNavType()
-        public actual val FloatListType: NavType<List<Float>?> = FloatListNavType()
-        public actual val BoolType: NavType<Boolean> = BoolNavType()
-        public actual val BoolArrayType: NavType<BooleanArray?> = BoolArrayNavType()
-        public actual val BoolListType: NavType<List<Boolean>?> = BoolListNavType()
-        public actual val StringType: NavType<String?> = StringNavType()
-        public actual val StringArrayType: NavType<Array<String>?> = StringArrayNavType()
-        public actual val StringListType: NavType<List<String>?> = StringListNavType()
+        public actual val IntType: NavType<Int>
+            get() = implementedInJetBrainsFork()
+
+        public actual val IntArrayType: NavType<IntArray?>
+            get() = implementedInJetBrainsFork()
+
+        public actual val IntListType: NavType<List<Int>?>
+            get() = implementedInJetBrainsFork()
+
+        public actual val LongType: NavType<Long>
+            get() = implementedInJetBrainsFork()
+
+        public actual val LongArrayType: NavType<LongArray?>
+            get() = implementedInJetBrainsFork()
+
+        public actual val LongListType: NavType<List<Long>?>
+            get() = implementedInJetBrainsFork()
+
+        public actual val FloatType: NavType<Float>
+            get() = implementedInJetBrainsFork()
+
+        public actual val FloatArrayType: NavType<FloatArray?>
+            get() = implementedInJetBrainsFork()
+
+        public actual val FloatListType: NavType<List<Float>?>
+            get() = implementedInJetBrainsFork()
+
+        public actual val BoolType: NavType<Boolean>
+            get() = implementedInJetBrainsFork()
+
+        public actual val BoolArrayType: NavType<BooleanArray?>
+            get() = implementedInJetBrainsFork()
+
+        public actual val BoolListType: NavType<List<Boolean>?>
+            get() = implementedInJetBrainsFork()
+
+        public actual val StringType: NavType<String?>
+            get() = implementedInJetBrainsFork()
+
+        public actual val StringArrayType: NavType<Array<String>?>
+            get() = implementedInJetBrainsFork()
+
+        public actual val StringListType: NavType<List<String>?>
+            get() = implementedInJetBrainsFork()
     }
 }
diff --git a/navigation/navigation-testing/build.gradle b/navigation/navigation-testing/build.gradle
index 15f15a0..9a3f4d9 100644
--- a/navigation/navigation-testing/build.gradle
+++ b/navigation/navigation-testing/build.gradle
@@ -91,10 +91,6 @@
 
         jvmCommonTest {
             dependsOn(commonTest)
-            dependencies {
-                runtimeOnly(libs.kotlinTestJunit)
-                implementation(libs.junit)
-            }
         }
 
         desktopMain {
diff --git a/navigation/navigation-testing/src/jvmCommonTest/kotlin/androidx/navigation/testing/TestSavedStateHandleFactory.kt b/navigation/navigation-testing/src/jvmCommonTest/kotlin/androidx/navigation/testing/TestSavedStateHandleFactory.kt
deleted file mode 100644
index b87204c..0000000
--- a/navigation/navigation-testing/src/jvmCommonTest/kotlin/androidx/navigation/testing/TestSavedStateHandleFactory.kt
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.navigation.testing
-
-import androidx.kruth.assertThat
-import androidx.lifecycle.SavedStateHandle
-import androidx.navigation.CollectionNavType
-import androidx.navigation.NavType
-import androidx.navigation.toRoute
-import androidx.savedstate.SavedState
-import androidx.savedstate.read
-import androidx.savedstate.write
-import kotlin.reflect.typeOf
-import kotlinx.serialization.Serializable
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@RunWith(JUnit4::class)
-class TestSavedStateHandleBuilder {
-
-    @Test
-    fun primitiveArgument() {
-        @Serializable class TestClass(val arg: Int)
-
-        val handle = SavedStateHandle(TestClass(12))
-        assertThat(handle.contains("arg")).isTrue()
-        val arg = handle.get<Int>("arg")
-        assertThat(arg).isEqualTo(12)
-    }
-
-    @Test
-    fun complexPathArgument() {
-        @Serializable class TestClass(val arg: TestType)
-
-        val typeMap = mapOf(typeOf<TestType>() to testNavType)
-        val handle = SavedStateHandle(TestClass(TestType("test", 1)), typeMap)
-        assertThat(handle.contains("arg")).isTrue()
-        val arg = handle.get<String>("arg")
-        assertThat(arg).isEqualTo("1.test")
-    }
-
-    @Test
-    fun complexQueryArgument() {
-        @Serializable class TestClass(val arg: List<TestType>)
-
-        val arg = listOf(TestType("test", 1), TestType("test2", 2))
-        val typeMap = mapOf(typeOf<List<TestType>>() to testCollectionNavType)
-        val handle = SavedStateHandle(TestClass(arg), typeMap)
-        assertThat(handle.contains("arg")).isTrue()
-        val retrievedArg = handle.get<Array<String>>("arg")
-        assertThat(retrievedArg.contentEquals(arrayOf("1.test", "2.test2"))).isTrue()
-    }
-
-    @Test
-    fun multipleArgument() {
-        @Serializable class TestClass(val arg: Boolean, val arg2: Float)
-
-        val handle = SavedStateHandle(TestClass(true, 1.0F))
-        assertThat(handle.contains("arg")).isTrue()
-        assertThat(handle.contains("arg2")).isTrue()
-
-        val arg = handle.get<Boolean>("arg")
-        assertThat(arg).isEqualTo(true)
-
-        val arg2 = handle.get<Float>("arg2")
-        assertThat(arg2).isEqualTo(1.0F)
-    }
-
-    @Test
-    fun nullArgument() {
-        @Serializable class TestClass(val arg: String?)
-
-        val handle = SavedStateHandle(TestClass(null))
-        assertThat(handle.contains("arg")).isTrue()
-        val arg = handle.get<TestType>("arg")
-        assertThat(arg).isNull()
-    }
-
-    @Test(expected = NotImplementedError::class)
-    fun nullLiteralArgument() {
-        @Serializable class TestClass(val arg: String)
-
-        val handle = SavedStateHandle(TestClass("null"))
-        assertThat(handle.contains("arg")).isTrue()
-        val arg = handle.get<String>("arg")
-        assertThat(arg).isEqualTo("null")
-    }
-
-    @Test(expected = NotImplementedError::class)
-    fun emptyStringArgument() {
-        @Serializable class TestClass(val arg: String)
-
-        val handle = SavedStateHandle(TestClass(""))
-        assertThat(handle.contains("arg")).isTrue()
-        val arg = handle.get<String>("arg")
-        assertThat(arg).isEqualTo("")
-    }
-
-    @Test
-    fun emptyStringListArgument() {
-        @Serializable class TestClass(val arg: List<String>)
-
-        val handle = SavedStateHandle(TestClass(emptyList()))
-        assertThat(handle.contains("arg")).isTrue()
-        val route = handle.toRoute<TestClass>()
-        assertThat(route.arg).isEmpty()
-    }
-
-    @Test
-    fun nullStringListArgumentEmptyList() {
-        @Serializable class TestClass(val arg: List<String>?)
-
-        val handle = SavedStateHandle(TestClass(null))
-        // on null list, we default to an empty list if there is not defaultValue
-        assertThat(handle.contains("arg")).isTrue()
-        val route = handle.toRoute<TestClass>()
-        assertThat(route.arg).isEmpty()
-    }
-
-    @Test
-    fun nullStringListArgumentUseDefault() {
-        @Serializable class TestClass(val arg: List<String>? = null)
-
-        val handle = SavedStateHandle(TestClass())
-        // on null list, we default to the default value since it is present, so the handle
-        // here will not contain the arg. The arg will be auto-populated during decoding.
-        assertThat(handle.contains("arg")).isFalse()
-        val route = handle.toRoute<TestClass>()
-        assertThat(route.arg).isNull()
-    }
-
-    @Test
-    fun emptyStringListArgumentUseDefault() {
-        @Serializable class TestClass(val arg: List<String> = listOf("one", "two"))
-
-        val handle = SavedStateHandle(TestClass(emptyList()))
-        // on empty list, we default to the default value since it is present, so the handle
-        // here will not contain the arg. The arg will be auto-populated during decoding.
-        assertThat(handle.contains("arg")).isFalse()
-        val route = handle.toRoute<TestClass>()
-        assertThat(route.arg).containsExactly("one", "two")
-    }
-
-    @Test
-    fun emptyIntListArgument() {
-        @Serializable class TestClass(val arg: List<Int>)
-
-        val handle = SavedStateHandle(TestClass(emptyList()))
-        assertThat(handle.contains("arg")).isTrue()
-        val route = handle.toRoute<TestClass>()
-        assertThat(route.arg).isEmpty()
-    }
-
-    @Test
-    fun emptyIntListArgumentUseDefault() {
-        @Serializable class TestClass(val arg: List<Int> = listOf(1, 2))
-
-        val handle = SavedStateHandle(TestClass(emptyList()))
-        // on empty list, we default to the default value since it is present, so the handle
-        // here will not contain the arg. The arg will be auto-populated during decoding.
-        assertThat(handle.contains("arg")).isFalse()
-        val route = handle.toRoute<TestClass>()
-        assertThat(route.arg).containsExactly(1, 2)
-    }
-
-    @Test
-    fun nullIntListArgumentEmptyList() {
-        @Serializable class TestClass(val arg: List<String>?)
-
-        val handle = SavedStateHandle(TestClass(null))
-        // on null list, we default to an empty list if there is not defaultValue
-        assertThat(handle.contains("arg")).isTrue()
-        val route = handle.toRoute<TestClass>()
-        assertThat(route.arg).isEmpty()
-    }
-
-    @Test
-    fun nullIntListArgumentUseDefault() {
-        @Serializable class TestClass(val arg: List<String>? = null)
-
-        val handle = SavedStateHandle(TestClass())
-        // on null list, we default to the default value since it is present, so the handle
-        // here will not contain the arg. The arg will be auto-populated during decoding.
-        assertThat(handle.contains("arg")).isFalse()
-        val route = handle.toRoute<TestClass>()
-        assertThat(route.arg).isNull()
-    }
-
-    @Test
-    fun defaultPrimitiveArgument() {
-        @Serializable class TestClass(val arg: Int = 1)
-
-        val handle = SavedStateHandle(TestClass())
-        assertThat(handle.contains("arg")).isTrue()
-        val arg = handle.get<Int>("arg")
-        assertThat(arg).isEqualTo(1)
-    }
-
-    @Test
-    fun defaultComplexArgument() {
-        @Serializable class TestClass(val arg: TestType = TestType("test", 1))
-
-        val typeMap = mapOf(typeOf<TestType>() to testNavType)
-        val handle = SavedStateHandle(TestClass(), typeMap)
-        assertThat(handle.contains("arg")).isTrue()
-        val arg = handle.get<String>("arg")
-        assertThat(arg).isEqualTo("1.test")
-    }
-
-    @Test
-    fun handleToRoutePathArg() {
-        @Serializable class TestClass(val arg: TestType)
-
-        val typeMap = mapOf(typeOf<TestType>() to testNavType)
-        val handle = SavedStateHandle(TestClass(TestType("test", 1)), typeMap)
-
-        val route = handle.toRoute<TestClass>(typeMap)
-        assertThat(route.arg.name).isEqualTo("test")
-        assertThat(route.arg.id).isEqualTo(1)
-    }
-
-    @Test
-    fun handleToRouteQueryArg() {
-        @Serializable class TestClass(val arg: List<TestType>)
-
-        val arg = listOf(TestType("test", 1), TestType("test2", 2))
-        val typeMap = mapOf(typeOf<List<TestType>>() to testCollectionNavType)
-        val handle = SavedStateHandle(TestClass(arg), typeMap)
-        val route = handle.toRoute<TestClass>(typeMap)
-        assertThat(route.arg).containsExactlyElementsIn(arg).inOrder()
-    }
-}
-
-@Serializable private data class TestType(val name: String, val id: Int)
-
-private val testNavType =
-    object : NavType<TestType>(false) {
-        override fun put(bundle: SavedState, key: String, value: TestType) {
-            bundle.write { putString(key, serializeAsValue(value)) }
-        }
-
-        override fun get(bundle: SavedState, key: String): TestType =
-            parseValue(bundle.read { getString(key) })
-
-        override fun parseValue(value: String): TestType {
-            val args = value.split(".")
-            return TestType(id = args.first().toInt(), name = args.last())
-        }
-
-        override fun serializeAsValue(value: TestType) = "${value.id}.${value.name}"
-    }
-
-private val testCollectionNavType: NavType<List<TestType>> =
-    object : CollectionNavType<List<TestType>>(false) {
-        override fun serializeAsValues(value: List<TestType>): List<String> =
-            value.map { "${it.id}.${it.name}" }
-
-        override fun put(bundle: SavedState, key: String, value: List<TestType>) {
-            bundle.write { putStringArray(key, serializeAsValues(value).toTypedArray()) }
-        }
-
-        override fun emptyCollection(): List<TestType> = emptyList()
-
-        override fun get(bundle: SavedState, key: String): List<TestType> {
-            return bundle
-                .read { getStringArray(key) }
-                .map {
-                    val args = it.split(".")
-                    TestType(id = args.first().toInt(), name = args.last())
-                }
-        }
-
-        override fun parseValue(value: String) = listOf(testNavType.parseValue(value))
-
-        override fun parseValue(value: String, previousValue: List<TestType>): List<TestType> =
-            previousValue.plus(testNavType.parseValue(value))
-    }
diff --git a/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/NavBackStackProviderTest.kt b/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/NavBackStackProviderTest.kt
index 342815b..6d199e3 100644
--- a/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/NavBackStackProviderTest.kt
+++ b/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/NavBackStackProviderTest.kt
@@ -17,9 +17,6 @@
 package androidx.navigation3
 
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.mutableStateListOf
-import androidx.compose.runtime.remember
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.kruth.assertThat
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -102,223 +99,4 @@
         assertThat(calledWrapBackStackCount).isEqualTo(1)
         assertThat(calledWrapContentCount).isEqualTo(1)
     }
-
-    @Test
-    fun wrapperFunctionsCallOrder() {
-        var callOrder = -1
-        var backStackProvider: Int = -1
-        var entryProvider: Int = -1
-        val provider =
-            object : NavLocalProvider {
-                @Composable
-                override fun ProvideToBackStack(
-                    backStack: List<Any>,
-                    content: @Composable (() -> Unit)
-                ) {
-                    backStackProvider = ++callOrder
-                    content.invoke()
-                }
-
-                @Composable
-                override fun <T : Any> ProvideToEntry(entry: NavEntry<T>) {
-                    entryProvider = ++callOrder
-                    entry.content.invoke(entry.key)
-                }
-            }
-        lateinit var backStack: MutableList<Any>
-
-        composeTestRule.setContent {
-            backStack = remember { mutableStateListOf("something") }
-            NavBackStackProvider(
-                backStack = backStack,
-                localProviders = listOf(provider),
-                entryProvider = { NavEntry("something") {} }
-            ) { entries ->
-                entries.lastOrNull()?.content?.invoke("something")
-            }
-        }
-
-        composeTestRule.waitForIdle()
-
-        assertThat(backStackProvider).isEqualTo(0)
-        assertThat(entryProvider).isEqualTo(1)
-    }
-
-    @Test
-    fun nestedWrapperFunctionsCallOrder() {
-        var callOrder = -1
-        var outerBackStackProvider: Int = -1
-        var outerEntryProvider: Int = -1
-        var innerBackStackProvider: Int = -1
-        var innerEntryProvider: Int = -1
-        val innerProvider =
-            object : NavLocalProvider {
-                @Composable
-                override fun ProvideToBackStack(
-                    backStack: List<Any>,
-                    content: @Composable (() -> Unit)
-                ) {
-                    innerBackStackProvider = ++callOrder
-                    content.invoke()
-                }
-
-                @Composable
-                override fun <T : Any> ProvideToEntry(entry: NavEntry<T>) {
-                    innerEntryProvider = ++callOrder
-                    entry.content.invoke(entry.key)
-                }
-            }
-
-        val outerProvider =
-            object : NavLocalProvider {
-                @Composable
-                override fun ProvideToBackStack(
-                    backStack: List<Any>,
-                    content: @Composable (() -> Unit)
-                ) {
-                    outerBackStackProvider = ++callOrder
-                    content.invoke()
-                }
-
-                @Composable
-                override fun <T : Any> ProvideToEntry(entry: NavEntry<T>) {
-                    outerEntryProvider = ++callOrder
-                    entry.content.invoke(entry.key)
-                }
-            }
-        lateinit var backStack: MutableList<Any>
-
-        composeTestRule.setContent {
-            backStack = remember { mutableStateListOf("something") }
-            NavBackStackProvider(
-                backStack = backStack,
-                localProviders = listOf(outerProvider, innerProvider),
-                entryProvider = { NavEntry("something") {} }
-            ) { entries ->
-                entries.lastOrNull()?.content?.invoke("something")
-            }
-        }
-
-        composeTestRule.waitForIdle()
-
-        assertThat(outerBackStackProvider).isEqualTo(0)
-        assertThat(innerBackStackProvider).isEqualTo(1)
-        assertThat(outerEntryProvider).isEqualTo(2)
-        assertThat(innerEntryProvider).isEqualTo(3)
-    }
-
-    @Test
-    fun wrapperFunctionsDisposeOrder() {
-        var callOrder = -1
-        var backStackProvider: Int = -1
-        var entryProvider: Int = -1
-        val provider =
-            object : NavLocalProvider {
-                @Composable
-                override fun ProvideToBackStack(
-                    backStack: List<Any>,
-                    content: @Composable (() -> Unit)
-                ) {
-                    DisposableEffect(backStack.lastOrNull()) {
-                        onDispose { backStackProvider = ++callOrder }
-                    }
-                    content.invoke()
-                }
-
-                @Composable
-                override fun <T : Any> ProvideToEntry(entry: NavEntry<T>) {
-                    DisposableEffect(entry.key) { onDispose { entryProvider = ++callOrder } }
-                    entry.content.invoke(entry.key)
-                }
-            }
-        lateinit var backStack: MutableList<Any>
-        composeTestRule.setContent {
-            backStack = remember { mutableStateListOf("something") }
-            NavBackStackProvider(
-                backStack = backStack,
-                localProviders =
-                    listOf(
-                        provider,
-                    ),
-                entryProvider = { NavEntry("something") {} }
-            ) { entries ->
-                entries.lastOrNull()?.content?.invoke("something")
-            }
-        }
-
-        composeTestRule.runOnIdle { backStack.clear() }
-        composeTestRule.waitForIdle()
-
-        assertThat(entryProvider).isEqualTo(0)
-        assertThat(backStackProvider).isEqualTo(1)
-    }
-
-    @Test
-    fun nestedWrapperFunctionsDisposeOrder() {
-        var callOrder = -1
-        var outerBackStackProvider: Int = -1
-        var outerEntryProvider: Int = -1
-        var innerBackStackProvider: Int = -1
-        var innerEntryProvider: Int = -1
-        val innerProvider =
-            object : NavLocalProvider {
-                @Composable
-                override fun ProvideToBackStack(
-                    backStack: List<Any>,
-                    content: @Composable (() -> Unit)
-                ) {
-                    DisposableEffect(backStack.lastOrNull()) {
-                        onDispose { innerBackStackProvider = ++callOrder }
-                    }
-                    content.invoke()
-                }
-
-                @Composable
-                override fun <T : Any> ProvideToEntry(entry: NavEntry<T>) {
-                    DisposableEffect(entry.key) { onDispose { innerEntryProvider = ++callOrder } }
-                    entry.content.invoke(entry.key)
-                }
-            }
-
-        val outerProvider =
-            object : NavLocalProvider {
-                @Composable
-                override fun ProvideToBackStack(
-                    backStack: List<Any>,
-                    content: @Composable (() -> Unit)
-                ) {
-                    DisposableEffect(backStack.lastOrNull()) {
-                        onDispose { outerBackStackProvider = ++callOrder }
-                    }
-                    content.invoke()
-                }
-
-                @Composable
-                override fun <T : Any> ProvideToEntry(entry: NavEntry<T>) {
-                    DisposableEffect(entry.key) { onDispose { outerEntryProvider = ++callOrder } }
-                    entry.content.invoke(entry.key)
-                }
-            }
-        lateinit var backStack: MutableList<Any>
-
-        composeTestRule.setContent {
-            backStack = remember { mutableStateListOf("something") }
-            NavBackStackProvider(
-                backStack = backStack,
-                localProviders = listOf(outerProvider, innerProvider),
-                entryProvider = { NavEntry("something") {} }
-            ) { entries ->
-                entries.lastOrNull()?.content?.invoke("something")
-            }
-        }
-
-        composeTestRule.waitForIdle()
-        backStack.clear()
-        composeTestRule.waitForIdle()
-
-        assertThat(innerEntryProvider).isEqualTo(0)
-        assertThat(outerEntryProvider).isEqualTo(1)
-        assertThat(innerBackStackProvider).isEqualTo(2)
-        assertThat(outerBackStackProvider).isEqualTo(3)
-    }
 }
diff --git a/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/SinglePaneNavDisplayTest.kt b/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/SinglePaneNavDisplayTest.kt
index f563856..5b483773 100644
--- a/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/SinglePaneNavDisplayTest.kt
+++ b/navigation3/navigation3/src/androidInstrumentedTest/kotlin/androidx/navigation3/SinglePaneNavDisplayTest.kt
@@ -140,14 +140,14 @@
 
     @Test
     fun testStateOfInactiveContentIsRestoredWhenWeGoBackToIt() {
-        lateinit var numberOnScreen1: MutableState<Int>
+        var increment = 0
+        var numberOnScreen1 = -1
         lateinit var backStack: MutableList<Any>
         composeTestRule.setContent {
             backStack = remember { mutableStateListOf(first) }
             SinglePaneNavDisplay(backStack = backStack) {
                 when (it) {
-                    first ->
-                        NavEntry(first) { numberOnScreen1 = rememberSaveable { mutableStateOf(0) } }
+                    first -> NavEntry(first) { numberOnScreen1 = rememberSaveable { increment++ } }
                     second -> NavEntry(second) {}
                     else -> error("Invalid key passed")
                 }
@@ -155,18 +155,16 @@
         }
 
         composeTestRule.runOnIdle {
-            assertWithMessage("Initial number should be 0").that(numberOnScreen1.value).isEqualTo(0)
-            numberOnScreen1.value++
-            assertWithMessage("The number should be 1").that(numberOnScreen1.value).isEqualTo(1)
+            assertWithMessage("Initial number should be 0").that(numberOnScreen1).isEqualTo(0)
+            numberOnScreen1 = -1
+            assertWithMessage("The number should be -1").that(numberOnScreen1).isEqualTo(-1)
             backStack.add(second)
         }
 
         composeTestRule.runOnIdle { backStack.removeAt(backStack.size - 1) }
 
         composeTestRule.runOnIdle {
-            assertWithMessage("The number should be restored")
-                .that(numberOnScreen1.value)
-                .isEqualTo(1)
+            assertWithMessage("The number should be restored").that(numberOnScreen1).isEqualTo(0)
         }
     }
 
diff --git a/pdf/pdf-compose/api/restricted_current.txt b/pdf/pdf-compose/api/restricted_current.txt
deleted file mode 100644
index e6f50d0..0000000
--- a/pdf/pdf-compose/api/restricted_current.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 4.0
diff --git a/pdf/pdf-compose/build.gradle b/pdf/pdf-compose/build.gradle
deleted file mode 100644
index 5540878..0000000
--- a/pdf/pdf-compose/build.gradle
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * This file was created using the `create_project.py` script located in the
- * `<AndroidX root>/development/project-creator` directory.
- *
- * Please use that script when creating a new project, rather than copying an existing project and
- * modifying its settings.
- */
-import androidx.build.SoftwareType
-
-plugins {
-    id("AndroidXPlugin")
-    id("com.android.library")
-    id("AndroidXComposePlugin")
-    id("org.jetbrains.kotlin.android")
-}
-
-dependencies {
-    api(libs.kotlinStdlib)
-    api("androidx.compose.foundation:foundation:1.7.8")
-    api("androidx.compose.ui:ui:1.7.8")
-    api("androidx.compose.runtime:runtime-saveable:1.7.8")
-    api(project(":pdf:pdf-viewer"))
-
-    implementation("androidx.compose.runtime:runtime:1.7.8")
-
-    androidTestImplementation(project(":compose:ui:ui-test"))
-    androidTestImplementation(project(":compose:ui:ui-test-junit4"))
-    androidTestImplementation(libs.testRules)
-    androidTestImplementation(libs.testRunner)
-    androidTestImplementation(libs.junit)
-    androidTestImplementation(libs.truth)
-}
-
-android {
-    namespace = "androidx.pdf.compose"
-
-    defaultConfig {
-        // TODO(b/403022712) Remove minSdk once pdf-viewer and pdf-document-service drop their
-        //   minSdk requirements
-        minSdk = 31
-        compileSdk = 35
-    }
-}
-
-androidx {
-    name = "androidx.pdf:pdf-compose"
-    type = SoftwareType.PUBLISHED_LIBRARY
-    inceptionYear = "2025"
-    description = "Present PDF content using Jetpack Compose"
-}
diff --git a/pdf/pdf-compose/src/main/java/androidx/pdf/androidx-pdf-pdf-compose-documentation.md b/pdf/pdf-compose/src/main/java/androidx/pdf/androidx-pdf-pdf-compose-documentation.md
deleted file mode 100644
index 4e76f3c..0000000
--- a/pdf/pdf-compose/src/main/java/androidx/pdf/androidx-pdf-pdf-compose-documentation.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Module root
-
-androidx.pdf pdf-compose
-
-# Package androidx.pdf.compose
-
-Provides @Composables for presenting PDF content
diff --git a/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/service/connect/FakePdfServiceConnection.kt b/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/service/connect/FakePdfServiceConnection.kt
index 9cf03af..5c54d7a 100644
--- a/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/service/connect/FakePdfServiceConnection.kt
+++ b/pdf/pdf-document-service/src/androidTest/kotlin/androidx/pdf/service/connect/FakePdfServiceConnection.kt
@@ -23,9 +23,6 @@
 import androidx.pdf.PdfDocumentRemote
 import androidx.pdf.adapter.PdfDocumentRendererFactoryImpl
 import androidx.pdf.service.PdfDocumentRemoteImpl
-import java.util.Queue
-import java.util.concurrent.ConcurrentLinkedQueue
-import kotlinx.coroutines.Job
 
 class FakePdfServiceConnection(
     override val context: Context,
@@ -34,14 +31,13 @@
     override var needsToReopenDocument: Boolean = false,
     private val onServiceConnected: () -> Unit = {}
 ) : PdfServiceConnection {
-
-    override val pendingJobs: Queue<Job> = ConcurrentLinkedQueue()
-
     override suspend fun connect(uri: Uri) {
         documentBinder = PdfDocumentRemoteImpl(PdfDocumentRendererFactoryImpl())
         onServiceConnected(null, null)
     }
 
+    override suspend fun blockUntilConnected() {}
+
     override fun disconnect() {
         documentBinder?.closePdfDocument()
     }
diff --git a/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/SandboxedPdfDocument.kt b/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/SandboxedPdfDocument.kt
index 6fccd85..bb7b346 100644
--- a/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/SandboxedPdfDocument.kt
+++ b/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/SandboxedPdfDocument.kt
@@ -37,13 +37,9 @@
 import androidx.pdf.service.connect.PdfServiceConnection
 import androidx.pdf.utils.toAndroidClass
 import androidx.pdf.utils.toContentClass
-import java.util.concurrent.TimeoutException
-import kotlin.coroutines.coroutineContext
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Job
 import kotlinx.coroutines.SupervisorJob
-import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 
@@ -166,7 +162,8 @@
 
     @WorkerThread
     override fun close() {
-        connection.disconnect()
+        // TODO(b/380191925): Remove this when service is closed from SandboxedPdfLoader
+        //        connection.disconnect()
 
         // TODO(b/377920470): Remove this when PdfRenderer closes the file descriptor
         fileDescriptor.close()
@@ -223,67 +220,22 @@
     }
 
     private suspend fun <T> withDocument(block: (PdfDocumentRemote) -> T): T {
-        var trial = 1
-        while (true) {
-            try {
-                return withDocumentWithoutRetry(block)
-            } catch (e: Exception) {
-                // We retry a max of 3 times if it is one of retry-able exceptions.
-                if (
-                    trial > MAX_RETRIES || ((e !is DeadObjectException) && (e !is TimeoutException))
-                ) {
-                    throw e
-                }
-                trial++
-                // We sleep for some duration to give the service some time to recover.
-                // The loop then retries it.
-                delay(MIN_RETRY_DURATION * trial)
-            }
+        connection.blockUntilConnected()
+
+        val binder =
+            connection.documentBinder
+                ?: throw DeadObjectException("Binder object to the service must not be null!")
+
+        if (connection.needsToReopenDocument) {
+            binder.openPdfDocument(fileDescriptor, password)
+            connection.needsToReopenDocument = false
         }
-    }
 
-    private suspend fun <T> withDocumentWithoutRetry(block: (PdfDocumentRemote) -> T): T {
-        // Create a new job in parent's context. Since with document can be called from any scope,
-        // we need a handle to check coroutines actively working with document. Linking to parent's
-        // job helps in cancellation.
-        val taskJob =
-            Job(parent = coroutineContext[Job]).also { job ->
-                connection.pendingJobs.add(job)
-
-                // clean up on completion
-                job.invokeOnCompletion { connection.pendingJobs.remove(job) }
-            }
-
-        return withContext(dispatcher + taskJob) {
-            // Binder object will be null if the service is disconnected. Let's try reconnecting
-            // explicitly
-            if (connection.documentBinder == null) {
-                connection.connect(uri)
-            }
-
-            val binder = connection.documentBinder!!
-            if (connection.needsToReopenDocument) {
-                binder.openPdfDocument(fileDescriptor, password)
-                connection.needsToReopenDocument = false
-            }
-
-            val result = block(binder)
-
-            // Manually completing taskJob because a Job created using Job() does not complete on
-            // its own. Unlike coroutines launched with launch or async, a standalone Job() remains
-            // active indefinitely unless explicitly completed or canceled.
-            taskJob.complete()
-
-            return@withContext result
-        }
+        return withContext(dispatcher) { block(binder) }
     }
 
     private companion object {
         private const val DEFAULT_PAGE = 400
-        // Max number of retries to make on exceptions like DeadObjectExceptions on service.
-        private const val MAX_RETRIES = 3
-        // Min retry duration in milliseconds to start with.
-        private const val MIN_RETRY_DURATION = 400L
 
         /**
          * Converts a list of items into a SparseArray, using the item's index as the key.
diff --git a/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/service/connect/PdfServiceConnection.kt b/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/service/connect/PdfServiceConnection.kt
index f691e31..97a22cd 100644
--- a/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/service/connect/PdfServiceConnection.kt
+++ b/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/service/connect/PdfServiceConnection.kt
@@ -21,8 +21,6 @@
 import android.net.Uri
 import androidx.annotation.RestrictTo
 import androidx.pdf.PdfDocumentRemote
-import java.util.Queue
-import kotlinx.coroutines.Job
 
 @RestrictTo(RestrictTo.Scope.LIBRARY)
 public interface PdfServiceConnection : ServiceConnection {
@@ -44,16 +42,12 @@
     /** The [PdfDocumentRemote] instance, if the service is actively bound */
     public val documentBinder: PdfDocumentRemote?
 
-    /**
-     * Queue for all the job that are working with document. This does not enforce FIFO executing of
-     * the task, but rather works as a list with safe concurrent modifications. see
-     * [java.util.concurrent.ConcurrentLinkedQueue]
-     */
-    public val pendingJobs: Queue<Job>
-
     /** Initiates binding to the service, and suspends until the service is bound */
     public suspend fun connect(uri: Uri)
 
+    /** Blocks the current thread of execution until the connection is established */
+    public suspend fun blockUntilConnected()
+
     /** Immediately unbinds the service */
     public fun disconnect()
 }
diff --git a/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/service/connect/PdfServiceConnectionImpl.kt b/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/service/connect/PdfServiceConnectionImpl.kt
index fc9f404..114d334 100644
--- a/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/service/connect/PdfServiceConnectionImpl.kt
+++ b/pdf/pdf-document-service/src/main/kotlin/androidx/pdf/service/connect/PdfServiceConnectionImpl.kt
@@ -24,9 +24,6 @@
 import androidx.annotation.RestrictTo
 import androidx.pdf.PdfDocumentRemote
 import androidx.pdf.service.PdfDocumentServiceImpl
-import java.util.Queue
-import java.util.concurrent.ConcurrentLinkedQueue
-import kotlinx.coroutines.Job
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.update
@@ -35,11 +32,6 @@
 internal class PdfServiceConnectionImpl(override val context: Context) : PdfServiceConnection {
     private val _eventStateFlow: MutableStateFlow<ConnectionState> = MutableStateFlow(Disconnected)
 
-    override val pendingJobs: Queue<Job> = ConcurrentLinkedQueue()
-
-    private val isProcessing: Boolean
-        get() = pendingJobs.any { it.isActive }
-
     override var needsToReopenDocument: Boolean = false
 
     override val isConnected: Boolean
@@ -56,12 +48,6 @@
     override fun onServiceDisconnected(name: ComponentName?) {
         needsToReopenDocument = true
         _eventStateFlow.update { Disconnected }
-
-        // By this time, the system has disconnected the service. If we do not call unbind, then
-        // it will try to restart the service immediately. If no processing is active, we can unbind
-        // to save resources. Android system, otherwise, penalizes service-restarts by delaying
-        // them.
-        if (!isProcessing) disconnect()
     }
 
     override suspend fun connect(uri: Uri) {
@@ -76,12 +62,14 @@
         _eventStateFlow.first { it is Connected }
     }
 
-    override fun disconnect() {
-        // Update connection state earlier to prevent any operations (e.g., page releases) on the
-        // closed document until the service unbinds.
-        _eventStateFlow.update { Disconnected }
+    override suspend fun blockUntilConnected() {
+        _eventStateFlow.first { it is Connected }
+    }
 
-        documentBinder?.closePdfDocument()
-        context.unbindService(this)
+    override fun disconnect() {
+        if (isConnected) {
+            documentBinder?.closePdfDocument()
+            context.unbindService(this)
+        }
     }
 }
diff --git a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/search/SearchRepository.kt b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/search/SearchRepository.kt
index 8601754..a97f097 100644
--- a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/search/SearchRepository.kt
+++ b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/search/SearchRepository.kt
@@ -16,7 +16,6 @@
 
 package androidx.pdf.search
 
-import android.os.DeadObjectException
 import androidx.annotation.RestrictTo
 import androidx.core.util.isNotEmpty
 import androidx.pdf.PdfDocument
@@ -89,20 +88,9 @@
         // to make [searchDocument] main-safe
         val searchResults =
             withContext(dispatcher) {
-                try {
-                    pdfDocument.searchDocument(query = query, pageRange = searchPageRange)
-                } catch (e: DeadObjectException) {
-                    // Ignore exception due to service disconnection. User will try again.
-                    return@withContext null
-                }
+                pdfDocument.searchDocument(query = query, pageRange = searchPageRange)
             }
 
-        if (searchResults == null) {
-            // An exception happened above because of service disconnection.
-            // Reset search so that user may try again.
-            _queryResults.update { NoQuery }
-            return
-        }
         val queryResults =
             if (searchResults.isNotEmpty()) {
                 /*
diff --git a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/BitmapFetcher.kt b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/BitmapFetcher.kt
index fb1aa98..35d1591 100644
--- a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/BitmapFetcher.kt
+++ b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/BitmapFetcher.kt
@@ -20,7 +20,6 @@
 import android.graphics.Point
 import android.graphics.PointF
 import android.graphics.Rect
-import android.os.DeadObjectException
 import android.util.Size
 import androidx.annotation.AnyThread
 import androidx.annotation.GuardedBy
@@ -32,7 +31,6 @@
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.ensureActive
-import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.launch
 
 /**
@@ -64,8 +62,6 @@
      */
     private val maxBitmapSizePx: Point,
     private val onPageUpdate: () -> Unit,
-    /** Error flow for propagating error occurred while processing to [PdfView]. */
-    private val errorFlow: MutableSharedFlow<Throwable>
 ) : AutoCloseable {
 
     /**
@@ -244,13 +240,9 @@
     private fun fetchFullPageBitmap(size: Size, onReady: (Bitmap) -> Unit): Job {
         return backgroundScope.launch {
             ensureActive()
-            try {
-                val bitmap = bitmapSource.getBitmap(size)
-                ensureActive()
-                onReady(bitmap)
-            } catch (e: DeadObjectException) {
-                errorFlow.emit(e)
-            }
+            val bitmap = bitmapSource.getBitmap(size)
+            ensureActive()
+            onReady(bitmap)
         }
     }
 
@@ -267,22 +259,13 @@
             backgroundScope.launch {
                 prevJob?.join()
                 ensureActive()
-                try {
-                    val bitmap =
-                        bitmapSource.getBitmap(
-                            Size(
-                                (pageSize.x * scale).roundToInt(),
-                                (pageSize.y * scale).roundToInt()
-                            ),
-                            tile.rectPx
-                        )
-                    ensureActive()
-                    tile.bitmap = bitmap
-                } catch (e: DeadObjectException) {
-                    // Service was disconnected.
-                    errorFlow.emit(e)
-                    return@launch
-                }
+                val bitmap =
+                    bitmapSource.getBitmap(
+                        Size((pageSize.x * scale).roundToInt(), (pageSize.y * scale).roundToInt()),
+                        tile.rectPx
+                    )
+                ensureActive()
+                tile.bitmap = bitmap
                 onPageUpdate()
             }
         return job
diff --git a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/Page.kt b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/Page.kt
index 1a72896..60dd4cd 100644
--- a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/Page.kt
+++ b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/Page.kt
@@ -25,7 +25,6 @@
 import android.graphics.PorterDuffXfermode
 import android.graphics.Rect
 import android.graphics.RectF
-import android.os.DeadObjectException
 import androidx.annotation.MainThread
 import androidx.annotation.RestrictTo
 import androidx.annotation.VisibleForTesting
@@ -33,7 +32,6 @@
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.ensureActive
-import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.launch
 
 /** A single PDF page that knows how to render and draw itself */
@@ -58,9 +56,7 @@
     /** A function to call when the [PdfView] hosting this [Page] ought to invalidate itself */
     private val onPageUpdate: () -> Unit,
     /** A function to call when page text is ready (invoked with page number). */
-    private val onPageTextReady: ((Int) -> Unit),
-    /** Error flow for propagating error occurred while processing to [PdfView]. */
-    private val errorFlow: MutableSharedFlow<Throwable>
+    private val onPageTextReady: ((Int) -> Unit)
 ) {
     init {
         require(pageNum >= 0) { "Invalid negative page" }
@@ -106,8 +102,7 @@
                     pdfDocument,
                     backgroundScope,
                     maxBitmapSizePx,
-                    onPageUpdate,
-                    errorFlow
+                    onPageUpdate
                 )
         }
         bitmapFetcher?.maybeFetchNewBitmaps(zoom, viewArea)
@@ -146,15 +141,9 @@
             backgroundScope
                 .launch {
                     ensureActive()
-                    try {
-                        pageText =
-                            pdfDocument.getPageContent(pageNum)?.textContents?.joinToString {
-                                it.text
-                            }
-                        onPageTextReady.invoke(pageNum)
-                    } catch (e: DeadObjectException) {
-                        errorFlow.emit(e)
-                    }
+                    pageText =
+                        pdfDocument.getPageContent(pageNum)?.textContents?.joinToString { it.text }
+                    onPageTextReady.invoke(pageNum)
                 }
                 .also { it.invokeOnCompletion { fetchPageTextJob = null } }
     }
@@ -185,11 +174,7 @@
             backgroundScope
                 .launch {
                     ensureActive()
-                    try {
-                        links = pdfDocument.getPageLinks(pageNum)
-                    } catch (e: DeadObjectException) {
-                        errorFlow.emit(e)
-                    }
+                    links = pdfDocument.getPageLinks(pageNum)
                 }
                 .also { it.invokeOnCompletion { fetchLinksJob = null } }
     }
diff --git a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PageLayoutManager.kt b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PageLayoutManager.kt
index adda263..45b7838 100644
--- a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PageLayoutManager.kt
+++ b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PageLayoutManager.kt
@@ -20,7 +20,6 @@
 import android.graphics.PointF
 import android.graphics.Rect
 import android.graphics.RectF
-import android.os.DeadObjectException
 import android.util.Range
 import android.util.SparseArray
 import androidx.pdf.PdfDocument
@@ -49,8 +48,7 @@
     topPageMarginPx: Int = 0,
     pageSpacingPx: Int = DEFAULT_PAGE_SPACING_PX,
     internal val paginationModel: PaginationModel =
-        PaginationModel(pageSpacingPx, pdfDocument.pageCount, topPageMarginPx),
-    private val errorFlow: MutableSharedFlow<Throwable>
+        PaginationModel(pageSpacingPx, pdfDocument.pageCount, topPageMarginPx)
 ) {
     /** The 0-indexed maximum page number whose dimensions are known to this model */
     val reach
@@ -233,17 +231,11 @@
         currentDimensionsJob =
             backgroundScope.launch {
                 previousDimensionsJob?.join()
-                try {
-                    val pageMetadata = pdfDocument.getPageInfo(pageNum)
-                    val size = Point(pageMetadata.width, pageMetadata.height)
-                    // Add the value to the model before emitting, and on the main thread
-                    withContext(Dispatchers.Main) { paginationModel.addPage(pageNum, size) }
-                    _dimensions.emit(pageNum to Point(pageMetadata.width, pageMetadata.height))
-                } catch (e: DeadObjectException) {
-                    // An exception happened above because of service disconnection. Propagate
-                    // error event to UI to take appropriate action.
-                    errorFlow.emit(e)
-                }
+                val pageMetadata = pdfDocument.getPageInfo(pageNum)
+                val size = Point(pageMetadata.width, pageMetadata.height)
+                // Add the value to the model before emitting, and on the main thread
+                withContext(Dispatchers.Main) { paginationModel.addPage(pageNum, size) }
+                _dimensions.emit(pageNum to Point(pageMetadata.width, pageMetadata.height))
             }
     }
 
diff --git a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PageManager.kt b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PageManager.kt
index 500e7ca..c24b8c9 100644
--- a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PageManager.kt
+++ b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PageManager.kt
@@ -44,9 +44,7 @@
      * threshold for tiled rendering
      */
     private val maxBitmapSizePx: Point,
-    private val isTouchExplorationEnabled: Boolean,
-    /** Error flow for propagating error occurred while processing to [PdfView]. */
-    private val errorFlow: MutableSharedFlow<Throwable>
+    private val isTouchExplorationEnabled: Boolean
 ) {
     /**
      * Replay at least 1 value in case of an invalidation signal issued while [PdfView] is not
@@ -139,8 +137,7 @@
                     maxBitmapSizePx,
                     isTouchExplorationEnabled,
                     onPageUpdate = { _invalidationSignalFlow.tryEmit(Unit) },
-                    onPageTextReady = { pageNumber -> _pageTextReadyFlow.tryEmit(pageNumber) },
-                    errorFlow = errorFlow
+                    onPageTextReady = { pageNumber -> _pageTextReadyFlow.tryEmit(pageNumber) }
                 )
                 .apply {
                     // If the page is visible, let it know
diff --git a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PdfView.kt b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PdfView.kt
index a190831..7e49e33 100644
--- a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PdfView.kt
+++ b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/PdfView.kt
@@ -28,7 +28,6 @@
 import android.graphics.RectF
 import android.graphics.drawable.Drawable
 import android.net.Uri
-import android.os.DeadObjectException
 import android.os.Looper
 import android.os.Parcelable
 import android.util.AttributeSet
@@ -58,7 +57,6 @@
 import androidx.pdf.view.fastscroll.FastScrollGestureDetector
 import androidx.pdf.view.fastscroll.FastScroller
 import androidx.pdf.view.fastscroll.getDimensions
-import com.google.android.material.snackbar.Snackbar
 import java.util.LinkedList
 import java.util.Queue
 import java.util.concurrent.Executors
@@ -73,7 +71,6 @@
 import kotlinx.coroutines.android.asCoroutineDispatcher
 import kotlinx.coroutines.asCoroutineDispatcher
 import kotlinx.coroutines.cancelChildren
-import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.launch
 
 /**
@@ -224,7 +221,6 @@
     private var layoutInfoCollector: Job? = null
     private var pageSignalCollector: Job? = null
     private var selectionStateCollector: Job? = null
-    private var errorStateCollector: Job? = null
 
     private var deferredScrollPage: Int? = null
     private var deferredScrollPosition: PdfPoint? = null
@@ -234,7 +230,6 @@
     private var awaitingFirstLayout: Boolean = true
     private var scrollPositionToRestore: PointF? = null
     private var zoomToRestore: Float? = null
-    private val errorFlow = MutableSharedFlow<Throwable>()
 
     /**
      * Indicates whether the fast scroller's visibility is managed externally.
@@ -753,8 +748,7 @@
                     backgroundScope,
                     topPageMarginPx = context.getDimensions(R.dimen.top_page_margin).toInt(),
                     pageSpacingPx = context.getDimensions(R.dimen.page_spacing).toInt(),
-                    paginationModel = requireNotNull(localStateToRestore.paginationModel),
-                    errorFlow = errorFlow
+                    paginationModel = requireNotNull(localStateToRestore.paginationModel)
                 )
                 .apply { onViewportChanged(scrollY, height, zoom) }
         selectionStateManager =
@@ -849,23 +843,12 @@
                     }
                 }
         }
-
-        val errorsToJoin = errorStateCollector?.apply { cancel() }
-        errorStateCollector =
-            mainScope.launch(start = CoroutineStart.UNDISPATCHED) {
-                // Prevent 2 copies from running concurrently
-                errorsToJoin?.join()
-                // Add debounce to prevents multiple, rapid error indicators from being displayed
-                // to the user in quick succession.
-                errorFlow.collect { handleError(it) }
-            }
     }
 
     private fun stopCollectingData() {
         layoutInfoCollector?.cancel()
         pageSignalCollector?.cancel()
         selectionStateCollector?.cancel()
-        errorStateCollector?.cancel()
     }
 
     private fun onSelectionUiSignal(signal: SelectionUiSignal) {
@@ -887,16 +870,6 @@
         }
     }
 
-    private fun handleError(error: Throwable) {
-        val errorMsg =
-            when (error) {
-                is DeadObjectException ->
-                    context.getString(R.string.service_disconnect_error_message)
-                else -> context.getString(R.string.pdf_view_error_message)
-            }
-        Snackbar.make(this, errorMsg, Snackbar.LENGTH_SHORT).show()
-    }
-
     /** Start using the [PdfDocument] to present PDF content */
     // Display.width and height are deprecated in favor of WindowMetrics, but in this case we
     // actually want to use the size of the display and not the size of the window.
@@ -914,8 +887,7 @@
                 localPdfDocument,
                 backgroundScope,
                 Point(maxBitmapDimensionPx, maxBitmapDimensionPx),
-                isTouchExplorationEnabled,
-                errorFlow
+                isTouchExplorationEnabled
             )
 
         if (
@@ -959,8 +931,7 @@
                         localPdfDocument,
                         backgroundScope,
                         topPageMarginPx = context.getDimensions(R.dimen.top_page_margin).toInt(),
-                        pageSpacingPx = context.getDimensions(R.dimen.page_spacing).toInt(),
-                        errorFlow = errorFlow
+                        pageSpacingPx = context.getDimensions(R.dimen.page_spacing).toInt()
                     )
                     .apply { onViewportChanged(scrollY, height, zoom) }
             selectionStateManager =
diff --git a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/SelectionStateManager.kt b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/SelectionStateManager.kt
index d540e38..b840db5 100644
--- a/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/SelectionStateManager.kt
+++ b/pdf/pdf-viewer/src/main/kotlin/androidx/pdf/view/SelectionStateManager.kt
@@ -18,7 +18,6 @@
 
 import android.graphics.PointF
 import android.graphics.RectF
-import android.os.DeadObjectException
 import android.view.HapticFeedbackConstants
 import android.view.MotionEvent
 import androidx.annotation.VisibleForTesting
@@ -238,23 +237,18 @@
                     // TODO(b/386398335) Adapt this logic to support selections that span multiple
                     // pages
 
-                    try {
-                        val newSelection = getNewSelection()
-                        if (newSelection != null && newSelection.hasBounds) {
-                            _selectionModel.update {
-                                SelectionModel.fromSinglePageSelection(newSelection)
-                            }
-                            _selectionUiSignalBus.tryEmit(SelectionUiSignal.Invalidate)
-                            // Show the action mode if the user is not actively dragging the handles
-                            if (draggingState == null) {
-                                _selectionUiSignalBus.emit(
-                                    SelectionUiSignal.ToggleActionMode(show = true)
-                                )
-                            }
+                    val newSelection = getNewSelection()
+                    if (newSelection != null && newSelection.hasBounds) {
+                        _selectionModel.update {
+                            SelectionModel.fromSinglePageSelection(newSelection)
                         }
-                    } catch (e: DeadObjectException) {
-                        // Ignoring a dead object exception because the service died.
-                        // User can retry the operation.
+                        _selectionUiSignalBus.tryEmit(SelectionUiSignal.Invalidate)
+                        // Show the action mode if the user is not actively dragging the handles
+                        if (draggingState == null) {
+                            _selectionUiSignalBus.emit(
+                                SelectionUiSignal.ToggleActionMode(show = true)
+                            )
+                        }
                     }
                 }
                 .also { it.invokeOnCompletion { setSelectionJob = null } }
diff --git a/pdf/pdf-viewer/src/main/res/values/strings.xml b/pdf/pdf-viewer/src/main/res/values/strings.xml
index d57927e..b65d761 100644
--- a/pdf/pdf-viewer/src/main/res/values/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values/strings.xml
@@ -167,8 +167,4 @@
 
     <!-- Content description of the fast scroller thumb -->
     <string name="fast_scroller_thumb">Scroll Bar</string>
-    <!-- error message when the service is disconnected -->
-    <string name="service_disconnect_error_message">Service disconnected. Please try again.</string>
-    <!-- error message when an unknown issue occurred in pdf view -->
-    <string name="pdf_view_error_message">Unknown error. Please try again.</string>
 </resources>
diff --git a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/BitmapFetcherTest.kt b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/BitmapFetcherTest.kt
index 0cc2ab2..5c78b85 100644
--- a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/BitmapFetcherTest.kt
+++ b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/BitmapFetcherTest.kt
@@ -23,7 +23,6 @@
 import com.google.common.truth.Truth.assertThat
 import kotlin.math.roundToInt
 import kotlinx.coroutines.cancelChildren
-import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.test.StandardTestDispatcher
 import kotlinx.coroutines.test.TestScope
 import org.junit.Before
@@ -55,7 +54,6 @@
 
     private lateinit var bitmapFetcher: BitmapFetcher
     private lateinit var tileSizePx: Point
-    private val errorFlow = MutableSharedFlow<Throwable>()
 
     @Before
     fun setup() {
@@ -70,7 +68,6 @@
                 testScope,
                 maxBitmapSizePx,
                 invalidationTracker,
-                errorFlow
             )
         tileSizePx = BitmapFetcher.tileSizePx
     }
diff --git a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PageLayoutManagerTest.kt b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PageLayoutManagerTest.kt
index 7ce3a5a..2421b2e 100644
--- a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PageLayoutManagerTest.kt
+++ b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PageLayoutManagerTest.kt
@@ -22,7 +22,6 @@
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.flow.toList
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.TestScope
@@ -59,13 +58,12 @@
     private val testDispatcher = UnconfinedTestDispatcher()
     private val testScope = TestScope(testDispatcher)
     private lateinit var paginationManager: PageLayoutManager
-    private val errorFlow = MutableSharedFlow<Throwable>()
 
     @Before
     fun setup() {
         // Required because loadPageDimensions jumps to the main thread to update PaginationModel
         Dispatchers.setMain(testDispatcher)
-        paginationManager = PageLayoutManager(pdfDocument, testScope, errorFlow = errorFlow)
+        paginationManager = PageLayoutManager(pdfDocument, testScope)
     }
 
     @Test
diff --git a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PageTest.kt b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PageTest.kt
index 3dacdff..ad18636 100644
--- a/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PageTest.kt
+++ b/pdf/pdf-viewer/src/test/kotlin/androidx/pdf/view/PageTest.kt
@@ -25,7 +25,6 @@
 import androidx.pdf.content.PdfPageTextContent
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.cancelChildren
-import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.test.StandardTestDispatcher
 import kotlinx.coroutines.test.TestScope
 import org.junit.Before
@@ -71,8 +70,6 @@
 
     private lateinit var page: Page
 
-    private val errorFlow = MutableSharedFlow<Throwable>()
-
     private fun createPage(isTouchExplorationEnabled: Boolean): Page {
         return Page(
             0,
@@ -82,8 +79,7 @@
             MAX_BITMAP_SIZE,
             isTouchExplorationEnabled = isTouchExplorationEnabled,
             invalidationTracker,
-            onPageTextReady,
-            errorFlow
+            onPageTextReady
         )
     }
 
diff --git a/preference/preference/src/main/res/values-af/strings.xml b/preference/preference/src/main/res/values-af/strings.xml
index 84780a0..0e34cd7 100644
--- a/preference/preference/src/main/res/values-af/strings.xml
+++ b/preference/preference/src/main/res/values-af/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"AAN"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"AF"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Gevorderd"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopieer"</string>
-    <string name="preference_copied" msgid="811987176883013580">"“<xliff:g id="SUMMARY">%1$s</xliff:g>” is na knipbord gekopieer."</string>
-    <string name="not_set" msgid="5322289270060224450">"Nie gestel nie"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"AAN"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"AF"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Gevorderd"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopieer"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" is na knipbord gekopieer."</string>
+    <string name="not_set" msgid="6573031135582639649">"Nie gestel nie"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-am/strings.xml b/preference/preference/src/main/res/values-am/strings.xml
index 56f015b..817891c 100644
--- a/preference/preference/src/main/res/values-am/strings.xml
+++ b/preference/preference/src/main/res/values-am/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"በርቷል"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ጠፍቷል"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"የላቀ"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>፣ <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"ቅዳ"</string>
-    <string name="preference_copied" msgid="811987176883013580">"«<xliff:g id="SUMMARY">%1$s</xliff:g>» ወደ የቅንጥብ ሰሌዳ ተቀድቷል።"</string>
-    <string name="not_set" msgid="5322289270060224450">"አልተቀናበረም"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"በርቷል"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ጠፍቷል"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"የላቀ"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>፣ <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"ቅዳ"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"«<xliff:g id="SUMMARY">%1$s</xliff:g>» ወደ የቅንጥብ ሰሌዳ ተቀድቷል።"</string>
+    <string name="not_set" msgid="6573031135582639649">"አልተዘጋጀም"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-ar/strings.xml b/preference/preference/src/main/res/values-ar/strings.xml
index 63ce5eb..1641096 100644
--- a/preference/preference/src/main/res/values-ar/strings.xml
+++ b/preference/preference/src/main/res/values-ar/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"مفعَّل"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"غير مفعَّل"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"الإعدادات المتقدّمة"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"\"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>\" و\"<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>\""</string>
-    <string name="copy" msgid="8016979983985242980">"نسخ"</string>
-    <string name="preference_copied" msgid="811987176883013580">"تم نسخ \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" إلى الحافظة."</string>
-    <string name="not_set" msgid="5322289270060224450">"لم يتم ضبط أي إعداد مفضّل"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"مفعّلة"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"غير مفعّل"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"إعدادات متقدمة"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>، <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"نسخ"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"تم نسخ \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" إلى الحافظة."</string>
+    <string name="not_set" msgid="6573031135582639649">"لم يتم الضبط"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-as/strings.xml b/preference/preference/src/main/res/values-as/strings.xml
index 59942bf..4f68af3 100644
--- a/preference/preference/src/main/res/values-as/strings.xml
+++ b/preference/preference/src/main/res/values-as/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"অন কৰা আছে"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"অফ কৰা আছে"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"উচ্চখাপৰ"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"প্ৰতিলিপি কৰক"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ক্লিপব’ৰ্ডলৈ প্ৰতিলিপি কৰা হ’ল।"</string>
-    <string name="not_set" msgid="5322289270060224450">"ছেট কৰা হোৱা নাই"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"অন কৰক"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"অফ অৱস্থাত আছে"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"উন্নত"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"প্ৰতিলিপি কৰক"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ক্লিপব’ৰ্ডত প্ৰতিলিপি কৰা হ’ল"</string>
+    <string name="not_set" msgid="6573031135582639649">"ছেট কৰা হোৱা নাই"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-az/strings.xml b/preference/preference/src/main/res/values-az/strings.xml
index 21422f1..1f938dc 100644
--- a/preference/preference/src/main/res/values-az/strings.xml
+++ b/preference/preference/src/main/res/values-az/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"AKTİV"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"DEAKTİV"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Təkmil"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopiyalayın"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" mübadilə buferinə kopiyalandı."</string>
-    <string name="not_set" msgid="5322289270060224450">"Ayarlanmayıb"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"AKTİV"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"DEAKTİV"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Əlavə"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopyalayın"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" buferə kopyalandı."</string>
+    <string name="not_set" msgid="6573031135582639649">"Ayarlanmayıb"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-b+sr+Latn/strings.xml b/preference/preference/src/main/res/values-b+sr+Latn/strings.xml
index e5fea3f..e9995aa 100644
--- a/preference/preference/src/main/res/values-b+sr+Latn/strings.xml
+++ b/preference/preference/src/main/res/values-b+sr+Latn/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"UKLJUČENO"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ISKLJUČENO"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Napredno"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopiraj"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Rezime „<xliff:g id="SUMMARY">%1$s</xliff:g>“ je kopiran u privremenu memoriju."</string>
-    <string name="not_set" msgid="5322289270060224450">"Nije podešeno"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"UKLJUČENO"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ISKLJUČENO"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Napredno"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopiraj"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Rezime „<xliff:g id="SUMMARY">%1$s</xliff:g>“ je kopiran u privremenu memoriju."</string>
+    <string name="not_set" msgid="6573031135582639649">"Nije podešeno"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-be/strings.xml b/preference/preference/src/main/res/values-be/strings.xml
index d565a06..cd33eb7 100644
--- a/preference/preference/src/main/res/values-be/strings.xml
+++ b/preference/preference/src/main/res/values-be/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"УКЛЮЧАНА"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ВЫКЛЮЧАНА"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Пашыраныя налады"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Капіраваць"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\": скапіравана ў буфер абмену."</string>
-    <string name="not_set" msgid="5322289270060224450">"Не зададзена"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"УКЛ."</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ВЫКЛ."</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Пашыраныя налады"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Капіраваць"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\": скапіравана ў буфер абмену."</string>
+    <string name="not_set" msgid="6573031135582639649">"Не зададзена"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-bg/strings.xml b/preference/preference/src/main/res/values-bg/strings.xml
index 063c586..4949353 100644
--- a/preference/preference/src/main/res/values-bg/strings.xml
+++ b/preference/preference/src/main/res/values-bg/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ВКЛ."</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ИЗКЛ."</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Разширено"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Копиране"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Копирахте <xliff:g id="SUMMARY">%1$s</xliff:g> в буферната памет."</string>
-    <string name="not_set" msgid="5322289270060224450">"Не е зададено"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ВКЛ."</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ИЗКЛ."</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Разширени"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Копиране"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Копирахте „<xliff:g id="SUMMARY">%1$s</xliff:g>“ в буферната памет."</string>
+    <string name="not_set" msgid="6573031135582639649">"Не е зададено"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-bn/strings.xml b/preference/preference/src/main/res/values-bn/strings.xml
index e8c1bbe5..6b516ce 100644
--- a/preference/preference/src/main/res/values-bn/strings.xml
+++ b/preference/preference/src/main/res/values-bn/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"চালু আছে"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"বন্ধ করুন"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"উন্নত"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"কপি করুন"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ক্লিপবোর্ডে কপি করা হয়েছে।"</string>
-    <string name="not_set" msgid="5322289270060224450">"সেট করা নেই"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"চালু"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"বন্ধ"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"উন্নত"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"কপি করুন"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ক্লিপবোর্ডে লিঙ্কটি কপি করা হয়েছে।"</string>
+    <string name="not_set" msgid="6573031135582639649">"সেট করা হয়নি"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-bs/strings.xml b/preference/preference/src/main/res/values-bs/strings.xml
index ffa7787..f03be77 100644
--- a/preference/preference/src/main/res/values-bs/strings.xml
+++ b/preference/preference/src/main/res/values-bs/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"UKLJUČENO"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ISKLJUČENO"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Napredno"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopiraj"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Sažetak \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" je kopiran u međumemoriju."</string>
-    <string name="not_set" msgid="5322289270060224450">"Nije postavljeno"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"UKLJUČENO"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ISKLJUČENO"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Napredno"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopiraj"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" kopirano u međumemoriju."</string>
+    <string name="not_set" msgid="6573031135582639649">"Nije postavljeno"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-ca/strings.xml b/preference/preference/src/main/res/values-ca/strings.xml
index b0b93c8..560d486 100644
--- a/preference/preference/src/main/res/values-ca/strings.xml
+++ b/preference/preference/src/main/res/values-ca/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ACTIVAT"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"DESACTIVAT"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Configuració avançada"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Copia"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" s\'ha copiat al porta-retalls."</string>
-    <string name="not_set" msgid="5322289270060224450">"No definit"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ACTIVAT"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"DESACTIVAT"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Opcions avançades"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Copia"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" s\'ha copiat al porta-retalls"</string>
+    <string name="not_set" msgid="6573031135582639649">"No definit"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-cs/strings.xml b/preference/preference/src/main/res/values-cs/strings.xml
index 3ef0269..a07bdd1 100644
--- a/preference/preference/src/main/res/values-cs/strings.xml
+++ b/preference/preference/src/main/res/values-cs/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ZAP"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"VYP"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Pokročilé"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopírovat"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Položka <xliff:g id="SUMMARY">%1$s</xliff:g> byla zkopírována do schránky."</string>
-    <string name="not_set" msgid="5322289270060224450">"Nenastaveno"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"Zapnuto"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"Vypnuto"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Rozšířená nastavení"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopírovat"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Položka <xliff:g id="SUMMARY">%1$s</xliff:g> byla zkopírována do schránky."</string>
+    <string name="not_set" msgid="6573031135582639649">"Nenastaveno"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-da/strings.xml b/preference/preference/src/main/res/values-da/strings.xml
index 16baced..4ac0b20 100644
--- a/preference/preference/src/main/res/values-da/strings.xml
+++ b/preference/preference/src/main/res/values-da/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"TIL"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"FRA"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Avanceret"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopiér"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" er kopieret til udklipsholderen."</string>
-    <string name="not_set" msgid="5322289270060224450">"Ikke angivet"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"TIL"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"FRA"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Avanceret"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopiér"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" blev kopieret til udklipsholderen."</string>
+    <string name="not_set" msgid="6573031135582639649">"Ikke angivet"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-de/strings.xml b/preference/preference/src/main/res/values-de/strings.xml
index 5b1b686..eaab979 100644
--- a/preference/preference/src/main/res/values-de/strings.xml
+++ b/preference/preference/src/main/res/values-de/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"AN"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"AUS"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Erweitert"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopieren"</string>
-    <string name="preference_copied" msgid="811987176883013580">"„<xliff:g id="SUMMARY">%1$s</xliff:g>“ in Zwischenablage kopiert."</string>
-    <string name="not_set" msgid="5322289270060224450">"Nicht festgelegt"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"AN"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"AUS"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Erweitert"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopieren"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" in Zwischenablage kopiert."</string>
+    <string name="not_set" msgid="6573031135582639649">"Nicht festgelegt"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-el/strings.xml b/preference/preference/src/main/res/values-el/strings.xml
index 2d7b722..55c2e54 100644
--- a/preference/preference/src/main/res/values-el/strings.xml
+++ b/preference/preference/src/main/res/values-el/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ΕΝΕΡΓΟ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ΑΝΕΝΕΡΓΟ"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Σύνθετες"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Αντιγραφή"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Η σύνοψη \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" αντιγράφηκε στο πρόχειρο."</string>
-    <string name="not_set" msgid="5322289270060224450">"Δεν έχει οριστεί"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ΕΝΕΡΓΗ"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ΑΝΕΝΕΡΓΗ"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Σύνθετες"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Αντιγραφή"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Το \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" αντιγράφηκε στο πρόχειρο."</string>
+    <string name="not_set" msgid="6573031135582639649">"Δεν έχει οριστεί"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-en-rAU/strings.xml b/preference/preference/src/main/res/values-en-rAU/strings.xml
index fa1e33d..a16f7bf 100644
--- a/preference/preference/src/main/res/values-en-rAU/strings.xml
+++ b/preference/preference/src/main/res/values-en-rAU/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ON"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"OFF"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Advanced"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Copy"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\'<xliff:g id="SUMMARY">%1$s</xliff:g>\' copied to clipboard."</string>
-    <string name="not_set" msgid="5322289270060224450">"Not set"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ON"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"OFF"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Advanced"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Copy"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\'<xliff:g id="SUMMARY">%1$s</xliff:g>\' copied to clipboard."</string>
+    <string name="not_set" msgid="6573031135582639649">"Not set"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-en-rCA/strings.xml b/preference/preference/src/main/res/values-en-rCA/strings.xml
index b0b34bd..7632aea 100644
--- a/preference/preference/src/main/res/values-en-rCA/strings.xml
+++ b/preference/preference/src/main/res/values-en-rCA/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ON"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"OFF"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Advanced"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Copy"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" copied to clipboard."</string>
-    <string name="not_set" msgid="5322289270060224450">"Not set"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ON"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"OFF"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Advanced"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Copy"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" copied to clipboard."</string>
+    <string name="not_set" msgid="6573031135582639649">"Not set"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-en-rGB/strings.xml b/preference/preference/src/main/res/values-en-rGB/strings.xml
index fa1e33d..a16f7bf 100644
--- a/preference/preference/src/main/res/values-en-rGB/strings.xml
+++ b/preference/preference/src/main/res/values-en-rGB/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ON"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"OFF"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Advanced"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Copy"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\'<xliff:g id="SUMMARY">%1$s</xliff:g>\' copied to clipboard."</string>
-    <string name="not_set" msgid="5322289270060224450">"Not set"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ON"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"OFF"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Advanced"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Copy"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\'<xliff:g id="SUMMARY">%1$s</xliff:g>\' copied to clipboard."</string>
+    <string name="not_set" msgid="6573031135582639649">"Not set"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-en-rIN/strings.xml b/preference/preference/src/main/res/values-en-rIN/strings.xml
index fa1e33d..a16f7bf 100644
--- a/preference/preference/src/main/res/values-en-rIN/strings.xml
+++ b/preference/preference/src/main/res/values-en-rIN/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ON"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"OFF"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Advanced"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Copy"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\'<xliff:g id="SUMMARY">%1$s</xliff:g>\' copied to clipboard."</string>
-    <string name="not_set" msgid="5322289270060224450">"Not set"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ON"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"OFF"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Advanced"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Copy"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\'<xliff:g id="SUMMARY">%1$s</xliff:g>\' copied to clipboard."</string>
+    <string name="not_set" msgid="6573031135582639649">"Not set"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-es-rUS/strings.xml b/preference/preference/src/main/res/values-es-rUS/strings.xml
index 42f3c1e..06dfaf0 100644
--- a/preference/preference/src/main/res/values-es-rUS/strings.xml
+++ b/preference/preference/src/main/res/values-es-rUS/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ACTIVADO"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"DESACTIVADO"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Avanzado"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Copiar"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Se copió \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" en el portapapeles."</string>
-    <string name="not_set" msgid="5322289270060224450">"Sin establecer"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ACTIVADO"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"DESACTIVADO"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Opciones avanzadas"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Copiar"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Se copió \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" en el portapapeles."</string>
+    <string name="not_set" msgid="6573031135582639649">"Sin definir"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-es/strings.xml b/preference/preference/src/main/res/values-es/strings.xml
index 1be3e4d..1d0efba 100644
--- a/preference/preference/src/main/res/values-es/strings.xml
+++ b/preference/preference/src/main/res/values-es/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ACTIVADO"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"DESACTIVADO"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Avanzado"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Copiar"</string>
-    <string name="preference_copied" msgid="811987176883013580">"<xliff:g id="SUMMARY">%1$s</xliff:g> se ha copiado en el portapapeles."</string>
-    <string name="not_set" msgid="5322289270060224450">"Sin definir"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ACTIVADO"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"DESACTIVADA"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Ajustes avanzados"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Copiar"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" se ha copiado en el portapapeles."</string>
+    <string name="not_set" msgid="6573031135582639649">"Sin establecer"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-et/strings.xml b/preference/preference/src/main/res/values-et/strings.xml
index 1f7dd54..e9b9176 100644
--- a/preference/preference/src/main/res/values-et/strings.xml
+++ b/preference/preference/src/main/res/values-et/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"SEES"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"VÄLJAS"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Täpsemad"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopeeri"</string>
-    <string name="preference_copied" msgid="811987176883013580">"„<xliff:g id="SUMMARY">%1$s</xliff:g>“ on lõikelauale kopeeritud."</string>
-    <string name="not_set" msgid="5322289270060224450">"Määramata"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"SEES"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"VÄLJAS"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Täpsemad"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopeerimine"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"„<xliff:g id="SUMMARY">%1$s</xliff:g>” on lõikelauale kopeeritud."</string>
+    <string name="not_set" msgid="6573031135582639649">"Määramata"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-eu/strings.xml b/preference/preference/src/main/res/values-eu/strings.xml
index 3b3cffa..73939c8 100644
--- a/preference/preference/src/main/res/values-eu/strings.xml
+++ b/preference/preference/src/main/res/values-eu/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"AKTIBATUTA"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"DESAKTIBATUTA"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Aurreratuak"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopiatu"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Arbelean kopiatu da \"<xliff:g id="SUMMARY">%1$s</xliff:g>\"."</string>
-    <string name="not_set" msgid="5322289270060224450">"Ezarri gabe"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"AKTIBATUTA"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"DESAKTIBATUTA"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Hobespen aurreratuak"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopiatu"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Arbelean kopiatu da \"<xliff:g id="SUMMARY">%1$s</xliff:g>\"."</string>
+    <string name="not_set" msgid="6573031135582639649">"Ez da ezarri"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-fa/strings.xml b/preference/preference/src/main/res/values-fa/strings.xml
index 5bd3ae1..ca6e3b1 100644
--- a/preference/preference/src/main/res/values-fa/strings.xml
+++ b/preference/preference/src/main/res/values-fa/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"روشن"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"خاموش"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"پیشرفته"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"‫<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>،‏ <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"کپی کردن"</string>
-    <string name="preference_copied" msgid="811987176883013580">"‫«<xliff:g id="SUMMARY">%1$s</xliff:g>» در بریده‌دان کپی شد."</string>
-    <string name="not_set" msgid="5322289270060224450">"تنظیم نشده"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"روشن"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"خاموش"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"پیشرفته"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>، <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"کپی"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"«<xliff:g id="SUMMARY">%1$s</xliff:g>» در بریده‌دان کپی شد."</string>
+    <string name="not_set" msgid="6573031135582639649">"تنظیم نشده"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-fi/strings.xml b/preference/preference/src/main/res/values-fi/strings.xml
index c9616de..a925765 100644
--- a/preference/preference/src/main/res/values-fi/strings.xml
+++ b/preference/preference/src/main/res/values-fi/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"PÄÄLLÄ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"EI PÄÄLLÄ"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Lisäasetukset"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopioi"</string>
-    <string name="preference_copied" msgid="811987176883013580">"<xliff:g id="SUMMARY">%1$s</xliff:g> kopioitiin leikepöydälle."</string>
-    <string name="not_set" msgid="5322289270060224450">"Ei asetettu"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"KÄYTÖSSÄ"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"POIS KÄYTÖSTÄ"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Lisäasetukset"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopioi"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"<xliff:g id="SUMMARY">%1$s</xliff:g> kopioitiin leikepöydälle."</string>
+    <string name="not_set" msgid="6573031135582639649">"Ei asetettu"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-fr-rCA/strings.xml b/preference/preference/src/main/res/values-fr-rCA/strings.xml
index daa8ef4..56f7a88 100644
--- a/preference/preference/src/main/res/values-fr-rCA/strings.xml
+++ b/preference/preference/src/main/res/values-fr-rCA/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ACTIVÉ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"DÉSACTIVÉ"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Avancé"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Copier"</string>
-    <string name="preference_copied" msgid="811987176883013580">"« <xliff:g id="SUMMARY">%1$s</xliff:g> » copié dans le presse-papiers."</string>
-    <string name="not_set" msgid="5322289270060224450">"Non défini"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ACTIVÉ"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"DÉSACTIVÉ"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Paramètres avancés"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Copier"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"« <xliff:g id="SUMMARY">%1$s</xliff:g> » copié dans le presse-papiers."</string>
+    <string name="not_set" msgid="6573031135582639649">"Non défini"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-fr/strings.xml b/preference/preference/src/main/res/values-fr/strings.xml
index 191e0b5..1348f8c 100644
--- a/preference/preference/src/main/res/values-fr/strings.xml
+++ b/preference/preference/src/main/res/values-fr/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ACTIVÉ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"DÉSACTIVÉ"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Avancé"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Copier"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" copié dans le presse-papier."</string>
-    <string name="not_set" msgid="5322289270060224450">"Non défini"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ACTIVÉ"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"DÉSACTIVÉ"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Avancé"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Copier"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" copié dans le presse-papier."</string>
+    <string name="not_set" msgid="6573031135582639649">"Non définie"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-gl/strings.xml b/preference/preference/src/main/res/values-gl/strings.xml
index 5e9d1a7..5f3bdc3 100644
--- a/preference/preference/src/main/res/values-gl/strings.xml
+++ b/preference/preference/src/main/res/values-gl/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"OPCIÓN ACTIVADA"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"OPCIÓN DESACTIVADA"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Avanzada"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Copiar"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Copiouse \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" no portapapeis."</string>
-    <string name="not_set" msgid="5322289270060224450">"Sen configurar"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ACTIVADO"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"DESACTIVADO"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Configuración avanzada"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Copiar"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Copiouse \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" no portapapeis."</string>
+    <string name="not_set" msgid="6573031135582639649">"Sen configurar"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-gu/strings.xml b/preference/preference/src/main/res/values-gu/strings.xml
index 4b702ba..9f50201 100644
--- a/preference/preference/src/main/res/values-gu/strings.xml
+++ b/preference/preference/src/main/res/values-gu/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ચાલુ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"બંધ"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"વિગતવાર"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"કૉપિ કરો"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\"ને ક્લિપબોર્ડ પર કૉપિ કર્યો."</string>
-    <string name="not_set" msgid="5322289270060224450">"સેટ નથી"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ચાલુ કરો"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"બંધ કરો"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"વિગતવાર"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"કૉપિ કરો"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\"ને ક્લિપ બોર્ડ પર કૉપિ કર્યો."</string>
+    <string name="not_set" msgid="6573031135582639649">"સેટ કર્યું નથી"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-hi/strings.xml b/preference/preference/src/main/res/values-hi/strings.xml
index 5b5db05..8576490 100644
--- a/preference/preference/src/main/res/values-hi/strings.xml
+++ b/preference/preference/src/main/res/values-hi/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"चालू है"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"बंद है"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"बेहतर बनाएं"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"कॉपी करें"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" क्लिपबोर्ड पर कॉपी किया गया."</string>
-    <string name="not_set" msgid="5322289270060224450">"सेट नहीं है"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"चालू"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"बंद"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"ऐडवांस सेटिंग"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"कॉपी करें"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" क्लिपबोर्ड पर कॉपी किया गया."</string>
+    <string name="not_set" msgid="6573031135582639649">"सेट नहीं है"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-hr/strings.xml b/preference/preference/src/main/res/values-hr/strings.xml
index 12af670..fd9e29c 100644
--- a/preference/preference/src/main/res/values-hr/strings.xml
+++ b/preference/preference/src/main/res/values-hr/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"UKLJUČENO"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ISKLJUČENO"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Napredno"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopiraj"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Sažetak <xliff:g id="SUMMARY">%1$s</xliff:g> kopiran je u međuspremnik."</string>
-    <string name="not_set" msgid="5322289270060224450">"Nije postavljeno"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"UKLJUČENO"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ISKLJUČENO"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Napredno"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopiraj"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Sažetak \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" kopiran je u međuspremnik."</string>
+    <string name="not_set" msgid="6573031135582639649">"Nije postavljeno"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-hu/strings.xml b/preference/preference/src/main/res/values-hu/strings.xml
index be84b13..86aa99b 100644
--- a/preference/preference/src/main/res/values-hu/strings.xml
+++ b/preference/preference/src/main/res/values-hu/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"BE"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"KI"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Speciális"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Másolás"</string>
-    <string name="preference_copied" msgid="811987176883013580">"A(z) „<xliff:g id="SUMMARY">%1$s</xliff:g>” a vágólapra lett másolva."</string>
-    <string name="not_set" msgid="5322289270060224450">"Nincs beállítva"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"BE"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"KI"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Speciális"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Másolás"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"„<xliff:g id="SUMMARY">%1$s</xliff:g>” a vágólapra lett másolva."</string>
+    <string name="not_set" msgid="6573031135582639649">"Nincs beállítva"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-hy/strings.xml b/preference/preference/src/main/res/values-hy/strings.xml
index 323e373..f5df86b 100644
--- a/preference/preference/src/main/res/values-hy/strings.xml
+++ b/preference/preference/src/main/res/values-hy/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ՄԻԱՑՆԵԼ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ԱՆՋԱՏԵԼ"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Ծավալել"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Պատճենել"</string>
-    <string name="preference_copied" msgid="811987176883013580">"«<xliff:g id="SUMMARY">%1$s</xliff:g>» կարգավորումը պատճենվեց սեղմատախտակին։"</string>
-    <string name="not_set" msgid="5322289270060224450">"Կարգավորված չէ"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ՄԻԱՑՎԱԾ"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ԱՆՋԱՏԱԾ"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Լրացուցիչ"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Պատճենել"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"«<xliff:g id="SUMMARY">%1$s</xliff:g>». պատճենվեց սեղմատախտակին:"</string>
+    <string name="not_set" msgid="6573031135582639649">"Կարգավորված չէ"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-in/strings.xml b/preference/preference/src/main/res/values-in/strings.xml
index 2fb6dbb..f9da4ed 100644
--- a/preference/preference/src/main/res/values-in/strings.xml
+++ b/preference/preference/src/main/res/values-in/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"AKTIF"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"NONAKTIF"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Lanjutan"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Salin"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" disalin ke papan klip."</string>
-    <string name="not_set" msgid="5322289270060224450">"Tidak disetel"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"AKTIF"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"NONAKTIF"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Lanjutan"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Salin"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" disalin ke papan klip."</string>
+    <string name="not_set" msgid="6573031135582639649">"Belum disetel"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-is/strings.xml b/preference/preference/src/main/res/values-is/strings.xml
index 889e642..6f18154 100644
--- a/preference/preference/src/main/res/values-is/strings.xml
+++ b/preference/preference/src/main/res/values-is/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"KVEIKT"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"SLÖKKT"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Ítarlegt"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Afrita"</string>
-    <string name="preference_copied" msgid="811987176883013580">"„<xliff:g id="SUMMARY">%1$s</xliff:g>“ afritað á klippiborðið."</string>
-    <string name="not_set" msgid="5322289270060224450">"Ekki stillt"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"KVEIKT"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"SLÖKKT"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Ítarlegt"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Afrita"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"„<xliff:g id="SUMMARY">%1$s</xliff:g>“ afritað á klippiborðið."</string>
+    <string name="not_set" msgid="6573031135582639649">"Ekki stillt"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-it/strings.xml b/preference/preference/src/main/res/values-it/strings.xml
index 6dfbe4a..70451a8 100644
--- a/preference/preference/src/main/res/values-it/strings.xml
+++ b/preference/preference/src/main/res/values-it/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ON"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"OFF"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Avanzate"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Copia"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" copiato negli appunti."</string>
-    <string name="not_set" msgid="5322289270060224450">"Non impostata"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ON"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"OFF"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Avanzate"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Copia"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\"copiato negli appunti."</string>
+    <string name="not_set" msgid="6573031135582639649">"Non impostato"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-iw/strings.xml b/preference/preference/src/main/res/values-iw/strings.xml
index 4d53db9..3cbf203 100644
--- a/preference/preference/src/main/res/values-iw/strings.xml
+++ b/preference/preference/src/main/res/values-iw/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"מצב פעיל"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"מצב מושבת"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"הגדרות מתקדמות"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"‫<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>,‏ <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"העתקה"</string>
-    <string name="preference_copied" msgid="811987176883013580">"הטקסט \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" הועתק ללוח."</string>
-    <string name="not_set" msgid="5322289270060224450">"לא הוגדרה"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"מופעל"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"כבוי"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"מתקדם"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"העתקה"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" הועתק ללוח."</string>
+    <string name="not_set" msgid="6573031135582639649">"לא מוגדרת"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-ja/strings.xml b/preference/preference/src/main/res/values-ja/strings.xml
index d9b5116..80ec03a 100644
--- a/preference/preference/src/main/res/values-ja/strings.xml
+++ b/preference/preference/src/main/res/values-ja/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ON"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"OFF"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"詳細設定"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>、<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"コピー"</string>
-    <string name="preference_copied" msgid="811987176883013580">"「<xliff:g id="SUMMARY">%1$s</xliff:g>」をクリップボードにコピーしました。"</string>
-    <string name="not_set" msgid="5322289270060224450">"未設定"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ON"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"OFF"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"詳細設定"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>、<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"コピー"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"「<xliff:g id="SUMMARY">%1$s</xliff:g>」をクリップボードにコピーしました。"</string>
+    <string name="not_set" msgid="6573031135582639649">"未設定"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-ka/strings.xml b/preference/preference/src/main/res/values-ka/strings.xml
index 800a8c9..c232637 100644
--- a/preference/preference/src/main/res/values-ka/strings.xml
+++ b/preference/preference/src/main/res/values-ka/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ჩართული"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"გამორთული"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"გაფართოებული"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"კოპირება"</string>
-    <string name="preference_copied" msgid="811987176883013580">"„<xliff:g id="SUMMARY">%1$s</xliff:g>“ კოპირებულია გაცვლის ბუფერში."</string>
-    <string name="not_set" msgid="5322289270060224450">"არ არის დაყენებული"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ჩართული"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"გამორთული"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"დამატებით"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"კოპირება"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"„<xliff:g id="SUMMARY">%1$s</xliff:g>“ კოპირებულია გაცვლის ბუფერში."</string>
+    <string name="not_set" msgid="6573031135582639649">"არ არის დაყენებული"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-kk/strings.xml b/preference/preference/src/main/res/values-kk/strings.xml
index 9e0e753..6d96df9 100644
--- a/preference/preference/src/main/res/values-kk/strings.xml
+++ b/preference/preference/src/main/res/values-kk/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ҚОСУЛЫ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ӨШІРУЛІ"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Қосымша"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Көшіру"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" қорытындысы буферге көшірілді."</string>
-    <string name="not_set" msgid="5322289270060224450">"Орнатылмаған"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ҚОСУЛЫ"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ӨШІРУЛІ"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Қосымша"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Көшіру"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" қорытындысы буферге көшірілді"</string>
+    <string name="not_set" msgid="6573031135582639649">"Орнатылмаған"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-km/strings.xml b/preference/preference/src/main/res/values-km/strings.xml
index 5ae15c6..2eba4b4 100644
--- a/preference/preference/src/main/res/values-km/strings.xml
+++ b/preference/preference/src/main/res/values-km/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"បើក"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"បិទ"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"កម្រិតខ្ពស់"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"ចម្លង"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" បានចម្លងទៅ​ឃ្លីបបត។"</string>
-    <string name="not_set" msgid="5322289270060224450">"មិនបានកំណត់"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"បើក"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"បិទ"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"កម្រិតខ្ពស់"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"ចម្លង"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" បានចម្លងទៅ​ឃ្លីបបត។"</string>
+    <string name="not_set" msgid="6573031135582639649">"មិនបានកំណត់"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-kn/strings.xml b/preference/preference/src/main/res/values-kn/strings.xml
index bf42405..129c3d3 100644
--- a/preference/preference/src/main/res/values-kn/strings.xml
+++ b/preference/preference/src/main/res/values-kn/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ಆನ್ ಆಗಿದೆ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ಆಫ್ ಆಗಿದೆ"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"ಸುಧಾರಿತ"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"ಕಾಪಿ ಮಾಡಿ"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ಅನ್ನು ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ಕಾಪಿ ಮಾಡಲಾಗಿದೆ."</string>
-    <string name="not_set" msgid="5322289270060224450">"ಸೆಟ್ ಮಾಡಿಲ್ಲ"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ಆನ್"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ಆಫ್"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"ಸುಧಾರಿತ"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"ನಕಲಿಸಿ"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ಅನ್ನು ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಲಾಗಿದೆ."</string>
+    <string name="not_set" msgid="6573031135582639649">"ಹೊಂದಿಸಿಲ್ಲ"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-ko/strings.xml b/preference/preference/src/main/res/values-ko/strings.xml
index ea4adea..0d0704a 100644
--- a/preference/preference/src/main/res/values-ko/strings.xml
+++ b/preference/preference/src/main/res/values-ko/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"사용"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"사용 안 함"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"고급"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"복사"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" 개요가 클립보드에 복사되었습니다."</string>
-    <string name="not_set" msgid="5322289270060224450">"설정되지 않음"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"사용"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"사용 안함"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"고급"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"복사"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\'<xliff:g id="SUMMARY">%1$s</xliff:g>\'이(가) 클립보드에 복사되었습니다."</string>
+    <string name="not_set" msgid="6573031135582639649">"설정되지 않음"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-ky/strings.xml b/preference/preference/src/main/res/values-ky/strings.xml
index 398cad4..feccf10 100644
--- a/preference/preference/src/main/res/values-ky/strings.xml
+++ b/preference/preference/src/main/res/values-ky/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"КҮЙҮК"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ӨЧҮК"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Өркүндөтүлгөн"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Көчүрүү"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" алмашуу буферине көчүрүлдү."</string>
-    <string name="not_set" msgid="5322289270060224450">"Туураланган эмес"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"КҮЙҮК"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ӨЧҮК"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Өркүндөтүлгөн"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Көчүрүү"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" алмашуу буферине көчүрүлдү."</string>
+    <string name="not_set" msgid="6573031135582639649">"Коюлган эмес"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-lo/strings.xml b/preference/preference/src/main/res/values-lo/strings.xml
index a53a18e..4f20e98 100644
--- a/preference/preference/src/main/res/values-lo/strings.xml
+++ b/preference/preference/src/main/res/values-lo/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ເປີດ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ປິດ"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"ຂັ້ນສູງ"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"ສຳເນົາ"</string>
-    <string name="preference_copied" msgid="811987176883013580">"ສຳເນົາ \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ໄປໃສ່ຄລິບບອດແລ້ວ."</string>
-    <string name="not_set" msgid="5322289270060224450">"ຍັງບໍ່ໄດ້ຕັ້ງ"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ເປີດ"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ປິດ"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"ຂັ້ນສູງ"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"ສຳເນົາ"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"ສຳເນົາ \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ໄປໃສ່ຄລິບບອດແລ້ວ."</string>
+    <string name="not_set" msgid="6573031135582639649">"ບໍ່ໄດ້ຕັ້ງຄ່າ"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-lt/strings.xml b/preference/preference/src/main/res/values-lt/strings.xml
index 4e8de62..cded560 100644
--- a/preference/preference/src/main/res/values-lt/strings.xml
+++ b/preference/preference/src/main/res/values-lt/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ĮJUNGTA"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"IŠJUNGTA"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Išplėstiniai"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopijuoti"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Suvestinė „<xliff:g id="SUMMARY">%1$s</xliff:g>“ nukopijuota į iškarpinę."</string>
-    <string name="not_set" msgid="5322289270060224450">"Nenustatyta"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ĮJUNGTA"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"IŠJUNGTA"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Išplėstiniai"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopijuoti"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Suvestinė „<xliff:g id="SUMMARY">%1$s</xliff:g>“ nukopijuota į iškarpinę."</string>
+    <string name="not_set" msgid="6573031135582639649">"Nenustatyta"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-lv/strings.xml b/preference/preference/src/main/res/values-lv/strings.xml
index b76513d..bf174e6 100644
--- a/preference/preference/src/main/res/values-lv/strings.xml
+++ b/preference/preference/src/main/res/values-lv/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"IESLĒGTS"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"IZSLĒGTS"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Papildu"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopēt"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Preferences kopsavilkums “<xliff:g id="SUMMARY">%1$s</xliff:g>” ir kopēts starpliktuvē."</string>
-    <string name="not_set" msgid="5322289270060224450">"Nav iestatīts"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"IESLĒGTS"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"IZSLĒGTS"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Papildu iestatījumi"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopēt"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Preference “<xliff:g id="SUMMARY">%1$s</xliff:g>” ir kopēta starpliktuvē."</string>
+    <string name="not_set" msgid="6573031135582639649">"Nav iestatīts"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-mk/strings.xml b/preference/preference/src/main/res/values-mk/strings.xml
index 8dce0302..091c39a 100644
--- a/preference/preference/src/main/res/values-mk/strings.xml
+++ b/preference/preference/src/main/res/values-mk/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ВКЛУЧЕНО"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ИСКЛУЧЕНО"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Напредно"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Копирај"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Резимето „<xliff:g id="SUMMARY">%1$s</xliff:g>“ е копирано во привремената меморија."</string>
-    <string name="not_set" msgid="5322289270060224450">"Не е поставено"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ВКЛУЧЕНО"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ИСКЛУЧЕНО"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Напредни"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Копирај"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"„<xliff:g id="SUMMARY">%1$s</xliff:g>“ копирано во привремена меморија."</string>
+    <string name="not_set" msgid="6573031135582639649">"Не е поставено"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-ml/strings.xml b/preference/preference/src/main/res/values-ml/strings.xml
index c971c77..68852db 100644
--- a/preference/preference/src/main/res/values-ml/strings.xml
+++ b/preference/preference/src/main/res/values-ml/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ഓണാണ്"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ഓഫാണ്"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"വിപുലമായത്"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"പകർത്തുക"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ക്ലിപ്‌ബോർഡിലേക്ക് പകർത്തി."</string>
-    <string name="not_set" msgid="5322289270060224450">"സജ്ജീകരിച്ചിട്ടില്ല"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ഓൺ"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ഓഫാണ്"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"വിപുലമായത്"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"പകർത്തുക"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ക്ലിപ്‌ബോർഡിലേക്ക് പകർത്തി."</string>
+    <string name="not_set" msgid="6573031135582639649">"സജ്ജീകരിച്ചിട്ടില്ല"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-mn/strings.xml b/preference/preference/src/main/res/values-mn/strings.xml
index 258ecee..dfde992 100644
--- a/preference/preference/src/main/res/values-mn/strings.xml
+++ b/preference/preference/src/main/res/values-mn/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"АСААЛТТАЙ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"УНТРААЛТТАЙ"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Нарийвчилсан"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Хуулах"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\"-г түр санах ойд хуулсан."</string>
-    <string name="not_set" msgid="5322289270060224450">"Тохируулаагүй"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ИДЭВХТЭЙ"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ИДЭВХГҮЙ"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Дэлгэрэнгүй"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Хуулах"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\"-г түр санах ойд хуулсан."</string>
+    <string name="not_set" msgid="6573031135582639649">"Тохируулаагүй"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-mr/strings.xml b/preference/preference/src/main/res/values-mr/strings.xml
index 667d216..146c94b 100644
--- a/preference/preference/src/main/res/values-mr/strings.xml
+++ b/preference/preference/src/main/res/values-mr/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"सुरू आहे"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"बंद आहे"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"प्रगत"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"कॉपी करा"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" क्लिपबोर्डवर कॉपी केली."</string>
-    <string name="not_set" msgid="5322289270060224450">"सेट केलेले नाही"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"सुरू"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"बंद"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"प्रगत"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"कॉपी करा"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" क्लिपबोर्डवर कॉपी केली."</string>
+    <string name="not_set" msgid="6573031135582639649">"सेट केलेले नाही"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-ms/strings.xml b/preference/preference/src/main/res/values-ms/strings.xml
index fa787a2..cca4566 100644
--- a/preference/preference/src/main/res/values-ms/strings.xml
+++ b/preference/preference/src/main/res/values-ms/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"HIDUP"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"MATI"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Lanjutan"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Salin"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" disalin kepada papan keratan."</string>
-    <string name="not_set" msgid="5322289270060224450">"Tidak ditetapkan"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"HIDUP"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"MATI"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Terperinci"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Salin"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" disalin ke papan keratan."</string>
+    <string name="not_set" msgid="6573031135582639649">"Tidak ditetapkan"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-my/strings.xml b/preference/preference/src/main/res/values-my/strings.xml
index 131a34f..270e79b 100644
--- a/preference/preference/src/main/res/values-my/strings.xml
+++ b/preference/preference/src/main/res/values-my/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ဖွင့်"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ပိတ်"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"အဆင့်မြင့်"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>၊ <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"မိတ္တူကူးရန်"</string>
-    <string name="preference_copied" msgid="811987176883013580">"“<xliff:g id="SUMMARY">%1$s</xliff:g>” ကို ကလစ်ဘုတ်သို့ မိတ္တူကူးပြီးပြီ။"</string>
-    <string name="not_set" msgid="5322289270060224450">"သတ်မှတ်မထားပါ"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ဖွင့်"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ပိတ်"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"အဆင့်မြင့်"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>၊ <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"မိတ္တူကူးရန်"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ကို ကလစ်ဘုတ်သို့ မိတ္တူကူးယူပြီးပါပြီ။"</string>
+    <string name="not_set" msgid="6573031135582639649">"သတ်မှတ်မထားပါ"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-nb/strings.xml b/preference/preference/src/main/res/values-nb/strings.xml
index c004e50..b7bab05 100644
--- a/preference/preference/src/main/res/values-nb/strings.xml
+++ b/preference/preference/src/main/res/values-nb/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"PÅ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"AV"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Avansert"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopiér"</string>
-    <string name="preference_copied" msgid="811987176883013580">"«<xliff:g id="SUMMARY">%1$s</xliff:g>» er kopiert til utklippstavlen."</string>
-    <string name="not_set" msgid="5322289270060224450">"Ikke angitt"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"PÅ"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"AV"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Avansert"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopiér"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"«<xliff:g id="SUMMARY">%1$s</xliff:g>» er kopiert til utklippstavlen."</string>
+    <string name="not_set" msgid="6573031135582639649">"Ikke angitt"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-ne/strings.xml b/preference/preference/src/main/res/values-ne/strings.xml
index 49a31dd..07559cc 100644
--- a/preference/preference/src/main/res/values-ne/strings.xml
+++ b/preference/preference/src/main/res/values-ne/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"अन छ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"अफ छ"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"उन्नत"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"कपी गर्नुहोस्"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" कपी गरी क्लिपबोर्डमा पेस्ट गरियो।"</string>
-    <string name="not_set" msgid="5322289270060224450">"सेट गरिएको छैन"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"सक्रिय"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"निष्क्रिय पार्नुहोस्‌"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"उन्नत"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"कपी गर्नुहोस्"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" लाई क्लिपबोर्डमा कपी गरियो।"</string>
+    <string name="not_set" msgid="6573031135582639649">"सेट गरिएको छैन"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-nl/strings.xml b/preference/preference/src/main/res/values-nl/strings.xml
index 2d24728..11c51c0 100644
--- a/preference/preference/src/main/res/values-nl/strings.xml
+++ b/preference/preference/src/main/res/values-nl/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"AAN"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"UIT"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Geavanceerd"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopiëren"</string>
-    <string name="preference_copied" msgid="811987176883013580">"<xliff:g id="SUMMARY">%1$s</xliff:g> is gekopieerd naar het klembord."</string>
-    <string name="not_set" msgid="5322289270060224450">"Niet ingesteld"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"AAN"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"UIT"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Geavanceerd"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopiëren"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\'<xliff:g id="SUMMARY">%1$s</xliff:g>\' is gekopieerd naar het klembord."</string>
+    <string name="not_set" msgid="6573031135582639649">"Niet ingesteld"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-or/strings.xml b/preference/preference/src/main/res/values-or/strings.xml
index ca18bb7..4282344 100644
--- a/preference/preference/src/main/res/values-or/strings.xml
+++ b/preference/preference/src/main/res/values-or/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ଚାଲୁ ଅଛି"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ବନ୍ଦ ଅଛି"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"ଉନ୍ନତ"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"କପି କରନ୍ତୁ"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\"କୁ କ୍ଲିପବୋର୍ଡକୁ କପି କରାଯାଇଛି।"</string>
-    <string name="not_set" msgid="5322289270060224450">"ସେଟ କରାଯାଇନାହିଁ"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ଚାଲୁ ଅଛି"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ବନ୍ଦ"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"ଅଧିକ ଉନ୍ନତ"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"କପି କରନ୍ତୁ"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" କ୍ଲିପବୋର୍ଡକୁ କପି ହୋ‍ଇଗଲା।"</string>
+    <string name="not_set" msgid="6573031135582639649">"ସେଟ ହୋଇନାହିଁ"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-pa/strings.xml b/preference/preference/src/main/res/values-pa/strings.xml
index 41ac218..c693c54 100644
--- a/preference/preference/src/main/res/values-pa/strings.xml
+++ b/preference/preference/src/main/res/values-pa/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ਚਾਲੂ ਹੈ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ਬੰਦ ਹੈ"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"ਅਡਵਾਂਸ"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"ਕਾਪੀ ਕਰੋ"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ਨੂੰ ਕਲਿੱਪਬੋਰਡ \'ਤੇ ਕਾਪੀ ਕੀਤਾ ਗਿਆ।"</string>
-    <string name="not_set" msgid="5322289270060224450">"ਸੈੱਟ ਨਹੀਂ ਹੈ"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ਚਾਲੂ"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ਬੰਦ"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"ਅਡਵਾਂਸ"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"ਕਾਪੀ ਕਰੋ"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ਨੂੰ ਕਲਿੱਪਬੋਰਡ \'ਤੇ ਕਾਪੀ ਕੀਤਾ ਗਿਆ।"</string>
+    <string name="not_set" msgid="6573031135582639649">"ਸੈੱਟ ਨਹੀਂ ਹੈ"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-pl/strings.xml b/preference/preference/src/main/res/values-pl/strings.xml
index 35579e1..cbf698c 100644
--- a/preference/preference/src/main/res/values-pl/strings.xml
+++ b/preference/preference/src/main/res/values-pl/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"WŁ."</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"WYŁ."</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Zaawansowane"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopiuj"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Skopiowano „<xliff:g id="SUMMARY">%1$s</xliff:g>” do schowka."</string>
-    <string name="not_set" msgid="5322289270060224450">"Nie ustawiono"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"WŁ."</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"WYŁ."</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Zaawansowane"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopiuj"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Skopiowano „<xliff:g id="SUMMARY">%1$s</xliff:g>” do schowka."</string>
+    <string name="not_set" msgid="6573031135582639649">"Nie ustawiono"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-pt-rBR/strings.xml b/preference/preference/src/main/res/values-pt-rBR/strings.xml
index 30a456a..d79d582 100644
--- a/preference/preference/src/main/res/values-pt-rBR/strings.xml
+++ b/preference/preference/src/main/res/values-pt-rBR/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ATIVADAS"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"DESATIVADAS"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Avançadas"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Copiar"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" copiado para a área de transferência."</string>
-    <string name="not_set" msgid="5322289270060224450">"Não definido"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ATIVADO"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"DESATIVADO"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Avançado"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Copiar"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" copiado para a área de transferência."</string>
+    <string name="not_set" msgid="6573031135582639649">"Não definido"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-pt-rPT/strings.xml b/preference/preference/src/main/res/values-pt-rPT/strings.xml
index 73e7bf3c..1761efc 100644
--- a/preference/preference/src/main/res/values-pt-rPT/strings.xml
+++ b/preference/preference/src/main/res/values-pt-rPT/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ATIVADO"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"DESATIVADO"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Avançadas"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Copiar"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" copiado para a área de transferência."</string>
-    <string name="not_set" msgid="5322289270060224450">"Não definido"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ATIVADO"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"DESATIVADO"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Avançadas"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Copiar"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" copiado para a área de transferência."</string>
+    <string name="not_set" msgid="6573031135582639649">"Não definido"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-pt/strings.xml b/preference/preference/src/main/res/values-pt/strings.xml
index 30a456a..d79d582 100644
--- a/preference/preference/src/main/res/values-pt/strings.xml
+++ b/preference/preference/src/main/res/values-pt/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ATIVADAS"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"DESATIVADAS"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Avançadas"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Copiar"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" copiado para a área de transferência."</string>
-    <string name="not_set" msgid="5322289270060224450">"Não definido"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ATIVADO"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"DESATIVADO"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Avançado"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Copiar"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" copiado para a área de transferência."</string>
+    <string name="not_set" msgid="6573031135582639649">"Não definido"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-ro/strings.xml b/preference/preference/src/main/res/values-ro/strings.xml
index f83e1ba..a2b2996 100644
--- a/preference/preference/src/main/res/values-ro/strings.xml
+++ b/preference/preference/src/main/res/values-ro/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ACTIVAT"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"DEZACTIVAT"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Complexe"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Copiază"</string>
-    <string name="preference_copied" msgid="811987176883013580">"<xliff:g id="SUMMARY">%1$s</xliff:g> s-a copiat în clipboard."</string>
-    <string name="not_set" msgid="5322289270060224450">"Nesetată"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ACTIVAT"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"DEZACTIVAT"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Avansat"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Copiază"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"„<xliff:g id="SUMMARY">%1$s</xliff:g>” a fost copiat în clipboard."</string>
+    <string name="not_set" msgid="6573031135582639649">"Nesetată"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-ru/strings.xml b/preference/preference/src/main/res/values-ru/strings.xml
index a1bf7ea..ccef620 100644
--- a/preference/preference/src/main/res/values-ru/strings.xml
+++ b/preference/preference/src/main/res/values-ru/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ВКЛ."</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ОТКЛ."</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Дополнительно"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Копировать"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Текст \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" скопирован в буфер обмена."</string>
-    <string name="not_set" msgid="5322289270060224450">"Не задано"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ВКЛ."</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ВЫКЛ."</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Дополнительно"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Копировать"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Текст \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" скопирован в буфер обмена"</string>
+    <string name="not_set" msgid="6573031135582639649">"Не указано"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-si/strings.xml b/preference/preference/src/main/res/values-si/strings.xml
index 2f243da..6c169fa 100644
--- a/preference/preference/src/main/res/values-si/strings.xml
+++ b/preference/preference/src/main/res/values-si/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ක්‍රියාත්මකයි"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ක්‍රියාවිරහිතයි"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"උසස්"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"පිටපත් කරන්න"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" පසුරු පුවරුවට පිටපත් කරන ලදි."</string>
-    <string name="not_set" msgid="5322289270060224450">"සකසා නැත"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ක්‍රියාත්මකයි"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ක්‍රියාවිරහිතයි"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"උසස්"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"පිටපත් කරන්න"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" පසුරු පුවරුවට පිටපත් කරන ලදී."</string>
+    <string name="not_set" msgid="6573031135582639649">"සකසා නැත"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-sk/strings.xml b/preference/preference/src/main/res/values-sk/strings.xml
index 3ffbd3a..6c7dff3 100644
--- a/preference/preference/src/main/res/values-sk/strings.xml
+++ b/preference/preference/src/main/res/values-sk/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ZAPNUTÉ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"VYPNUTÉ"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Pokročilé"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Skopírovať"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Položka <xliff:g id="SUMMARY">%1$s</xliff:g> bola skopírovaná do schránky."</string>
-    <string name="not_set" msgid="5322289270060224450">"Nenastavené"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"Zapnuté"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"Vypnuté"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Rozšírené"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Skopírovať"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Položka <xliff:g id="SUMMARY">%1$s</xliff:g> bola skopírovaná do schránky."</string>
+    <string name="not_set" msgid="6573031135582639649">"Nenastavené"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-sl/strings.xml b/preference/preference/src/main/res/values-sl/strings.xml
index 1834976..26b805f 100644
--- a/preference/preference/src/main/res/values-sl/strings.xml
+++ b/preference/preference/src/main/res/values-sl/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"VKLOPLJENO"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"IZKLOPLJENO"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Dodatno"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopiraj"</string>
-    <string name="preference_copied" msgid="811987176883013580">"»<xliff:g id="SUMMARY">%1$s</xliff:g>« je bilo kopirano v odložišče."</string>
-    <string name="not_set" msgid="5322289270060224450">"Ni nastavljeno"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"VKLOPLJENO"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"IZKLOPLJENO"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Dodatno"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopiraj"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"»<xliff:g id="SUMMARY">%1$s</xliff:g>« je bilo kopirano v odložišče."</string>
+    <string name="not_set" msgid="6573031135582639649">"Ni nastavljeno"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-sq/strings.xml b/preference/preference/src/main/res/values-sq/strings.xml
index 79997d0..6a2a42e 100644
--- a/preference/preference/src/main/res/values-sq/strings.xml
+++ b/preference/preference/src/main/res/values-sq/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"AKTIVE"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"JOAKTIVE"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Të përparuara"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopjo"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" u kopjua në kujtesën e fragmenteve"</string>
-    <string name="not_set" msgid="5322289270060224450">"Nuk është caktuar"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"AKTIV"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"JOAKTIV"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Të përparuara"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopjo"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" u kopjua në kujtesën e fragmenteve"</string>
+    <string name="not_set" msgid="6573031135582639649">"Nuk është caktuar"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-sr/strings.xml b/preference/preference/src/main/res/values-sr/strings.xml
index abd31f9..ee431b1 100644
--- a/preference/preference/src/main/res/values-sr/strings.xml
+++ b/preference/preference/src/main/res/values-sr/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"УКЉУЧЕНО"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ИСКЉУЧЕНО"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Напредно"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Копирај"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Резиме „<xliff:g id="SUMMARY">%1$s</xliff:g>“ је копиран у привремену меморију."</string>
-    <string name="not_set" msgid="5322289270060224450">"Није подешено"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"УКЉУЧЕНО"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ИСКЉУЧЕНО"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Напредно"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Копирај"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Резиме „<xliff:g id="SUMMARY">%1$s</xliff:g>“ је копиран у привремену меморију."</string>
+    <string name="not_set" msgid="6573031135582639649">"Није подешено"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-sv/strings.xml b/preference/preference/src/main/res/values-sv/strings.xml
index dfa9600..a7ef126 100644
--- a/preference/preference/src/main/res/values-sv/strings.xml
+++ b/preference/preference/src/main/res/values-sv/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"PÅ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"AV"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Avancerat"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopiera"</string>
-    <string name="preference_copied" msgid="811987176883013580">"<xliff:g id="SUMMARY">%1$s</xliff:g> har kopierats till urklipp."</string>
-    <string name="not_set" msgid="5322289270060224450">"Inte angivet"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"PÅ"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"AV"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Avancerat"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopiera"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"<xliff:g id="SUMMARY">%1$s</xliff:g> har kopierats till Urklipp."</string>
+    <string name="not_set" msgid="6573031135582639649">"Inte angett"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-sw/strings.xml b/preference/preference/src/main/res/values-sw/strings.xml
index 6ddc9a6..4219f3a 100644
--- a/preference/preference/src/main/res/values-sw/strings.xml
+++ b/preference/preference/src/main/res/values-sw/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"IMEWASHWA"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"IMEZIMWA"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Ya kina"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Nakili"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" imenakiliwa kwenye ubao wa kunakili."</string>
-    <string name="not_set" msgid="5322289270060224450">"Haijawekwa"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"IMEWASHWA"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"IMEZIMWA"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Mipangilio ya Kina"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Nakili"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" imenakiliwa kwenye ubao wa kunakili."</string>
+    <string name="not_set" msgid="6573031135582639649">"Haijawekwa"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-ta/strings.xml b/preference/preference/src/main/res/values-ta/strings.xml
index c3c0525..ead4d01 100644
--- a/preference/preference/src/main/res/values-ta/strings.xml
+++ b/preference/preference/src/main/res/values-ta/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ஆன்"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ஆஃப்"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"மேம்பட்டவை"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"நகலெடு"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது."</string>
-    <string name="not_set" msgid="5322289270060224450">"அமைக்கப்படவில்லை"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ஆன்"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ஆஃப்"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"மேம்பட்டவை"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"நகலெடு"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது."</string>
+    <string name="not_set" msgid="6573031135582639649">"அமைக்கப்படவில்லை"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-te/strings.xml b/preference/preference/src/main/res/values-te/strings.xml
index 0de68f2..6281965 100644
--- a/preference/preference/src/main/res/values-te/strings.xml
+++ b/preference/preference/src/main/res/values-te/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ఆన్"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ఆఫ్"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"అధునాతనం"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"కాపీ చేయండి"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" క్లిప్‌బోర్డ్‌కు కాపీ చేయబడింది."</string>
-    <string name="not_set" msgid="5322289270060224450">"సెట్ చేసి లేదు"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ఆన్ చేయండి"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ఆఫ్ చేయండి"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"అధునాతన సెట్టింగ్‌లు"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"కాపీ చేయండి"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" క్లిప్‌బోర్డ్‌కి కాపీ చేయబడింది."</string>
+    <string name="not_set" msgid="6573031135582639649">"సెట్ చేయలేదు"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-th/strings.xml b/preference/preference/src/main/res/values-th/strings.xml
index 9c32888..86362ad 100644
--- a/preference/preference/src/main/res/values-th/strings.xml
+++ b/preference/preference/src/main/res/values-th/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"เปิด"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ปิด"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"ขั้นสูง"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"คัดลอก"</string>
-    <string name="preference_copied" msgid="811987176883013580">"คัดลอก \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ไปยังคลิปบอร์ดแล้ว"</string>
-    <string name="not_set" msgid="5322289270060224450">"ไม่ได้ตั้งค่า"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"เปิด"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ปิด"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"ขั้นสูง"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g> <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"คัดลอก"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"คัดลอก \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ไปยังคลิปบอร์ดแล้ว"</string>
+    <string name="not_set" msgid="6573031135582639649">"ไม่ได้ตั้งค่า"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-tl/strings.xml b/preference/preference/src/main/res/values-tl/strings.xml
index a3eb644..380426d 100644
--- a/preference/preference/src/main/res/values-tl/strings.xml
+++ b/preference/preference/src/main/res/values-tl/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"NAKA-ON"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"NAKA-OFF"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Advanced"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopyahin"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Nakopya sa clipboard ang \"<xliff:g id="SUMMARY">%1$s</xliff:g>.\""</string>
-    <string name="not_set" msgid="5322289270060224450">"Hindi nakatakda"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"NAKA-ON"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"NAKA-OFF"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Advanced"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopyahin"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Nakopya sa clipboard ang \"<xliff:g id="SUMMARY">%1$s</xliff:g>.\""</string>
+    <string name="not_set" msgid="6573031135582639649">"Hindi nakatakda"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-tr/strings.xml b/preference/preference/src/main/res/values-tr/strings.xml
index 6921e50..5def69c 100644
--- a/preference/preference/src/main/res/values-tr/strings.xml
+++ b/preference/preference/src/main/res/values-tr/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"AÇIK"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"KAPALI"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Gelişmiş"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopyala"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" panoya kopyalandı."</string>
-    <string name="not_set" msgid="5322289270060224450">"Ayarlanmadı"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"AÇIK"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"KAPALI"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Gelişmiş"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopyala"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" panoya kopyalandı."</string>
+    <string name="not_set" msgid="6573031135582639649">"Ayarlanmadı"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-uk/strings.xml b/preference/preference/src/main/res/values-uk/strings.xml
index 3c1dba2..e5cc4b3 100644
--- a/preference/preference/src/main/res/values-uk/strings.xml
+++ b/preference/preference/src/main/res/values-uk/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"УВІМКНЕНО"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ВИМКНЕНО"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Розширені"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Копіювати"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" скопійовано в буфер обміну."</string>
-    <string name="not_set" msgid="5322289270060224450">"Не вказано"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"УВІМКНЕНО"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ВИМКНЕНО"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Додатково"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Скопіювати"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\": скопійовано в буфер обміну."</string>
+    <string name="not_set" msgid="6573031135582639649">"Не налаштовано"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-ur/strings.xml b/preference/preference/src/main/res/values-ur/strings.xml
index fb04e04..64136ef 100644
--- a/preference/preference/src/main/res/values-ur/strings.xml
+++ b/preference/preference/src/main/res/values-ur/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"آن ہے"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"آف ہے"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"جدید ترین"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>، <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"کاپی کریں"</string>
-    <string name="preference_copied" msgid="811987176883013580">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" کلپ بورڈ پر کاپی ہو گیا۔"</string>
-    <string name="not_set" msgid="5322289270060224450">"سیٹ نہیں ہے"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"آن"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"آف ہے"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"جدید ترین"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>، <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"کاپی کریں"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" کلپ بورڈ میں کاپی ہو گیا۔"</string>
+    <string name="not_set" msgid="6573031135582639649">"سیٹ نہیں ہے"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-uz/strings.xml b/preference/preference/src/main/res/values-uz/strings.xml
index 8ed7583..fe9bb5b 100644
--- a/preference/preference/src/main/res/values-uz/strings.xml
+++ b/preference/preference/src/main/res/values-uz/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"YONIQ"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"OʻCHIQ"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Kengaytirilgan"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Nusxa olish"</string>
-    <string name="preference_copied" msgid="811987176883013580">"“<xliff:g id="SUMMARY">%1$s</xliff:g>” vaqtinchalik xotiraga nusxalandi."</string>
-    <string name="not_set" msgid="5322289270060224450">"Sozlanmagan"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"YONIQ"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"YOQILMAGAN"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Kengaytirilgan"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Nusxa olish"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"“<xliff:g id="SUMMARY">%1$s</xliff:g>” vaqtinchalik xotiraga nusxalandi."</string>
+    <string name="not_set" msgid="6573031135582639649">"Tayinlanmagan"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-vi/strings.xml b/preference/preference/src/main/res/values-vi/strings.xml
index cd0b24c..e80e75c 100644
--- a/preference/preference/src/main/res/values-vi/strings.xml
+++ b/preference/preference/src/main/res/values-vi/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"ĐANG BẬT"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"ĐANG TẮT"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Nâng cao"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Sao chép"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Đã sao chép \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" vào bảng nhớ tạm."</string>
-    <string name="not_set" msgid="5322289270060224450">"Chưa đặt"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"BẬT"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"TẮT"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Nâng cao"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Sao chép"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"Đã sao chép \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" vào bảng nhớ tạm."</string>
+    <string name="not_set" msgid="6573031135582639649">"Chưa đặt"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-zh-rCN/strings.xml b/preference/preference/src/main/res/values-zh-rCN/strings.xml
index 81739af..3932368 100644
--- a/preference/preference/src/main/res/values-zh-rCN/strings.xml
+++ b/preference/preference/src/main/res/values-zh-rCN/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"开"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"关"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"高级"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>、<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"复制"</string>
-    <string name="preference_copied" msgid="811987176883013580">"已将“<xliff:g id="SUMMARY">%1$s</xliff:g>”复制到剪贴板。"</string>
-    <string name="not_set" msgid="5322289270060224450">"未设置"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"已开启"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"已关闭"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"高级"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>、<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"复制"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"已将“<xliff:g id="SUMMARY">%1$s</xliff:g>”复制到剪贴板。"</string>
+    <string name="not_set" msgid="6573031135582639649">"未设置"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-zh-rHK/strings.xml b/preference/preference/src/main/res/values-zh-rHK/strings.xml
index 1db6e1b..ce0e7b8 100644
--- a/preference/preference/src/main/res/values-zh-rHK/strings.xml
+++ b/preference/preference/src/main/res/values-zh-rHK/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"開啟"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"關閉"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"進階"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>，<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"複製"</string>
-    <string name="preference_copied" msgid="811987176883013580">"「<xliff:g id="SUMMARY">%1$s</xliff:g>」已複製到剪貼簿。"</string>
-    <string name="not_set" msgid="5322289270060224450">"未設定"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"開啟"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"關閉"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"進階"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>、<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"複製"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"「<xliff:g id="SUMMARY">%1$s</xliff:g>」已複製到剪貼簿。"</string>
+    <string name="not_set" msgid="6573031135582639649">"未設定"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-zh-rTW/strings.xml b/preference/preference/src/main/res/values-zh-rTW/strings.xml
index 1637d96..1373bd7 100644
--- a/preference/preference/src/main/res/values-zh-rTW/strings.xml
+++ b/preference/preference/src/main/res/values-zh-rTW/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"開啟"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"關閉"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"進階"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>、<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"複製"</string>
-    <string name="preference_copied" msgid="811987176883013580">"已將「<xliff:g id="SUMMARY">%1$s</xliff:g>」複製到剪貼簿。"</string>
-    <string name="not_set" msgid="5322289270060224450">"未設定"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"開啟"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"關閉"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"進階"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>、<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"複製"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"已將「<xliff:g id="SUMMARY">%1$s</xliff:g>」複製到剪貼簿。"</string>
+    <string name="not_set" msgid="6573031135582639649">"未設定"</string>
 </resources>
diff --git a/preference/preference/src/main/res/values-zu/strings.xml b/preference/preference/src/main/res/values-zu/strings.xml
index d447b70..a3b6c70 100644
--- a/preference/preference/src/main/res/values-zu/strings.xml
+++ b/preference/preference/src/main/res/values-zu/strings.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="5048321755000716519">"KUVULIWE"</string>
-    <string name="v7_preference_off" msgid="3516781442212499478">"KUVALIWE"</string>
-    <string name="expand_button_title" msgid="4538737816656609903">"Okuthuthukisiwe"</string>
-    <string name="summary_collapsed_preference_list" msgid="4958113070631599540">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-    <string name="copy" msgid="8016979983985242980">"Kopisha"</string>
-    <string name="preference_copied" msgid="811987176883013580">"Okuthi \"<xliff:g id="SUMMARY">%1$s</xliff:g>\" kukopishelwe ebhodini lokunamathisela."</string>
-    <string name="not_set" msgid="5322289270060224450">"Ayisethiwe"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"VULA"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"VALA"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Okuthuthukisiwe"</string>
+    <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="copy" msgid="6083905920877235314">"Kopisha"</string>
+    <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" kukopishelwe kuklibhodi."</string>
+    <string name="not_set" msgid="6573031135582639649">"Ayisethiwe"</string>
 </resources>
diff --git a/privacysandbox/activity/activity-client/api/current.txt b/privacysandbox/activity/activity-client/api/current.txt
index 6d9cf16..b744203 100644
--- a/privacysandbox/activity/activity-client/api/current.txt
+++ b/privacysandbox/activity/activity-client/api/current.txt
@@ -1,23 +1,12 @@
 // Signature format: 4.0
 package androidx.privacysandbox.activity.client {
 
-  public final class LocalManagedSdkActivityLauncher<T extends android.app.Activity & androidx.lifecycle.LifecycleOwner> implements androidx.privacysandbox.activity.client.LocalSdkActivityLauncher {
+  public interface LocalSdkActivityLauncher<T extends android.app.Activity & androidx.lifecycle.LifecycleOwner> extends androidx.privacysandbox.activity.core.SdkActivityLauncher {
     method public void dispose();
-    method public suspend Object? launchSdkActivity(android.os.IBinder sdkActivityHandlerToken, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
-  }
-
-  public interface LocalSdkActivityLauncher extends androidx.privacysandbox.activity.core.SdkActivityLauncher {
-    method public void dispose();
-  }
-
-  public final class LocalUnmanagedSdkActivityLauncher<T extends android.app.Activity> implements androidx.privacysandbox.activity.client.LocalSdkActivityLauncher {
-    method public void dispose();
-    method public suspend Object? launchSdkActivity(android.os.IBinder sdkActivityHandlerToken, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
   }
 
   public final class SdkActivityLaunchers {
-    method public static <T extends android.app.Activity & androidx.lifecycle.LifecycleOwner> androidx.privacysandbox.activity.client.LocalManagedSdkActivityLauncher<T> createManagedSdkActivityLauncher(T, kotlin.jvm.functions.Function0<java.lang.Boolean> allowLaunch);
-    method public static <T extends android.app.Activity> androidx.privacysandbox.activity.client.LocalUnmanagedSdkActivityLauncher<T> createUnmanagedSdkActivityLauncher(T, kotlin.jvm.functions.Function0<java.lang.Boolean> allowLaunch);
+    method public static <T extends android.app.Activity & androidx.lifecycle.LifecycleOwner> androidx.privacysandbox.activity.client.LocalSdkActivityLauncher<T> createSdkActivityLauncher(T, kotlin.jvm.functions.Function0<java.lang.Boolean> allowLaunch);
     method public static android.os.Bundle toLauncherInfo(androidx.privacysandbox.activity.core.SdkActivityLauncher);
   }
 
diff --git a/privacysandbox/activity/activity-client/api/restricted_current.txt b/privacysandbox/activity/activity-client/api/restricted_current.txt
index 6d9cf16..b744203 100644
--- a/privacysandbox/activity/activity-client/api/restricted_current.txt
+++ b/privacysandbox/activity/activity-client/api/restricted_current.txt
@@ -1,23 +1,12 @@
 // Signature format: 4.0
 package androidx.privacysandbox.activity.client {
 
-  public final class LocalManagedSdkActivityLauncher<T extends android.app.Activity & androidx.lifecycle.LifecycleOwner> implements androidx.privacysandbox.activity.client.LocalSdkActivityLauncher {
+  public interface LocalSdkActivityLauncher<T extends android.app.Activity & androidx.lifecycle.LifecycleOwner> extends androidx.privacysandbox.activity.core.SdkActivityLauncher {
     method public void dispose();
-    method public suspend Object? launchSdkActivity(android.os.IBinder sdkActivityHandlerToken, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
-  }
-
-  public interface LocalSdkActivityLauncher extends androidx.privacysandbox.activity.core.SdkActivityLauncher {
-    method public void dispose();
-  }
-
-  public final class LocalUnmanagedSdkActivityLauncher<T extends android.app.Activity> implements androidx.privacysandbox.activity.client.LocalSdkActivityLauncher {
-    method public void dispose();
-    method public suspend Object? launchSdkActivity(android.os.IBinder sdkActivityHandlerToken, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
   }
 
   public final class SdkActivityLaunchers {
-    method public static <T extends android.app.Activity & androidx.lifecycle.LifecycleOwner> androidx.privacysandbox.activity.client.LocalManagedSdkActivityLauncher<T> createManagedSdkActivityLauncher(T, kotlin.jvm.functions.Function0<java.lang.Boolean> allowLaunch);
-    method public static <T extends android.app.Activity> androidx.privacysandbox.activity.client.LocalUnmanagedSdkActivityLauncher<T> createUnmanagedSdkActivityLauncher(T, kotlin.jvm.functions.Function0<java.lang.Boolean> allowLaunch);
+    method public static <T extends android.app.Activity & androidx.lifecycle.LifecycleOwner> androidx.privacysandbox.activity.client.LocalSdkActivityLauncher<T> createSdkActivityLauncher(T, kotlin.jvm.functions.Function0<java.lang.Boolean> allowLaunch);
     method public static android.os.Bundle toLauncherInfo(androidx.privacysandbox.activity.core.SdkActivityLauncher);
   }
 
diff --git a/privacysandbox/activity/activity-client/src/androidTest/AndroidManifest.xml b/privacysandbox/activity/activity-client/src/androidTest/AndroidManifest.xml
index 09024b2..7cbcd44 100644
--- a/privacysandbox/activity/activity-client/src/androidTest/AndroidManifest.xml
+++ b/privacysandbox/activity/activity-client/src/androidTest/AndroidManifest.xml
@@ -17,7 +17,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
     <application>
         <activity
-            android:name="androidx.privacysandbox.activity.client.TestLifecycleAwareActivity"
+            android:name="androidx.privacysandbox.activity.client.TestActivity"
             android:theme="@style/Theme.AppCompat"
             android:exported="true"/>
     </application>
diff --git a/privacysandbox/activity/activity-client/src/androidTest/java/androidx/privacysandbox/activity/client/CreateSdkActivityLauncherTest.kt b/privacysandbox/activity/activity-client/src/androidTest/java/androidx/privacysandbox/activity/client/CreateSdkActivityLauncherTest.kt
index c0b16e7..81843c6 100644
--- a/privacysandbox/activity/activity-client/src/androidTest/java/androidx/privacysandbox/activity/client/CreateSdkActivityLauncherTest.kt
+++ b/privacysandbox/activity/activity-client/src/androidTest/java/androidx/privacysandbox/activity/client/CreateSdkActivityLauncherTest.kt
@@ -22,7 +22,6 @@
 import android.os.Binder
 import android.os.Build
 import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LifecycleOwner
 import androidx.test.espresso.intent.Intents.intended
 import androidx.test.espresso.intent.Intents.intending
 import androidx.test.espresso.intent.Intents.times
@@ -35,43 +34,24 @@
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.runBlocking
 import org.hamcrest.Matchers.`is`
-import org.junit.Assume.assumeTrue
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
 
-@RunWith(Parameterized::class)
 @SmallTest
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
-class CreateSdkActivityLauncherTest(private val useManagedSdkActivityLauncher: Boolean) {
-    // Lifecycle-aware activity is used in the tests as both types of LocalSdkActivityLauncher
-    // (managed/unmanaged) can be created for it.
-    @get:Rule
-    var lifecycleAwareActivityScenarioRule =
-        ActivityScenarioRule(TestLifecycleAwareActivity::class.java)
+class CreateSdkActivityLauncherTest {
+    @get:Rule var activityScenarioRule = ActivityScenarioRule(TestActivity::class.java)
 
     @get:Rule var intentsRule = IntentsRule()
 
-    companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "useManagedSdkActivityLauncher={0}")
-        fun data(): Array<Any> =
-            arrayOf(
-                arrayOf(true),
-                arrayOf(false),
-            )
-    }
-
     private val sdkSandboxActivityMatcher =
         hasAction(`is`("android.app.sdksandbox.action.START_SANDBOXED_ACTIVITY"))
 
     @Before
     fun setUp() {
         // Intercepts intent to start sandboxed activity and immediately return a result.
-        // This allows us to avoid loading and setting up an SDK just for checking if activities
-        // are
+        // This allows us to avoid loading and setting up an SDK just for checking if activities are
         // launched.
         intending(sdkSandboxActivityMatcher)
             .respondWith(ActivityResult(Activity.RESULT_OK, Intent()))
@@ -79,10 +59,7 @@
 
     @Test
     fun returnedLauncher_launchesActivitiesWhenAllowed() = runBlocking {
-        val launcher =
-            lifecycleAwareActivityScenarioRule.withActivity {
-                this.createSdkActivityLauncher { true }
-            }
+        val launcher = activityScenarioRule.withActivity { this.createSdkActivityLauncher { true } }
 
         val result = launcher.launchSdkActivity(Binder())
 
@@ -93,9 +70,7 @@
     @Test
     fun returnedLauncher_rejectsActivityLaunchesAccordingToPredicate() = runBlocking {
         val launcher =
-            lifecycleAwareActivityScenarioRule.withActivity {
-                this.createSdkActivityLauncher { false }
-            }
+            activityScenarioRule.withActivity { this.createSdkActivityLauncher { false } }
 
         val result = launcher.launchSdkActivity(Binder())
 
@@ -105,10 +80,7 @@
 
     @Test
     fun returnedLauncher_rejectsActivityLaunchesWhenDisposed() = runBlocking {
-        val launcher =
-            lifecycleAwareActivityScenarioRule.withActivity {
-                this.createSdkActivityLauncher { true }
-            }
+        val launcher = activityScenarioRule.withActivity { this.createSdkActivityLauncher { true } }
         launcher.dispose()
 
         val result = launcher.launchSdkActivity(Binder())
@@ -118,11 +90,8 @@
     }
 
     @Test
-    fun returnedManagedLauncher_disposeCanBeCalledMultipleTimes() = runBlocking {
-        val launcher =
-            lifecycleAwareActivityScenarioRule.withActivity {
-                this.createSdkActivityLauncher { true }
-            }
+    fun returnedLauncher_disposeCanBeCalledMultipleTimes() = runBlocking {
+        val launcher = activityScenarioRule.withActivity { this.createSdkActivityLauncher { true } }
         launcher.dispose()
 
         val result = launcher.launchSdkActivity(Binder())
@@ -134,14 +103,9 @@
     }
 
     @Test
-    fun returnedManagedLauncher_rejectsActivityLaunchesWhenHostActivityIsDestroyed() = runBlocking {
-        assumeTrue(useManagedSdkActivityLauncher)
-
-        val launcher =
-            lifecycleAwareActivityScenarioRule.withActivity {
-                this.createManagedSdkActivityLauncher { true }
-            }
-        lifecycleAwareActivityScenarioRule.scenario.moveToState(Lifecycle.State.DESTROYED)
+    fun returnedLauncher_rejectsActivityLaunchesWhenHostActivityIsDestroyed() = runBlocking {
+        val launcher = activityScenarioRule.withActivity { this.createSdkActivityLauncher { true } }
+        activityScenarioRule.scenario.moveToState(Lifecycle.State.DESTROYED)
 
         val result = launcher.launchSdkActivity(Binder())
 
@@ -150,23 +114,15 @@
     }
 
     @Test
-    fun returnedManagedLauncher_rejectsActivityLaunchesWhenHostActivityWasAlreadyDestroyed() =
+    fun returnedLauncher_rejectsActivityLaunchesWhenHostActivityWasAlreadyDestroyed() =
         runBlocking {
-            assumeTrue(useManagedSdkActivityLauncher)
-
-            val activity = lifecycleAwareActivityScenarioRule.withActivity { this }
-            lifecycleAwareActivityScenarioRule.scenario.moveToState(Lifecycle.State.DESTROYED)
-            val launcher = activity.createManagedSdkActivityLauncher { true }
+            val activity = activityScenarioRule.withActivity { this }
+            activityScenarioRule.scenario.moveToState(Lifecycle.State.DESTROYED)
+            val launcher = activity.createSdkActivityLauncher { true }
 
             val result = launcher.launchSdkActivity(Binder())
 
             assertThat(result).isFalse()
             intended(sdkSandboxActivityMatcher, times(0))
         }
-
-    private fun <T> T.createSdkActivityLauncher(
-        allowLaunch: () -> Boolean
-    ): LocalSdkActivityLauncher where T : Activity, T : LifecycleOwner =
-        if (useManagedSdkActivityLauncher) this.createManagedSdkActivityLauncher(allowLaunch)
-        else this.createUnmanagedSdkActivityLauncher(allowLaunch)
 }
diff --git a/privacysandbox/activity/activity-client/src/androidTest/java/androidx/privacysandbox/activity/client/TestLifecycleAwareActivity.kt b/privacysandbox/activity/activity-client/src/androidTest/java/androidx/privacysandbox/activity/client/TestActivity.kt
similarity index 92%
rename from privacysandbox/activity/activity-client/src/androidTest/java/androidx/privacysandbox/activity/client/TestLifecycleAwareActivity.kt
rename to privacysandbox/activity/activity-client/src/androidTest/java/androidx/privacysandbox/activity/client/TestActivity.kt
index c8f8676..74ffb5d 100644
--- a/privacysandbox/activity/activity-client/src/androidTest/java/androidx/privacysandbox/activity/client/TestLifecycleAwareActivity.kt
+++ b/privacysandbox/activity/activity-client/src/androidTest/java/androidx/privacysandbox/activity/client/TestActivity.kt
@@ -18,4 +18,4 @@
 
 import androidx.appcompat.app.AppCompatActivity
 
-class TestLifecycleAwareActivity : AppCompatActivity()
+class TestActivity : AppCompatActivity()
diff --git a/privacysandbox/activity/activity-client/src/main/java/androidx/privacysandbox/activity/client/SdkActivityLaunchers.kt b/privacysandbox/activity/activity-client/src/main/java/androidx/privacysandbox/activity/client/SdkActivityLaunchers.kt
index b405f3e..6b0d6086 100644
--- a/privacysandbox/activity/activity-client/src/main/java/androidx/privacysandbox/activity/client/SdkActivityLaunchers.kt
+++ b/privacysandbox/activity/activity-client/src/main/java/androidx/privacysandbox/activity/client/SdkActivityLaunchers.kt
@@ -36,22 +36,20 @@
 import kotlinx.coroutines.withContext
 
 /**
- * Returns a lifecycle-aware SdkActivityLauncher that launches activities on behalf of an SDK by
- * using this activity as a starting context. The created launcher will be automatically disposed
- * when the current activity is destroyed, with no additional work required.
+ * Returns an SdkActivityLauncher that launches activities on behalf of an SDK by using this
+ * activity as a starting context.
  *
- * @param T the current [LifecycleOwner] activity from which new SDK activities will be launched. If
- *   this activity is destroyed, any further SDK activity launches will simply be ignored, and
- *   [LocalManagedSdkActivityLauncher.launchSdkActivity] will return 'false'.
+ * @param T the current activity from which new SDK activities will be launched. If this activity is
+ *   destroyed any further SDK activity launches will simply be ignored.
  * @param allowLaunch predicate called each time an activity is about to be launched by the SDK, the
  *   activity will only be launched if it returns true.
  */
-fun <T> T.createManagedSdkActivityLauncher(
-    allowLaunch: () -> Boolean
-): LocalManagedSdkActivityLauncher<T> where T : Activity, T : LifecycleOwner {
+fun <T> T.createSdkActivityLauncher(allowLaunch: () -> Boolean): LocalSdkActivityLauncher<T> where
+T : Activity,
+T : LifecycleOwner {
     val cancellationJob = Job(parent = lifecycleScope.coroutineContext[Job])
     val launcher =
-        LocalManagedSdkActivityLauncher(
+        LocalSdkActivityLauncherImpl(
             activity = this,
             allowLaunch = allowLaunch,
             onDispose = { cancellationJob.cancel() },
@@ -61,31 +59,6 @@
 }
 
 /**
- * Returns a lifecycle-unaware SdkActivityLauncher that launches activities on behalf of an SDK by
- * using this activity as a starting context. The created launcher will need to be manually disposed
- * explicitly by the caller.
- *
- * It is recommended to use a lifecycle-aware launcher created using
- * [createManagedSdkActivityLauncher] instead. It is automatically disposed when the current
- * activity is destroyed, making it less prone to memory leaks.
- *
- * @param T the current activity from which new SDK activities will be launched. If this activity is
- *   destroyed any further SDK activity launches will simply be ignored, and
- *   [LocalUnmanagedSdkActivityLauncher.launchSdkActivity] will return 'false'.
- * @param allowLaunch predicate called each time an activity is about to be launched by the SDK, the
- *   activity will only be launched if it returns true.
- * @see [createManagedSdkActivityLauncher]
- */
-fun <T> T.createUnmanagedSdkActivityLauncher(
-    allowLaunch: () -> Boolean
-): LocalUnmanagedSdkActivityLauncher<T> where T : Activity {
-    return LocalUnmanagedSdkActivityLauncher(
-        activity = this,
-        allowLaunch = allowLaunch,
-    )
-}
-
-/**
  * Returns a [Bundle] with the information necessary to recreate this launcher. Possibly in a
  * different process.
  */
@@ -97,96 +70,33 @@
 }
 
 /**
- * Local version of [SdkActivityLauncher] that allows callers in the app process to dispose the
- * launcher resources.
+ * Local implementation of an SDK Activity launcher.
  *
- * @see LocalManagedSdkActivityLauncher
- * @see LocalUnmanagedSdkActivityLauncher
+ * It allows callers in the app process to dispose resources used to launch SDK activities.
  */
-interface LocalSdkActivityLauncher : SdkActivityLauncher {
+interface LocalSdkActivityLauncher<T> : SdkActivityLauncher where T : Activity, T : LifecycleOwner {
     /**
      * Clears references used to launch activities.
      *
-     * After this method is called, all further attempts to launch activities wil be rejected, and
-     * [LocalSdkActivityLauncher.launchSdkActivity] will return 'false'.
-     *
+     * After this method is called all further attempts to launch activities wil be rejected.
      * Doesn't do anything if the launcher was already disposed of.
      */
     fun dispose()
 }
 
-/**
- * Local implementation of a lifecycle-aware SDK Activity launcher. Its resources will be
- * automatically disposed when its parent activity is destroyed. In this case, no additional work
- * will be required from the caller.
- *
- * It allows callers in the app process to dispose resources used to launch SDK activities.
- */
-class LocalManagedSdkActivityLauncher<T>
-internal constructor(activity: T, allowLaunch: () -> Boolean, onDispose: () -> Unit) :
-    LocalSdkActivityLauncher where T : Activity, T : LifecycleOwner {
-    private val launcherDelegate =
-        LocalSdkActivityLauncherDelegate(activity, allowLaunch, onDispose)
-
-    /** @see [SdkActivityLauncher.launchSdkActivity] */
-    override suspend fun launchSdkActivity(sdkActivityHandlerToken: IBinder): Boolean =
-        launcherDelegate.launchSdkActivity(sdkActivityHandlerToken)
-
-    /**
-     * Clears references used to launch activities. This method __doesn't need__ to be called as
-     * system will automatically dispose the launcher when the parent activity is destroyed.
-     * However, the user __can__ optionally call it the launcher is not needed anymore.
-     *
-     * After this method is called all further attempts to launch activities wil be rejected, and
-     * [LocalManagedSdkActivityLauncher.launchSdkActivity] will return 'false'.
-     *
-     * Doesn't do anything if the launcher was already disposed of.
-     */
-    override fun dispose() = launcherDelegate.dispose()
-}
-
-/**
- * Local implementation of an SDK Activity launcher. This launcher is not lifecycle-aware, meaning
- * its resources need to be released manually by the caller to avoid memory leaks.
- *
- * @see [LocalManagedSdkActivityLauncher]
- */
-class LocalUnmanagedSdkActivityLauncher<T>
-internal constructor(activity: T, allowLaunch: () -> Boolean) : LocalSdkActivityLauncher where
-T : Activity {
-
-    private val launcherDelegate = LocalSdkActivityLauncherDelegate(activity, allowLaunch)
-
-    /** @see [SdkActivityLauncher.launchSdkActivity] */
-    override suspend fun launchSdkActivity(sdkActivityHandlerToken: IBinder): Boolean =
-        launcherDelegate.launchSdkActivity(sdkActivityHandlerToken)
-
-    /**
-     * Clears references used to launch activities. This method __must__ be called once the launcher
-     * is not needed anymore to avoid memory leaks.
-     *
-     * After this method is called all further attempts to launch activities wil be rejected, and
-     * [LocalUnmanagedSdkActivityLauncher.launchSdkActivity] will return 'false'.
-     *
-     * Doesn't do anything if the launcher was already disposed of.
-     */
-    override fun dispose() = launcherDelegate.dispose()
-}
-
-private class LocalSdkActivityLauncherDelegate<T>(
+private class LocalSdkActivityLauncherImpl<T>(
     activity: T,
     allowLaunch: () -> Boolean,
-    onDispose: (() -> Unit)? = null
-) : LocalSdkActivityLauncher where T : Activity {
-    /**
-     * Internal state for [LocalManagedSdkActivityLauncher], cleared when the launcher is disposed.
-     */
+    onDispose: () -> Unit
+) : LocalSdkActivityLauncher<T> where T : Activity, T : LifecycleOwner {
+
+    /** Internal state for [LocalSdkActivityLauncher], cleared when the launcher is disposed. */
     private class LocalLauncherState<T>(
         val activity: T,
         val allowLaunch: () -> Boolean,
         val sdkSandboxManager: SdkSandboxManagerCompat,
-        val onDispose: (() -> Unit)?
-    ) where T : Activity
+        val onDispose: () -> Unit
+    ) where T : Activity, T : LifecycleOwner
 
     private val stateReference: AtomicReference<LocalLauncherState<T>?> =
         AtomicReference<LocalLauncherState<T>?>(
@@ -212,7 +122,7 @@
     }
 
     override fun dispose() {
-        stateReference.getAndSet(null)?.run { onDispose?.invoke() }
+        stateReference.getAndSet(null)?.run { onDispose() }
     }
 }
 
diff --git a/privacysandbox/activity/activity-core/src/main/java/androidx/privacysandbox/activity/core/SdkActivityLauncher.kt b/privacysandbox/activity/activity-core/src/main/java/androidx/privacysandbox/activity/core/SdkActivityLauncher.kt
index 7e34afc..99dddac 100644
--- a/privacysandbox/activity/activity-core/src/main/java/androidx/privacysandbox/activity/core/SdkActivityLauncher.kt
+++ b/privacysandbox/activity/activity-core/src/main/java/androidx/privacysandbox/activity/core/SdkActivityLauncher.kt
@@ -22,10 +22,8 @@
  * Interface that allows SDKs running in the Privacy Sandbox to launch activities.
  *
  * Apps can create launchers by calling
- * [createManagedSdkActivityLauncher][androidx.privacysandbox.activity.client.createManagedSdkActivityLauncher]
- * or
- * [createUnmanagedSdkActivityLauncher][androidx.privacysandbox.activity.client.createUnmanagedSdkActivityLauncher]
- * from one of their activities.
+ * [createActivityLauncher][androidx.privacysandbox.activity.client.createSdkActivityLauncher] from
+ * one of their activities.
  *
  * To send an [SdkActivityLauncher] to another process, they can call
  * [toLauncherInfo][androidx.privacysandbox.activity.client.toLauncherInfo] and send the resulting
diff --git a/privacysandbox/ondevicepersonalization/OWNERS b/privacysandbox/ondevicepersonalization/OWNERS
deleted file mode 100644
index be84bbd..0000000
--- a/privacysandbox/ondevicepersonalization/OWNERS
+++ /dev/null
@@ -1,13 +0,0 @@
-# Bug component: 1117807
-akvuong@google.com
-cazheng@google.com
-cbail@google.com
-cuiq@google.com
-fumengyao@google.com
-karthikmahesh@google.com
-leoni@google.com
-maco@google.com
-paragkulkarni@google.com
-qiaoli@google.com
-ryangu@google.com
-yanning@google.com
diff --git a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/api/current.txt b/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/api/current.txt
deleted file mode 100644
index e6ae350..0000000
--- a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/api/current.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-// Signature format: 4.0
-package androidx.privacysandbox.ondevicepersonalization.client {
-
-  public final class ExecuteInIsolatedServiceRequest {
-    ctor public ExecuteInIsolatedServiceRequest(android.content.ComponentName service, optional android.os.PersistableBundle appParams);
-    method public android.content.ComponentName component1();
-    method public android.os.PersistableBundle component2();
-    method public androidx.privacysandbox.ondevicepersonalization.client.ExecuteInIsolatedServiceRequest copy(android.content.ComponentName service, android.os.PersistableBundle appParams);
-    method public android.os.PersistableBundle getAppParams();
-    method public android.content.ComponentName getService();
-    property public android.os.PersistableBundle appParams;
-    property public android.content.ComponentName service;
-  }
-
-  public final class ExecuteInIsolatedServiceResponse {
-    method public android.adservices.ondevicepersonalization.SurfacePackageToken? component1();
-    method public androidx.privacysandbox.ondevicepersonalization.client.ExecuteInIsolatedServiceResponse copy(android.adservices.ondevicepersonalization.SurfacePackageToken? surfacePackageToken);
-    method public android.adservices.ondevicepersonalization.SurfacePackageToken? getSurfacePackageToken();
-    property public android.adservices.ondevicepersonalization.SurfacePackageToken? surfacePackageToken;
-  }
-
-  public abstract class OnDevicePersonalizationManager {
-    method public abstract suspend Object? executeInIsolatedService(androidx.privacysandbox.ondevicepersonalization.client.ExecuteInIsolatedServiceRequest executeInIsolatedServiceRequest, kotlin.coroutines.Continuation<? super androidx.privacysandbox.ondevicepersonalization.client.ExecuteInIsolatedServiceResponse>);
-    method public static final androidx.privacysandbox.ondevicepersonalization.client.OnDevicePersonalizationManager? obtain(android.content.Context context);
-    method public abstract suspend Object? requestSurfacePackage(android.adservices.ondevicepersonalization.SurfacePackageToken surfacePackageToken, android.os.IBinder surfaceViewHostToken, int displayId, int width, int height, kotlin.coroutines.Continuation<? super android.view.SurfaceControlViewHost.SurfacePackage>);
-    field public static final androidx.privacysandbox.ondevicepersonalization.client.OnDevicePersonalizationManager.Companion Companion;
-  }
-
-  public static final class OnDevicePersonalizationManager.Companion {
-    method public androidx.privacysandbox.ondevicepersonalization.client.OnDevicePersonalizationManager? obtain(android.content.Context context);
-  }
-
-}
-
diff --git a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/api/res-current.txt b/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/api/res-current.txt
deleted file mode 100644
index e69de29..0000000
--- a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/api/res-current.txt
+++ /dev/null
diff --git a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/api/restricted_current.txt b/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/api/restricted_current.txt
deleted file mode 100644
index e6ae350..0000000
--- a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/api/restricted_current.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-// Signature format: 4.0
-package androidx.privacysandbox.ondevicepersonalization.client {
-
-  public final class ExecuteInIsolatedServiceRequest {
-    ctor public ExecuteInIsolatedServiceRequest(android.content.ComponentName service, optional android.os.PersistableBundle appParams);
-    method public android.content.ComponentName component1();
-    method public android.os.PersistableBundle component2();
-    method public androidx.privacysandbox.ondevicepersonalization.client.ExecuteInIsolatedServiceRequest copy(android.content.ComponentName service, android.os.PersistableBundle appParams);
-    method public android.os.PersistableBundle getAppParams();
-    method public android.content.ComponentName getService();
-    property public android.os.PersistableBundle appParams;
-    property public android.content.ComponentName service;
-  }
-
-  public final class ExecuteInIsolatedServiceResponse {
-    method public android.adservices.ondevicepersonalization.SurfacePackageToken? component1();
-    method public androidx.privacysandbox.ondevicepersonalization.client.ExecuteInIsolatedServiceResponse copy(android.adservices.ondevicepersonalization.SurfacePackageToken? surfacePackageToken);
-    method public android.adservices.ondevicepersonalization.SurfacePackageToken? getSurfacePackageToken();
-    property public android.adservices.ondevicepersonalization.SurfacePackageToken? surfacePackageToken;
-  }
-
-  public abstract class OnDevicePersonalizationManager {
-    method public abstract suspend Object? executeInIsolatedService(androidx.privacysandbox.ondevicepersonalization.client.ExecuteInIsolatedServiceRequest executeInIsolatedServiceRequest, kotlin.coroutines.Continuation<? super androidx.privacysandbox.ondevicepersonalization.client.ExecuteInIsolatedServiceResponse>);
-    method public static final androidx.privacysandbox.ondevicepersonalization.client.OnDevicePersonalizationManager? obtain(android.content.Context context);
-    method public abstract suspend Object? requestSurfacePackage(android.adservices.ondevicepersonalization.SurfacePackageToken surfacePackageToken, android.os.IBinder surfaceViewHostToken, int displayId, int width, int height, kotlin.coroutines.Continuation<? super android.view.SurfaceControlViewHost.SurfacePackage>);
-    field public static final androidx.privacysandbox.ondevicepersonalization.client.OnDevicePersonalizationManager.Companion Companion;
-  }
-
-  public static final class OnDevicePersonalizationManager.Companion {
-    method public androidx.privacysandbox.ondevicepersonalization.client.OnDevicePersonalizationManager? obtain(android.content.Context context);
-  }
-
-}
-
diff --git a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/build.gradle b/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/build.gradle
deleted file mode 100644
index a528884..0000000
--- a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/build.gradle
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * This file was created using the `create_project.py` script located in the
- * `<AndroidX root>/development/project-creator` directory.
- *
- * Please use that script when creating a new project, rather than copying an existing project and
- * modifying its settings.
- */
-import androidx.build.SoftwareType
-
-plugins {
-    id("AndroidXPlugin")
-    id("com.android.library")
-    id("org.jetbrains.kotlin.android")
-}
-
-dependencies {
-    api(libs.kotlinStdlib)
-    api(libs.kotlinCoroutinesCore)
-    implementation("androidx.core:core-ktx:1.8.0")
-    implementation(project(":annotation:annotation-experimental"))
-    api("androidx.annotation:annotation:1.8.1")
-
-    androidTestImplementation(libs.junit)
-    androidTestImplementation(libs.kotlinTestJunit)
-    androidTestImplementation(libs.mockitoKotlin4)
-    androidTestImplementation(libs.testCore)
-    androidTestImplementation(libs.testExtJunit)
-    androidTestImplementation(libs.testRunner)
-    androidTestImplementation(libs.testRules)
-    androidTestImplementation(libs.truth)
-    androidTestImplementation(project(":internal-testutils-truth"))
-
-    androidTestImplementation(libs.mockitoCore4)
-    androidTestImplementation(libs.dexmakerMockitoInline)
-    androidTestImplementation(libs.dexmakerMockitoInlineExtended)
-}
-
-android {
-    compileSdk = 34
-    compileSdkExtension = 12
-    namespace "androidx.privacysandbox.ondevicepersonalization"
-}
-
-androidx {
-    name = "androidx.privacysandbox.ondevicepersonalization:ondevicepersonalization-client"
-    type = SoftwareType.PUBLISHED_LIBRARY
-    inceptionYear = "2025"
-    description = "This library enables integration with On Device Personalization APIs provided by Privacy Sandbox on Android."
-    legacyDisableKotlinStrictApiMode = true
-}
diff --git a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/dependencyAnalysis-baseline.json b/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/dependencyAnalysis-baseline.json
deleted file mode 100644
index 2c9d161..0000000
--- a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/dependencyAnalysis-baseline.json
+++ /dev/null
@@ -1,45 +0,0 @@
-{
-  "projectPath": ":privacysandbox:ondevicepersonalization:ondevicepersonalization-client",
-  "dependencyAdvice": [
-    {
-      "coordinates": {
-        "type": "module",
-        "identifier": "androidx.test:rules",
-        "resolvedVersion": "1.7.0-alpha01"
-      },
-      "fromConfiguration": "androidTestImplementation"
-    },
-    {
-      "coordinates": {
-        "type": "module",
-        "identifier": "com.linkedin.dexmaker:dexmaker-mockito-inline",
-        "resolvedVersion": "2.28.4"
-      },
-      "fromConfiguration": "androidTestImplementation",
-      "toConfiguration": "androidTestRuntimeOnly"
-    },
-    {
-      "coordinates": {
-        "type": "module",
-        "identifier": "org.jetbrains.kotlin:kotlin-test-junit",
-        "resolvedVersion": "1.8.22"
-      },
-      "fromConfiguration": "androidTestImplementation",
-      "toConfiguration": "androidTestRuntimeOnly"
-    },
-    {
-      "coordinates": {
-        "type": "project",
-        "identifier": ":annotation:annotation-experimental"
-      },
-      "fromConfiguration": "implementation"
-    },
-    {
-      "coordinates": {
-        "type": "project",
-        "identifier": ":internal-testutils-truth"
-      },
-      "fromConfiguration": "androidTestImplementation"
-    }
-  ]
-}
\ No newline at end of file
diff --git a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/androidTest/AndroidManifest.xml b/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/androidTest/AndroidManifest.xml
deleted file mode 100644
index 3f2e804..0000000
--- a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/androidTest/AndroidManifest.xml
+++ /dev/null
@@ -1,18 +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 xmlns:android="http://schemas.android.com/apk/res/android">
-</manifest>
\ No newline at end of file
diff --git a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/androidTest/java/androidx/privacysandbox/ondevicepersonalization/client/OnDevicePersonalizationManagerTest.kt b/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/androidTest/java/androidx/privacysandbox/ondevicepersonalization/client/OnDevicePersonalizationManagerTest.kt
deleted file mode 100644
index 3530f63..0000000
--- a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/androidTest/java/androidx/privacysandbox/ondevicepersonalization/client/OnDevicePersonalizationManagerTest.kt
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.ondevicepersonalization.client
-
-import android.adservices.ondevicepersonalization.OnDevicePersonalizationManager
-import android.adservices.ondevicepersonalization.SurfacePackageToken
-import android.content.ComponentName
-import android.content.Context
-import android.os.IBinder
-import android.os.OutcomeReceiver
-import android.os.PersistableBundle
-import android.os.ext.SdkExtensions
-import android.view.SurfaceControlViewHost.SurfacePackage
-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.android.dx.mockito.inline.extended.ExtendedMockito
-import com.android.dx.mockito.inline.extended.StaticMockitoSession
-import com.google.common.truth.Truth.assertThat
-import java.util.concurrent.Executor
-import kotlinx.coroutines.runBlocking
-import org.junit.After
-import org.junit.Assume
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentCaptor
-import org.mockito.Mockito.doAnswer
-import org.mockito.Mockito.mock
-import org.mockito.Mockito.spy
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.`when`
-import org.mockito.invocation.InvocationOnMock
-import org.mockito.kotlin.any
-import org.mockito.quality.Strictness
-
-@SmallTest
-@SuppressWarnings("NewApi")
-@RunWith(AndroidJUnit4::class)
-@SdkSuppress(minSdkVersion = 33)
-class OnDevicePersonalizationManagerTest {
-    private var mSession: StaticMockitoSession? = null
-    private val mValidAdServicesSdkExtVersion =
-        SdkExtensions.getExtensionVersion(SdkExtensions.AD_SERVICES) >= 12
-
-    @Before
-    fun setUp() {
-        mContext = spy(ApplicationProvider.getApplicationContext<Context>())
-        if (mValidAdServicesSdkExtVersion)
-            mSession =
-                ExtendedMockito.mockitoSession()
-                    .mockStatic(OnDevicePersonalizationManager::class.java)
-                    .strictness(Strictness.LENIENT)
-                    .startMocking()
-    }
-
-    @After
-    fun tearDown() {
-        mSession?.finishMocking()
-    }
-
-    @Test
-    @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 30)
-    fun testODPOlderVersions() {
-        Assume.assumeTrue("maxSdkVersion = API 34 ext 12", !mValidAdServicesSdkExtVersion)
-        assertThat(
-                androidx.privacysandbox.ondevicepersonalization.client
-                    .OnDevicePersonalizationManager
-                    .obtain(mContext)
-            )
-            .isNull()
-    }
-
-    @Test
-    fun testODPManagerExecute() {
-        Assume.assumeTrue("minSdkVersion = API 34 ext 12", mValidAdServicesSdkExtVersion)
-
-        var testResult: OnDevicePersonalizationManager.ExecuteResult =
-            mock(OnDevicePersonalizationManager.ExecuteResult::class.java)
-        val odpManager = mockODPManager(mContext)
-        val managerCompat =
-            androidx.privacysandbox.ondevicepersonalization.client.OnDevicePersonalizationManager
-                .obtain(mContext)
-
-        val answer = { args: InvocationOnMock ->
-            val receiver = args.getArgument<OutcomeReceiver<Any, Exception>>(3)
-            receiver.onResult(testResult)
-            null
-        }
-        doAnswer(answer)
-            .`when`(odpManager)
-            .execute(
-                any<ComponentName>(),
-                any<PersistableBundle>(),
-                any<Executor>(),
-                any<
-                    OutcomeReceiver<
-                        OnDevicePersonalizationManager.ExecuteResult,
-                        java.lang.Exception
-                    >
-                >()
-            )
-        // Actually invoke the compat code.
-        runBlocking {
-            managerCompat?.executeInIsolatedService(
-                ExecuteInIsolatedServiceRequest(TEST_SERVICE_COMPONENT_NAME, TEST_BUNDLE)
-            )
-        }
-        val captor1 = ArgumentCaptor.forClass(ComponentName::class.java)
-        val captor2 = ArgumentCaptor.forClass(PersistableBundle::class.java)
-        verify(odpManager)
-            .execute(
-                captor1.capture(),
-                captor2.capture(),
-                any<Executor>(),
-                any<OutcomeReceiver<OnDevicePersonalizationManager.ExecuteResult, Exception>>()
-            )
-
-        // Verify that the request that the compat code makes to the platform is correct.
-        assertThat(captor1.value == TEST_SERVICE_COMPONENT_NAME)
-        assertThat(captor2.value == TEST_BUNDLE)
-    }
-
-    @Test
-    fun testODPManagerExecuteThrows() {
-        Assume.assumeTrue("minSdkVersion = API 34 ext 12", mValidAdServicesSdkExtVersion)
-
-        val odpManager = mockODPManager(mContext)
-        val managerCompat =
-            androidx.privacysandbox.ondevicepersonalization.client.OnDevicePersonalizationManager
-                .obtain(mContext)
-        val errorMessage = "some error occurred"
-        val errorCallback = { args: InvocationOnMock ->
-            val receiver = args.getArgument<OutcomeReceiver<Any, Exception>>(3)
-            receiver.onError(ClassNotFoundException(errorMessage))
-            null
-        }
-        doAnswer(errorCallback)
-            .`when`(odpManager)
-            .execute(
-                any<ComponentName>(),
-                any<PersistableBundle>(),
-                any<Executor>(),
-                any<
-                    OutcomeReceiver<
-                        OnDevicePersonalizationManager.ExecuteResult,
-                        java.lang.Exception
-                    >
-                >()
-            )
-        // Actually invoke the compat code.
-        runBlocking {
-            try {
-                managerCompat?.executeInIsolatedService(
-                    ExecuteInIsolatedServiceRequest(TEST_SERVICE_COMPONENT_NAME, TEST_BUNDLE)
-                )
-            } catch (e: ClassNotFoundException) {
-                assertThat(e.message).isEqualTo(errorMessage)
-            }
-        }
-    }
-
-    @Test
-    fun testODPManagerSurface() {
-        Assume.assumeTrue("minSdkVersion = API 34 ext 12", mValidAdServicesSdkExtVersion)
-        val odpManager = mockODPManager(mContext)
-        val managerCompat =
-            androidx.privacysandbox.ondevicepersonalization.client.OnDevicePersonalizationManager
-                .obtain(mContext)
-
-        val answer = { args: InvocationOnMock ->
-            val receiver = args.getArgument<OutcomeReceiver<Any, Exception>>(6)
-            receiver.onResult(TEST_SURFACE_PACKAGE)
-        }
-        val surfacePackageToken = mock(SurfacePackageToken::class.java)
-        val iBinder = mock(IBinder::class.java)
-
-        doAnswer(answer)
-            .`when`(odpManager)
-            .requestSurfacePackage(
-                any<SurfacePackageToken>(),
-                any<IBinder>(),
-                any<Int>(),
-                any<Int>(),
-                any<Int>(),
-                any<Executor>(),
-                any<OutcomeReceiver<SurfacePackage, Exception>>()
-            )
-        // Actually invoke the compat code.
-        runBlocking {
-            val result: SurfacePackage? =
-                managerCompat?.requestSurfacePackage(
-                    surfacePackageToken,
-                    iBinder,
-                    TEST_DISPLAY_ID,
-                    TEST_HEIGHT,
-                    TEST_WIDTH
-                )
-            assertThat(result == TEST_SURFACE_PACKAGE)
-        }
-        val captor1 = ArgumentCaptor.forClass(SurfacePackageToken::class.java)
-        val captor2 = ArgumentCaptor.forClass(IBinder::class.java)
-        val captor3 = ArgumentCaptor.forClass(Int::class.java)
-        val captor4 = ArgumentCaptor.forClass(Int::class.java)
-        val captor5 = ArgumentCaptor.forClass(Int::class.java)
-
-        verify(odpManager)
-            .requestSurfacePackage(
-                captor1.capture(),
-                captor2.capture(),
-                captor3.capture(),
-                captor4.capture(),
-                captor5.capture(),
-                any<Executor>(),
-                any<OutcomeReceiver<SurfacePackage, Exception>>()
-            )
-
-        // Verify that the request that the compat code makes to the platform is correct.
-        assertThat(captor1.value == surfacePackageToken)
-        assertThat(captor2.value == iBinder)
-        assertThat(captor3.value == TEST_DISPLAY_ID)
-        assertThat(captor4.value == TEST_HEIGHT)
-        assertThat(captor5.value == TEST_WIDTH)
-    }
-
-    @Test
-    fun testODPManagerSurfaceThrows() {
-        Assume.assumeTrue("minSdkVersion = API 34 ext 12", mValidAdServicesSdkExtVersion)
-        val odpManager = mockODPManager(mContext)
-        val managerCompat =
-            androidx.privacysandbox.ondevicepersonalization.client.OnDevicePersonalizationManager
-                .obtain(mContext)
-
-        val errorMessage = "some error occurred"
-        val errorCallback = { args: InvocationOnMock ->
-            val receiver = args.getArgument<OutcomeReceiver<Any, Exception>>(6)
-            receiver.onError(Exception(errorMessage))
-        }
-        val surfacePackageToken = mock(SurfacePackageToken::class.java)
-        val iBinder = mock(IBinder::class.java)
-
-        doAnswer(errorCallback)
-            .`when`(odpManager)
-            .requestSurfacePackage(
-                any<SurfacePackageToken>(),
-                any<IBinder>(),
-                any<Int>(),
-                any<Int>(),
-                any<Int>(),
-                any<Executor>(),
-                any<OutcomeReceiver<SurfacePackage, Exception>>()
-            )
-        // Actually invoke the compat code.
-        runBlocking {
-            try {
-                managerCompat?.requestSurfacePackage(
-                    surfacePackageToken,
-                    iBinder,
-                    TEST_DISPLAY_ID,
-                    TEST_HEIGHT,
-                    TEST_WIDTH
-                )
-            } catch (e: Exception) {
-                assertThat(e.message).isEqualTo(errorMessage)
-            }
-        }
-    }
-
-    companion object {
-        private lateinit var mContext: Context
-        private val TEST_SERVICE_COMPONENT_NAME: ComponentName =
-            ComponentName.createRelative("com.example.service", ".Example")
-        private val TEST_BUNDLE: PersistableBundle = PersistableBundle.EMPTY
-        private const val TEST_DISPLAY_ID: Int = 1234
-        private const val TEST_HEIGHT: Int = 600
-        private const val TEST_WIDTH: Int = 300
-
-        private val TEST_SURFACE_PACKAGE: SurfacePackage = mock(SurfacePackage::class.java)
-
-        private fun mockODPManager(spyContext: Context): OnDevicePersonalizationManager {
-            val odpManager = mock(OnDevicePersonalizationManager::class.java)
-            `when`(spyContext.getSystemService(OnDevicePersonalizationManager::class.java))
-                .thenReturn(odpManager)
-            return odpManager
-        }
-    }
-}
diff --git a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/AndroidManifest.xml b/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/AndroidManifest.xml
deleted file mode 100644
index 3f2e804..0000000
--- a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,18 +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 xmlns:android="http://schemas.android.com/apk/res/android">
-</manifest>
\ No newline at end of file
diff --git a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/java/androidx/privacysandbox/ondevicepersonalization/client/ExecuteInIsolatedServiceRequest.kt b/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/java/androidx/privacysandbox/ondevicepersonalization/client/ExecuteInIsolatedServiceRequest.kt
deleted file mode 100644
index ee39bb2..0000000
--- a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/java/androidx/privacysandbox/ondevicepersonalization/client/ExecuteInIsolatedServiceRequest.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.ondevicepersonalization.client
-
-import android.content.ComponentName
-import android.os.PersistableBundle
-
-/**
- * The request of [OnDevicePersonalizationManager.executeInIsolatedService].
- *
- * @param service The component name of the service.
- * @param appParams Passed from the calling app to the Isolated Service. The expected contents of
- *   this parameter are defined by the service. The platform does not interpret this parameter.
- */
-@Suppress("DataClassDefinition")
-data class ExecuteInIsolatedServiceRequest(
-    val service: ComponentName,
-    val appParams: PersistableBundle = PersistableBundle.EMPTY,
-) {
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other == null || javaClass != other.javaClass) return false
-
-        val that = other as ExecuteInIsolatedServiceRequest
-        return this.service == that.service && this.appParams == that.appParams
-    }
-
-    override fun hashCode(): Int {
-        var hash = 1
-        hash = 31 * hash + service.hashCode()
-        hash = 31 * hash + appParams.hashCode()
-        return hash
-    }
-}
diff --git a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/java/androidx/privacysandbox/ondevicepersonalization/client/ExecuteInIsolatedServiceResponse.kt b/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/java/androidx/privacysandbox/ondevicepersonalization/client/ExecuteInIsolatedServiceResponse.kt
deleted file mode 100644
index 977c1c9..0000000
--- a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/java/androidx/privacysandbox/ondevicepersonalization/client/ExecuteInIsolatedServiceResponse.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.ondevicepersonalization.client
-
-import android.adservices.ondevicepersonalization.SurfacePackageToken
-
-@Suppress("DataClassDefinition")
-data class ExecuteInIsolatedServiceResponse
-internal constructor(
-    /**
-     * Returns a {@link SurfacePackageToken}, which is an opaque reference to content that can be
-     * displayed in a {@link android.view.SurfaceView}. This may be {@code null} if the {@link
-     * IsolatedService} has not generated any content to be displayed within the calling app.
-     */
-    val surfacePackageToken: SurfacePackageToken?,
-)
diff --git a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/java/androidx/privacysandbox/ondevicepersonalization/client/OnDevicePersonalizationManager.kt b/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/java/androidx/privacysandbox/ondevicepersonalization/client/OnDevicePersonalizationManager.kt
deleted file mode 100644
index 1e6f5d8..0000000
--- a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/java/androidx/privacysandbox/ondevicepersonalization/client/OnDevicePersonalizationManager.kt
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.ondevicepersonalization.client
-
-import android.adservices.ondevicepersonalization.SurfacePackageToken
-import android.annotation.SuppressLint
-import android.content.Context
-import android.os.Build
-import android.os.IBinder
-import android.os.ext.SdkExtensions
-import android.view.SurfaceControlViewHost
-
-/**
- * OnDevicePersonalizationManager provides APIs for apps to load an
- * [IsolatedService][android.adservices.ondevicepersonalization.IsolatedService] in an isolated
- * process and interact with it.
- *
- * An app can request an
- * [IsolatedService][android.adservices.ondevicepersonalization.IsolatedService] to generate content
- * for display within an [SurfaceView][android.view.SurfaceView] within the app's view hierarchy,
- * and also write persistent results to on-device storage which can be consumed by Federated
- * Analytics for cross-device statistical analysis or by Federated Learning for model training. The
- * displayed content and the persistent output are both not directly accessible by the calling app.
- */
-abstract class OnDevicePersonalizationManager internal constructor() {
-    /**
-     * Executes an [IsolatedService][android.adservices.ondevicepersonalization.IsolatedService] in
-     * the OnDevicePersonalization sandbox bound to an isolated process. Upon execution completion,
-     * the returned response object contains tokens that can be subsequently used to display results
-     * in a [SurfaceView][android.view.SurfaceView] within the calling app. If the service returned
-     * a [RenderingConfig][android.adservices.ondevicepersonalization.RenderingConfig] to be
-     * displayed, [ExecuteInIsolatedServiceResponse.surfacePackageToken] can be used in a subsequent
-     * [requestSurfacePackage] call to display the result in a view. The SurfacePackageToken may be
-     * null to indicate that no output is expected to be displayed for this request.
-     *
-     * @param executeInIsolatedServiceRequest
-     * @return [ExecuteInIsolatedServiceResponse]
-     * @throws Exception
-     *   [OnDevicePersonalizationException][android.adservices.ondevicepersonalization.OnDevicePersonalizationException]
-     *   if execution of the handler fails with an error code. Older versions may throw
-     *   [NameNotFoundException][android.content.pm.PackageManager.NameNotFoundException] if the
-     *   handler package is not installed or does not have a valid ODP manifest or
-     *   [ClassNotFoundException] if the handler class is not found,
-     */
-    abstract suspend fun executeInIsolatedService(
-        executeInIsolatedServiceRequest: ExecuteInIsolatedServiceRequest
-    ): ExecuteInIsolatedServiceResponse
-
-    /**
-     * Requests a [SurfacePackage][android.view.SurfaceControlViewHost.SurfacePackage] to be
-     * inserted into a [SurfaceView][android.view.SurfaceView] inside the calling app.
-     *
-     * @param surfacePackageToken a reference to a [SurfacePackageToken] returned by a prior call to
-     *   [executeInIsolatedService].
-     * @param surfaceViewHostToken the hostToken of the [SurfaceView][android.view.SurfaceView],
-     *   which is returned by [android.view.SurfaceView.getHostToken] after the
-     *   [SurfaceView][android.view.SurfaceView] has been added to the view hierarchy.
-     * @param displayId the integer ID of the logical display on which to display the
-     *   [SurfaceControlViewHost.SurfacePackage], returned by Context.getDisplay().getDisplayId().
-     * @param width the width of the [SurfaceControlViewHost.SurfacePackage] in pixels.
-     * @param height the height of the [SurfaceControlViewHost.SurfacePackage] in pixels.
-     * @return A surface package containing a [View][android.view.View] with the content from a
-     *   result of a prior call to [executeInIsolatedService] running in the OnDevicePersonalization
-     *   sandbox.
-     * @throws Exception
-     *   [OnDevicePersonalizationException][android.adservices.ondevicepersonalization.OnDevicePersonalizationException]
-     *   if execution of the handler fails with an error code.
-     */
-    abstract suspend fun requestSurfacePackage(
-        surfacePackageToken: SurfacePackageToken,
-        surfaceViewHostToken: IBinder,
-        displayId: Int,
-        width: Int,
-        height: Int
-    ): SurfaceControlViewHost.SurfacePackage
-
-    companion object {
-        /**
-         * Creates [OnDevicePersonalizationManager].
-         *
-         * @return OnDevicePersonalizationManager object. If the device is running an incompatible
-         *   build, the value returned is null.
-         */
-        @SuppressLint("NewApi")
-        @JvmStatic
-        fun obtain(context: Context): OnDevicePersonalizationManager? {
-            return if (adServicesVersion() >= 12) {
-                OnDevicePersonalizationManagerAPI33Ext12Impl(context)
-            } else {
-                null
-            }
-        }
-
-        private fun adServicesVersion(): Int {
-            return if (Build.VERSION.SDK_INT >= 33) {
-                SdkExtensions.getExtensionVersion(SdkExtensions.AD_SERVICES)
-            } else {
-                0
-            }
-        }
-    }
-}
diff --git a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/java/androidx/privacysandbox/ondevicepersonalization/client/OnDevicePersonalizationManagerAPI33Ext12Impl.kt b/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/java/androidx/privacysandbox/ondevicepersonalization/client/OnDevicePersonalizationManagerAPI33Ext12Impl.kt
deleted file mode 100644
index 5f9fc28..0000000
--- a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/java/androidx/privacysandbox/ondevicepersonalization/client/OnDevicePersonalizationManagerAPI33Ext12Impl.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.ondevicepersonalization.client
-
-import android.annotation.SuppressLint
-import android.content.Context
-import android.os.ext.SdkExtensions
-import androidx.annotation.RequiresExtension
-import androidx.annotation.RestrictTo
-
-@RestrictTo(RestrictTo.Scope.LIBRARY)
-@SuppressLint("NewApi")
-@RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 12)
-class OnDevicePersonalizationManagerAPI33Ext12Impl(context: Context) :
-    OnDevicePersonalizationManagerImplCommon(
-        context.getSystemService(
-            android.adservices.ondevicepersonalization.OnDevicePersonalizationManager::class.java
-        )
-    )
diff --git a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/java/androidx/privacysandbox/ondevicepersonalization/client/OnDevicePersonalizationManagerImplCommon.kt b/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/java/androidx/privacysandbox/ondevicepersonalization/client/OnDevicePersonalizationManagerImplCommon.kt
deleted file mode 100644
index 5decb89..0000000
--- a/privacysandbox/ondevicepersonalization/ondevicepersonalization-client/src/main/java/androidx/privacysandbox/ondevicepersonalization/client/OnDevicePersonalizationManagerImplCommon.kt
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.ondevicepersonalization.client
-
-import android.adservices.ondevicepersonalization.SurfacePackageToken
-import android.annotation.SuppressLint
-import android.os.Build
-import android.os.IBinder
-import android.os.ext.SdkExtensions
-import android.view.SurfaceControlViewHost
-import androidx.annotation.DoNotInline
-import androidx.annotation.RequiresExtension
-import androidx.annotation.RestrictTo
-import androidx.core.os.asOutcomeReceiver
-import kotlinx.coroutines.suspendCancellableCoroutine
-
-@RestrictTo(RestrictTo.Scope.LIBRARY)
-@SuppressLint("NewApi")
-@RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 12)
-@RequiresExtension(extension = Build.VERSION_CODES.TIRAMISU, version = 12)
-open class OnDevicePersonalizationManagerImplCommon(
-    private val mOdpManager:
-        android.adservices.ondevicepersonalization.OnDevicePersonalizationManager
-) : OnDevicePersonalizationManager() {
-    @DoNotInline
-    override suspend fun executeInIsolatedService(
-        executeInIsolatedServiceRequest: ExecuteInIsolatedServiceRequest
-    ): ExecuteInIsolatedServiceResponse {
-        val result =
-            suspendCancellableCoroutine<
-                android.adservices.ondevicepersonalization.OnDevicePersonalizationManager.ExecuteResult
-            > { continuation ->
-                mOdpManager.execute(
-                    executeInIsolatedServiceRequest.service,
-                    executeInIsolatedServiceRequest.appParams,
-                    Runnable::run,
-                    continuation.asOutcomeReceiver()
-                )
-            }
-        return ExecuteInIsolatedServiceResponse(
-            surfacePackageToken = result.surfacePackageToken,
-        )
-    }
-
-    @DoNotInline
-    override suspend fun requestSurfacePackage(
-        surfacePackageToken: SurfacePackageToken,
-        surfaceViewHostToken: IBinder,
-        displayId: Int,
-        width: Int,
-        height: Int
-    ): SurfaceControlViewHost.SurfacePackage =
-        suspendCancellableCoroutine<SurfaceControlViewHost.SurfacePackage> { continuation ->
-            mOdpManager.requestSurfacePackage(
-                surfacePackageToken,
-                surfaceViewHostToken,
-                displayId,
-                width,
-                height,
-                Runnable::run,
-                continuation.asOutcomeReceiver()
-            )
-        }
-}
diff --git a/privacysandbox/tools/integration-tests/testapp/build.gradle b/privacysandbox/tools/integration-tests/testapp/build.gradle
index 0ae72c9..2d10119 100644
--- a/privacysandbox/tools/integration-tests/testapp/build.gradle
+++ b/privacysandbox/tools/integration-tests/testapp/build.gradle
@@ -58,14 +58,14 @@
     implementation("androidx.core:core-ktx:1.9.0")
     implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.5.1")
     implementation("androidx.appcompat:appcompat:1.6.1")
-    implementation("androidx.activity:activity:1.10.1")
+    implementation(project(":activity:activity"))
     implementation(libs.material)
     implementation(libs.constraintLayout)
     implementation(libs.kotlinCoroutinesAndroid)
     implementation("androidx.tracing:tracing:1.1.0")
     implementation(libs.espressoIdlingResource)
 
-    androidTestImplementation("androidx.activity:activity:1.10.1")
+    androidTestImplementation(project(":activity:activity"))
     androidTestImplementation(project(":internal-testutils-runtime"))
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testExtJunit)
diff --git a/privacysandbox/ui/integration-tests/sdkproviderutils/src/main/java/androidx/privacysandbox/ui/integration/sdkproviderutils/TestAdapters.kt b/privacysandbox/ui/integration-tests/sdkproviderutils/src/main/java/androidx/privacysandbox/ui/integration/sdkproviderutils/TestAdapters.kt
index 4c2b212..6dc256c 100644
--- a/privacysandbox/ui/integration-tests/sdkproviderutils/src/main/java/androidx/privacysandbox/ui/integration/sdkproviderutils/TestAdapters.kt
+++ b/privacysandbox/ui/integration-tests/sdkproviderutils/src/main/java/androidx/privacysandbox/ui/integration/sdkproviderutils/TestAdapters.kt
@@ -22,8 +22,6 @@
 import android.content.res.Configuration
 import android.graphics.Canvas
 import android.graphics.Color
-import android.graphics.Color.BLACK
-import android.graphics.Color.WHITE
 import android.graphics.Paint
 import android.net.Uri
 import android.os.Bundle
@@ -31,18 +29,14 @@
 import android.os.Looper
 import android.provider.Settings
 import android.util.Log
-import android.view.Gravity
-import android.view.MotionEvent
 import android.view.View
 import android.view.ViewGroup
 import android.webkit.WebResourceRequest
 import android.webkit.WebResourceResponse
 import android.webkit.WebSettings
 import android.webkit.WebView
-import android.widget.FrameLayout
 import android.widget.LinearLayout
 import android.widget.TextView
-import android.widget.ToggleButton
 import androidx.privacysandbox.ui.client.SandboxedUiAdapterFactory
 import androidx.privacysandbox.ui.client.view.SandboxedSdkView
 import androidx.privacysandbox.ui.core.SandboxedUiAdapter
@@ -53,11 +47,19 @@
 import java.util.concurrent.Executor
 
 class TestAdapters(private val sdkContext: Context) {
+    inner class TestBannerAd(
+        private val text: String,
+        private val withSlowDraw: Boolean,
+        private val automatedTestCallbackProxy: IAutomatedTestCallbackProxy? = null
+    ) : BannerAd() {
+        override fun buildAdView(sessionContext: Context, width: Int, height: Int): View? {
+            return TestView(sessionContext, withSlowDraw, text, automatedTestCallbackProxy)
+        }
+    }
+
     abstract class BannerAd() : AbstractSandboxedUiAdapter() {
         lateinit var sessionClientExecutor: Executor
         lateinit var sessionClient: SandboxedUiAdapter.SessionClient
-        lateinit var adViewWithConsumeScrollOverlay: AdViewWithConsumeScrollOverlay
-        val mainLooperHandler = Handler(Looper.getMainLooper())
 
         abstract fun buildAdView(sessionContext: Context, width: Int, height: Int): View?
 
@@ -72,22 +74,16 @@
         ) {
             sessionClientExecutor = clientExecutor
             sessionClient = client
-            mainLooperHandler.post(
-                Runnable lambda@{
-                    Log.d(TAG, "Session requested")
-                    var adView: View =
-                        buildAdView(context, initialWidth, initialHeight) ?: return@lambda
-                    adView.layoutParams = ViewGroup.LayoutParams(initialWidth, initialHeight)
-                    adViewWithConsumeScrollOverlay =
-                        AdViewWithConsumeScrollOverlay(context, initialWidth, initialHeight, adView)
-                    if (isZOrderOnTop) {
-                        adViewWithConsumeScrollOverlay.hideOverlay()
+            Handler(Looper.getMainLooper())
+                .post(
+                    Runnable lambda@{
+                        Log.d(TAG, "Session requested")
+                        val adView: View =
+                            buildAdView(context, initialWidth, initialHeight) ?: return@lambda
+                        adView.layoutParams = ViewGroup.LayoutParams(initialWidth, initialHeight)
+                        clientExecutor.execute { client.onSessionOpened(BannerAdSession(adView)) }
                     }
-                    clientExecutor.execute {
-                        client.onSessionOpened(BannerAdSession(adViewWithConsumeScrollOverlay))
-                    }
-                }
-            )
+                )
         }
 
         private inner class BannerAdSession(private val adView: View) : AbstractSession() {
@@ -101,12 +97,7 @@
             }
 
             override fun notifyZOrderChanged(isZOrderOnTop: Boolean) {
-                Log.i(TAG, "Z order changed to (${if (isZOrderOnTop) "z-above" else "z-below"})")
-                if (isZOrderOnTop) {
-                    adViewWithConsumeScrollOverlay.hideOverlay()
-                } else {
-                    adViewWithConsumeScrollOverlay.showOverlay()
-                }
+                Log.i(TAG, "Z order changed")
             }
 
             override fun notifyConfigurationChanged(configuration: Configuration) {
@@ -117,81 +108,6 @@
                 Log.i(TAG, "Closing session")
             }
         }
-
-        inner class AdViewWithConsumeScrollOverlay(
-            context: Context,
-            initialWidth: Int,
-            initialHeight: Int,
-            adView: View
-        ) : FrameLayout(context) {
-            private val consumeScrollOverlay: ViewGroup
-            private var allowAppToScroll = true
-
-            init {
-                layoutParams = ViewGroup.LayoutParams(initialWidth, initialHeight)
-                addView(adView)
-
-                consumeScrollOverlay = createConsumeScrollOverlay()
-                addView(consumeScrollOverlay)
-                consumeScrollOverlay.bringToFront()
-            }
-
-            override fun onInterceptTouchEvent(motionEvent: MotionEvent): Boolean {
-                if (motionEvent.action == MotionEvent.ACTION_DOWN) {
-                    requestDisallowInterceptTouchEvent(!allowAppToScroll)
-                }
-                return super.onInterceptTouchEvent(motionEvent)
-            }
-
-            fun createConsumeScrollOverlay(): ViewGroup {
-                val linearLayout = LinearLayout(context)
-                linearLayout.layoutParams =
-                    LayoutParams(
-                        LayoutParams.WRAP_CONTENT,
-                        LayoutParams.WRAP_CONTENT,
-                        Gravity.BOTTOM or Gravity.RIGHT
-                    )
-                linearLayout.orientation = LinearLayout.HORIZONTAL
-                linearLayout.setPadding(10, 10, 10, 10)
-                linearLayout.setBackgroundColor(BLACK)
-
-                val textView = TextView(context)
-                textView.text = "Allow App to scroll?"
-                textView.layoutParams =
-                    LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
-                textView.setTextColor(WHITE)
-                linearLayout.addView(textView)
-
-                val toggleButton = ToggleButton(context)
-                toggleButton.layoutParams =
-                    LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
-                toggleButton.isChecked = true
-                toggleButton.setOnCheckedChangeListener { _, isChecked ->
-                    allowAppToScroll = isChecked
-                }
-                linearLayout.addView(toggleButton)
-
-                return linearLayout
-            }
-
-            fun hideOverlay() {
-                mainLooperHandler.post { consumeScrollOverlay.visibility = INVISIBLE }
-            }
-
-            fun showOverlay() {
-                mainLooperHandler.post { consumeScrollOverlay.visibility = VISIBLE }
-            }
-        }
-    }
-
-    inner class TestBannerAd(
-        private val text: String,
-        private val withSlowDraw: Boolean,
-        private val automatedTestCallbackProxy: IAutomatedTestCallbackProxy? = null
-    ) : BannerAd() {
-        override fun buildAdView(sessionContext: Context, width: Int, height: Int): View? {
-            return TestView(sessionContext, withSlowDraw, text, automatedTestCallbackProxy)
-        }
     }
 
     inner class WebViewBannerAd : BannerAd() {
diff --git a/privacysandbox/ui/integration-tests/sdkproviderutils/src/main/java/androidx/privacysandbox/ui/integration/sdkproviderutils/ViewabilityHandler.kt b/privacysandbox/ui/integration-tests/sdkproviderutils/src/main/java/androidx/privacysandbox/ui/integration/sdkproviderutils/ViewabilityHandler.kt
index ce69303..4399b70 100644
--- a/privacysandbox/ui/integration-tests/sdkproviderutils/src/main/java/androidx/privacysandbox/ui/integration/sdkproviderutils/ViewabilityHandler.kt
+++ b/privacysandbox/ui/integration-tests/sdkproviderutils/src/main/java/androidx/privacysandbox/ui/integration/sdkproviderutils/ViewabilityHandler.kt
@@ -24,7 +24,6 @@
 import android.util.Log
 import android.view.View
 import androidx.privacysandbox.ui.core.SandboxedSdkViewUiInfo
-import androidx.privacysandbox.ui.core.SandboxedUiAdapterSignalOptions
 import androidx.privacysandbox.ui.core.SessionObserver
 import androidx.privacysandbox.ui.core.SessionObserverContext
 import androidx.privacysandbox.ui.core.SessionObserverFactory
@@ -45,9 +44,6 @@
         private class SessionObserverFactoryImpl(val drawViewability: Boolean) :
             SessionObserverFactory {
 
-            override val signalOptions: Set<String> =
-                setOf(SandboxedUiAdapterSignalOptions.GEOMETRY)
-
             override fun create(): SessionObserver {
                 return SessionObserverImpl()
             }
diff --git a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/BaseFragment.kt b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/BaseFragment.kt
index b87de7a..e269009 100644
--- a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/BaseFragment.kt
+++ b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/BaseFragment.kt
@@ -163,7 +163,7 @@
     }
 
     open fun handleDrawerStateChange(isDrawerOpen: Boolean) {
-        providerUiOnTop = !isDrawerOpen && isZOrderAboveToggleChecked
+        providerUiOnTop = !isDrawerOpen && !isZOrderBelowToggleChecked
         getSandboxedSdkViews().forEach { it.orderProviderUiAboveClientUi(providerUiOnTop) }
     }
 
@@ -192,7 +192,7 @@
         private const val MEDIATEE_SDK_NAME =
             "androidx.privacysandbox.ui.integration.mediateesdkproviderwrapper"
         const val TAG = "TestSandboxClient"
-        var isZOrderAboveToggleChecked = false
+        var isZOrderBelowToggleChecked = false
         @AdFormat var currentAdFormat = AdFormat.BANNER_AD
         @AdType var currentAdType = AdType.BASIC_NON_WEBVIEW
         @MediationOption var currentMediationOption = MediationOption.NON_MEDIATED
diff --git a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/FullscreenSetupComposeFragment.kt b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/FullscreenSetupComposeFragment.kt
index b5901f6..5185060 100644
--- a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/FullscreenSetupComposeFragment.kt
+++ b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/FullscreenSetupComposeFragment.kt
@@ -41,7 +41,7 @@
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.unit.dp
-import androidx.privacysandbox.activity.client.createManagedSdkActivityLauncher
+import androidx.privacysandbox.activity.client.createSdkActivityLauncher
 import androidx.privacysandbox.activity.client.toLauncherInfo
 import androidx.privacysandbox.ui.integration.sdkproviderutils.SdkApiConstants.Companion.BackNavigation
 import androidx.privacysandbox.ui.integration.sdkproviderutils.SdkApiConstants.Companion.ScreenOrientation
@@ -175,7 +175,7 @@
                 else -> BackNavigation.ENABLED
             }
 
-        val activityLauncher = requireActivity().createManagedSdkActivityLauncher({ true })
+        val activityLauncher = requireActivity().createSdkActivityLauncher({ true })
         getSdkApi()
             .launchFullscreenAd(
                 activityLauncher.toLauncherInfo(),
diff --git a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/FullscreenSetupFragment.kt b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/FullscreenSetupFragment.kt
index e2c72a4..249f5ce 100644
--- a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/FullscreenSetupFragment.kt
+++ b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/FullscreenSetupFragment.kt
@@ -22,12 +22,11 @@
 import android.view.ViewGroup
 import android.widget.Button
 import android.widget.RadioButton
-import androidx.privacysandbox.activity.client.createManagedSdkActivityLauncher
+import androidx.privacysandbox.activity.client.createSdkActivityLauncher
 import androidx.privacysandbox.activity.client.toLauncherInfo
 import androidx.privacysandbox.ui.integration.sdkproviderutils.SdkApiConstants.Companion.BackNavigation
 import androidx.privacysandbox.ui.integration.sdkproviderutils.SdkApiConstants.Companion.ScreenOrientation
 
-// TODO(b/399092069): add non-LifecycleOwner activity CUJ to the fragment.
 class FullscreenSetupFragment : BaseFragment() {
 
     override fun onCreateView(
@@ -62,7 +61,7 @@
                     else -> BackNavigation.ENABLED
                 }
 
-            val activityLauncher = requireActivity().createManagedSdkActivityLauncher({ true })
+            val activityLauncher = requireActivity().createSdkActivityLauncher({ true })
             getSdkApi()
                 .launchFullscreenAd(
                     activityLauncher.toLauncherInfo(),
diff --git a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainActivity.kt b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainActivity.kt
index 98eb877..14b6b45 100644
--- a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainActivity.kt
+++ b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainActivity.kt
@@ -104,7 +104,7 @@
         titleBar = findViewById(R.id.title_bar)
         drawerLayout = findViewById(R.id.drawer)
         navigationView = findViewById(R.id.navigation_view)
-        zOrderToggleButton = findViewById(R.id.zorder_above_switch)
+        zOrderToggleButton = findViewById(R.id.zorder_below_switch)
         composeToggleButton = findViewById(R.id.compose_switch)
         viewabilityToggleButton = findViewById(R.id.display_viewability_switch)
         triggerSandboxDeathButton = findViewById(R.id.trigger_sandbox_death)
@@ -264,7 +264,7 @@
 
     private fun initializeZOrderToggleButton() {
         zOrderToggleButton.setOnCheckedChangeListener { _, isChecked ->
-            BaseFragment.isZOrderAboveToggleChecked = isChecked
+            BaseFragment.isZOrderBelowToggleChecked = isChecked
         }
     }
 
diff --git a/privacysandbox/ui/integration-tests/testapp/src/main/res/layout/activity_main.xml b/privacysandbox/ui/integration-tests/testapp/src/main/res/layout/activity_main.xml
index fa111cd..e1b2810 100644
--- a/privacysandbox/ui/integration-tests/testapp/src/main/res/layout/activity_main.xml
+++ b/privacysandbox/ui/integration-tests/testapp/src/main/res/layout/activity_main.xml
@@ -94,13 +94,13 @@
             android:text="@string/display_viewability_switch" />
 
         <com.google.android.material.switchmaterial.SwitchMaterial
-            android:id="@+id/zorder_above_switch"
+            android:id="@+id/zorder_below_switch"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="center"
             android:layout_marginTop="200dp"
             android:checked="false"
-            android:text="@string/zorder_above_switch" />
+            android:text="@string/zorder_below_switch" />
 
         <com.google.android.material.switchmaterial.SwitchMaterial
             android:id="@+id/compose_switch"
diff --git a/privacysandbox/ui/integration-tests/testapp/src/main/res/values/strings.xml b/privacysandbox/ui/integration-tests/testapp/src/main/res/values/strings.xml
index 9fcce38..ebd24b1 100644
--- a/privacysandbox/ui/integration-tests/testapp/src/main/res/values/strings.xml
+++ b/privacysandbox/ui/integration-tests/testapp/src/main/res/values/strings.xml
@@ -25,7 +25,7 @@
     <string name="long_text">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sit amet lacus dignissim, sollicitudin nisl sed, egestas leo. Sed congue vitae nulla vel mattis. Sed porttitor lobortis felis id sollicitudin. Maecenas a venenatis mi. Etiam sapien ipsum, bibendum at congue eget, venenatis laoreet erat. Integer dapibus varius lectus, eu gravida arcu pharetra in. Suspendisse volutpat sit amet ex non rutrum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed quis dui eros. Ut sed magna sit amet nulla iaculis ultrices. Pellentesque fermentum, nibh vel fermentum lacinia, urna nibh dictum risus, id feugiat sapien dolor nec erat. Maecenas augue nibh, sodales eu iaculis ut, volutpat non magna. Donec eget laoreet odio.Sed eget purus id mauris euismod lobortis. Vestibulum suscipit hendrerit rhoncus. Etiam et porttitor justo. Vivamus sodales velit in risus convallis tempor vitae non nunc. Integer lacinia consectetur ipsum, sit amet semper mi posuere eget. Etiam non quam nec sem malesuada viverra. Donec sollicitudin quam metus, at suscipit nisi mattis nec. Nam eu vehicula mauris. Cras nibh massa, interdum eget ante ut, molestie efficitur leo. In aliquet sodales mi vel bibendum. In iaculis neque in laoreet vestibulum. Nullam non interdum lectus. Etiam non ante elit. Vivamus luctus nisi ex, quis facilisis dui pellentesque porttitor. Etiam arcu nisl, porta eu hendrerit vel, porttitor vel turpis. Vestibulum in venenatis elit. Nunc in nisl congue, suscipit massa eu, luctus enim. Donec a fermentum magna, nec commodo purus. Quisque ac nisi et mi pretium porta ut eget nibh. Nulla consequat enim a congue porta. Donec odio magna, elementum in felis sit amet, posuere laoreet urna. Suspendisse ultricies in libero nec volutpat. Vivamus at magna lectus. Sed id metus et tellus suscipit aliquam in at lacus. Ut gravida ultrices augue, quis ultrices lacus ullamcorper ac. Ut fringilla ac quam sit amet pharetra. In non ante consectetur, dapibus ante eu, interdum risus. Nam lobortis blandit nisl ac dapibus. Maecenas vitae est ac odio sollicitudin varius eget quis orci. Mauris vitae ex eget neque tempor faucibus eget vel orci. Morbi eu feugiat lorem. Donec id sem et magna ullamcorper congue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed laoreet ultrices quam, quis eleifend libero malesuada id. Sed ac sollicitudin diam. Integer sit amet ex ac purus malesuada iaculis at in mauris. Vestibulum egestas velit et sapien volutpat, vel varius augue fringilla. Duis efficitur blandit arcu in suscipit. Maecenas neque purus, finibus vel rhoncus at, pretium ut ipsum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sit amet lacus dignissim, sollicitudin nisl sed, egestas leo. Sed congue vitae nulla vel mattis. Sed porttitor lobortis felis id sollicitudin. Maecenas a venenatis mi. Etiam sapien ipsum, bibendum at congue eget, venenatis laoreet erat. Integer dapibus varius lectus, eu gravida arcu pharetra in. Suspendisse volutpat sit amet ex non rutrum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed quis dui eros. Ut sed magna sit amet nulla iaculis ultrices. Pellentesque fermentum, nibh vel fermentum lacinia, urna nibh dictum risus, id feugiat sapien dolor nec erat. Maecenas augue nibh, sodales eu iaculis ut, volutpat non magna. Donec eget laoreet odio.Sed eget purus id mauris euismod lobortis. Vestibulum suscipit hendrerit rhoncus. Etiam et porttitor justo. Vivamus sodales velit in risus convallis tempor vitae non nunc. Integer lacinia consectetur ipsum, sit amet semper mi posuere eget. Etiam non quam nec sem malesuada viverra. Donec sollicitudin quam metus, at suscipit nisi mattis nec. Nam eu vehicula mauris. Cras nibh massa, interdum eget ante ut, molestie efficitur leo. In aliquet sodales mi vel bibendum. In iaculis neque in laoreet vestibulum. Nullam non interdum lectus. Etiam non ante elit. Vivamus luctus nisi ex, quis facilisis dui pellentesque porttitor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sit amet lacus dignissim, sollicitudin nisl sed, egestas leo. Sed congue vitae nulla vel mattis. Sed porttitor lobortis felis id sollicitudin. Maecenas a venenatis mi. Etiam sapien ipsum, bibendum at congue eget, venenatis laoreet erat. Integer dapibus varius lectus, eu gravida arcu pharetra in. Suspendisse volutpat sit amet ex non rutrum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed quis dui eros. Ut sed magna sit amet nulla iaculis ultrices. Pellentesque fermentum, nibh vel fermentum lacinia, urna nibh dictum risus, id feugiat sapien dolor nec erat. Maecenas augue nibh, sodales eu iaculis ut, volutpat non magna. Donec eget laoreet odio.Sed eget purus id mauris euismod lobortis. Vestibulum suscipit hendrerit rhoncus. Etiam et porttitor justo. Vivamus sodales velit in risus convallis tempor vitae non nunc. Integer lacinia consectetur ipsum, sit amet semper mi posuere eget. Etiam non quam nec sem malesuada viverra. Donec sollicitudin quam metus, at suscipit nisi mattis nec. Nam eu vehicula mauris. Cras nibh massa, interdum eget ante ut, molestie efficitur leo. In aliquet sodales mi vel bibendum. In iaculis neque in laoreet vestibulum. Nullam non interdum lectus. Etiam non ante elit. Vivamus luctus nisi ex, quis facilisis dui pellentesque porttitor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sit amet lacus dignissim, sollicitudin nisl sed, egestas leo. Sed congue vitae nulla vel mattis. Sed porttitor lobortis felis id sollicitudin. Maecenas a venenatis mi. Etiam sapien ipsum, bibendum at congue eget, venenatis laoreet erat. Integer dapibus varius lectus, eu gravida arcu pharetra in. Suspendisse volutpat sit amet ex non rutrum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed quis dui eros. Ut sed magna sit amet nulla iaculis ultrices. Pellentesque fermentum, nibh vel fermentum lacinia, urna nibh dictum risus, id feugiat sapien dolor nec erat. Maecenas augue nibh, sodales eu iaculis ut, volutpat non magna. Donec eget laoreet odio.Sed eget purus id mauris euismod lobortis. Vestibulum suscipit hendrerit rhoncus. Etiam et porttitor justo. Vivamus sodales velit in risus convallis tempor vitae non nunc. Integer lacinia consectetur ipsum, sit amet semper mi posuere eget. Etiam non quam nec sem malesuada viverra. Donec sollicitudin quam metus, at suscipit nisi mattis nec. Nam eu vehicula mauris. Cras nibh massa, interdum eget ante ut, molestie efficitur leo. In aliquet sodales mi vel bibendum. In iaculis neque in laoreet vestibulum. Nullam non interdum lectus. Etiam non ante elit. Vivamus luctus nisi ex, quis facilisis dui pellentesque porttitor.</string>
     <string name="resizeFromSdk">resize from sdk</string>
     <string name="content_from_assets_switch">Content from assets</string>
-    <string name="zorder_above_switch">Z Order Above</string>
+    <string name="zorder_below_switch">Z Order Below</string>
     <string name="mediation_switch">Mediation</string>
     <string name="app_owned_mediatee_switch">AppOwnedMediatee</string>
     <string name="basic_webview_switch">Basic Webview</string>
diff --git a/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/ContentViewTest.kt b/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/ContentViewTest.kt
deleted file mode 100644
index 2b1dca8..0000000
--- a/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/ContentViewTest.kt
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.ui.client.test
-
-import android.content.Context
-import android.content.res.Configuration
-import android.os.Bundle
-import android.os.SystemClock
-import android.view.MotionEvent
-import android.view.animation.AnimationUtils
-import android.widget.FrameLayout
-import androidx.privacysandbox.ui.client.ContentView
-import androidx.privacysandbox.ui.core.IMotionEventTransferCallback
-import androidx.privacysandbox.ui.core.IRemoteSessionController
-import androidx.test.ext.junit.rules.ActivityScenarioRule
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.LargeTest
-import com.google.common.truth.Truth.assertThat
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@RunWith(AndroidJUnit4::class)
-@LargeTest
-class ContentViewTest {
-    companion object {
-        const val WIDTH = 500
-        const val HEIGHT = 500
-    }
-
-    @get:Rule var activityScenarioRule = ActivityScenarioRule(UiLibActivity::class.java)
-
-    private lateinit var contentView: ContentView
-    private lateinit var requestDisallowInterceptTracker: RequestDisallowInterceptTracker
-    private var lastTransferredMotionEvent: MotionEvent? = null
-    private var lastTransferredEventTargetFrameTime: Long = 0L
-    private var lastTransferredEventCallback: IMotionEventTransferCallback? = null
-
-    @Before
-    fun setup() {
-        lastTransferredMotionEvent = null
-        lastTransferredEventTargetFrameTime = 0L
-        lastTransferredEventCallback = null
-
-        val remoteController =
-            object : IRemoteSessionController.Stub() {
-                override fun close() {}
-
-                override fun notifyConfigurationChanged(configuration: Configuration?) {}
-
-                override fun notifyResized(width: Int, height: Int) {}
-
-                override fun notifyZOrderChanged(isZOrderOnTop: Boolean) {}
-
-                override fun notifyFetchUiForSession() {}
-
-                override fun notifyUiChanged(uiContainerInfo: Bundle?) {}
-
-                override fun notifySessionRendered(supportedSignalOptions: List<String?>?) {}
-
-                override fun notifyMotionEvent(
-                    motionEvent: MotionEvent,
-                    eventTargetFrameTime: Long,
-                    eventTransferCallback: IMotionEventTransferCallback?
-                ) {
-                    lastTransferredMotionEvent = motionEvent
-                    lastTransferredEventTargetFrameTime = eventTargetFrameTime
-                    lastTransferredEventCallback = eventTransferCallback
-                }
-            }
-
-        activityScenarioRule.scenario.onActivity { activity ->
-            requestDisallowInterceptTracker = RequestDisallowInterceptTracker(activity)
-            contentView = ContentView(activity, remoteController)
-            contentView.layoutParams = FrameLayout.LayoutParams(WIDTH, HEIGHT)
-            requestDisallowInterceptTracker.addView(contentView)
-            activity.setContentView(requestDisallowInterceptTracker)
-        }
-    }
-
-    @Test
-    fun transferEventsWithTargetTimeOnTouchEventTest() {
-        val downEvent = createMotionEvent(MotionEvent.ACTION_DOWN)
-        val timeNow = AnimationUtils.currentAnimationTimeMillis()
-        contentView.onTouchEvent(downEvent)
-
-        assertThat(lastTransferredMotionEvent).isEqualTo(downEvent)
-        assertThat(lastTransferredEventTargetFrameTime).isAtLeast(timeNow)
-        assertThat(lastTransferredEventCallback).isNotNull()
-    }
-
-    @Test
-    fun requestDisallowInterceptShouldNotCallParentIfContentViewIsDetachedTest() {
-        // Closing the activity, detaching the View.
-        activityScenarioRule.scenario.close()
-
-        val downEvent = createMotionEvent(MotionEvent.ACTION_DOWN)
-        contentView.onTouchEvent(downEvent)
-        assertThat(lastTransferredEventCallback).isNotNull()
-
-        requestDisallowInterceptTracker.resetCountDownLatch()
-        lastTransferredEventCallback!!.requestDisallowIntercept(true)
-        requestDisallowInterceptTracker.assertRequestDisallowInterceptIsNotCalled()
-    }
-
-    @Test
-    fun requestDisallowInterceptShouldBeOnlyApplicableOnRunningGestureTest() {
-        val downEvent1 = createMotionEvent(MotionEvent.ACTION_DOWN)
-        contentView.onTouchEvent(downEvent1)
-        assertThat(lastTransferredEventCallback).isNotNull()
-        val previousGestureCallback = lastTransferredEventCallback
-
-        val downEvent2 = createMotionEvent(MotionEvent.ACTION_DOWN)
-        contentView.onTouchEvent(downEvent2)
-
-        requestDisallowInterceptTracker.resetCountDownLatch()
-        previousGestureCallback!!.requestDisallowIntercept(true)
-        requestDisallowInterceptTracker.assertRequestDisallowInterceptIsNotCalled()
-
-        lastTransferredEventCallback!!.requestDisallowIntercept(true)
-        requestDisallowInterceptTracker.assertRequestDisallowInterceptIsCalled()
-    }
-
-    @Test
-    fun passMotionEventTransferCallbackAsNullOnUp() {
-        assertThat(lastTransferredEventCallback).isNull()
-
-        val downEvent = createMotionEvent(MotionEvent.ACTION_DOWN)
-        contentView.onTouchEvent(downEvent)
-        assertThat(lastTransferredEventCallback).isNotNull()
-
-        val cancelEvent = createMotionEvent(MotionEvent.ACTION_UP)
-        contentView.onTouchEvent(cancelEvent)
-        assertThat(lastTransferredEventCallback).isNull()
-    }
-
-    @Test
-    fun passMotionEventTransferCallbackAsNullOnCancel() {
-        assertThat(lastTransferredEventCallback).isNull()
-
-        val downEvent = createMotionEvent(MotionEvent.ACTION_DOWN)
-        contentView.onTouchEvent(downEvent)
-        assertThat(lastTransferredEventCallback).isNotNull()
-
-        val cancelEvent = createMotionEvent(MotionEvent.ACTION_CANCEL)
-        contentView.onTouchEvent(cancelEvent)
-        assertThat(lastTransferredEventCallback).isNull()
-    }
-
-    private class RequestDisallowInterceptTracker(context: Context) : FrameLayout(context) {
-        var requestDisallowInterceptCountDownLatch: CountDownLatch? = null
-
-        override fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
-            requestDisallowInterceptCountDownLatch?.countDown()
-        }
-
-        fun resetCountDownLatch() {
-            requestDisallowInterceptCountDownLatch = CountDownLatch(1)
-        }
-
-        fun assertRequestDisallowInterceptIsCalled() {
-            assertThat(requestDisallowInterceptCountDownLatch!!.await(1, TimeUnit.SECONDS)).isTrue()
-        }
-
-        fun assertRequestDisallowInterceptIsNotCalled() {
-            assertThat(requestDisallowInterceptCountDownLatch!!.await(1, TimeUnit.SECONDS))
-                .isFalse()
-        }
-    }
-
-    private fun createMotionEvent(motionEventAction: Int): MotionEvent {
-        return MotionEvent.obtain(
-            SystemClock.uptimeMillis(),
-            SystemClock.uptimeMillis(),
-            motionEventAction,
-            0f,
-            0f,
-            /* metaState = */ 0
-        )
-    }
-}
diff --git a/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/SandboxedSdkUiTest.kt b/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/SandboxedSdkUiTest.kt
index 40247e5..acc5c70 100644
--- a/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/SandboxedSdkUiTest.kt
+++ b/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/SandboxedSdkUiTest.kt
@@ -73,7 +73,7 @@
     @get:Rule val composeTestRule = createAndroidComposeRule<UiLibComposeActivity>()
     private var testSandboxedUiAdapter by mutableStateOf(TestSandboxedUiAdapter())
     private var eventListener by mutableStateOf(TestEventListener())
-    private var providerUiOnTop by mutableStateOf(false)
+    private var providerUiOnTop by mutableStateOf(true)
     private var signalOptions = setOf(SandboxedUiAdapterSignalOptions.GEOMETRY)
     private var size by mutableStateOf(20.dp)
     private lateinit var uiDevice: UiDevice
@@ -82,7 +82,7 @@
     fun setup() {
         testSandboxedUiAdapter = TestSandboxedUiAdapter(signalOptions)
         eventListener = TestEventListener()
-        providerUiOnTop = false
+        providerUiOnTop = true
         uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
     }
 
@@ -155,16 +155,18 @@
         testSandboxedUiAdapter.assertSessionOpened()
         val session = testSandboxedUiAdapter.testSession
         assertThat(session?.zOrderChangedLatch?.await(TIMEOUT, TimeUnit.MILLISECONDS)).isFalse()
-        assertThat(testSandboxedUiAdapter.isZOrderOnTop).isFalse()
-        providerUiOnTop = true
-        composeTestRule.waitForIdle()
-        assertThat(session?.zOrderChangedLatch?.await(TIMEOUT, TimeUnit.MILLISECONDS)).isTrue()
         assertThat(testSandboxedUiAdapter.isZOrderOnTop).isTrue()
-        session?.zOrderChangedLatch = CountDownLatch(1)
+        // When state changes to false, the provider should be notified.
         providerUiOnTop = false
         composeTestRule.waitForIdle()
         assertThat(session?.zOrderChangedLatch?.await(TIMEOUT, TimeUnit.MILLISECONDS)).isTrue()
         assertThat(testSandboxedUiAdapter.isZOrderOnTop).isFalse()
+        // When state changes back to true, the provider should be notified.
+        session?.zOrderChangedLatch = CountDownLatch(1)
+        providerUiOnTop = true
+        composeTestRule.waitForIdle()
+        assertThat(session?.zOrderChangedLatch?.await(TIMEOUT, TimeUnit.MILLISECONDS)).isTrue()
+        assertThat(testSandboxedUiAdapter.isZOrderOnTop).isTrue()
     }
 
     @Test
@@ -183,7 +185,7 @@
         testSandboxedUiAdapter.delayOpenSessionCallback = true
         addNodeToLayout()
         testSandboxedUiAdapter.assertSessionOpened()
-        providerUiOnTop = true
+        providerUiOnTop = false
         composeTestRule.waitForIdle()
         val session = testSandboxedUiAdapter.testSession!!
         assertThat(session.zOrderChangedLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)).isFalse()
@@ -191,7 +193,7 @@
         // After session has opened, the pending Z order changed made while loading is notified
         // to the session.
         assertThat(session.zOrderChangedLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)).isTrue()
-        assertThat(testSandboxedUiAdapter.isZOrderOnTop).isTrue()
+        assertThat(testSandboxedUiAdapter.isZOrderOnTop).isFalse()
     }
 
     @Test
diff --git a/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/SandboxedSdkViewTest.kt b/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/SandboxedSdkViewTest.kt
index 5a3c620..9da70a8 100644
--- a/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/SandboxedSdkViewTest.kt
+++ b/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/SandboxedSdkViewTest.kt
@@ -178,14 +178,16 @@
         val session = testSandboxedUiAdapter.testSession!!
         val adapter = testSandboxedUiAdapter
         assertThat(session.zOrderChangedLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)).isFalse()
-        assertThat(adapter.isZOrderOnTop).isFalse()
-        view.orderProviderUiAboveClientUi(true)
-        assertThat(session.zOrderChangedLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)).isTrue()
         assertThat(adapter.isZOrderOnTop).isTrue()
-        session.zOrderChangedLatch = CountDownLatch(1)
+        // When state changes to false, the provider should be notified.
         view.orderProviderUiAboveClientUi(false)
         assertThat(session.zOrderChangedLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)).isTrue()
         assertThat(adapter.isZOrderOnTop).isFalse()
+        // When state changes back to true, the provider should be notified.
+        session.zOrderChangedLatch = CountDownLatch(1)
+        view.orderProviderUiAboveClientUi(true)
+        assertThat(session.zOrderChangedLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)).isTrue()
+        assertThat(adapter.isZOrderOnTop).isTrue()
     }
 
     @Test
@@ -195,12 +197,12 @@
         testSandboxedUiAdapter.assertSessionOpened()
         val session = testSandboxedUiAdapter.testSession!!
         val adapter = testSandboxedUiAdapter
-        assertThat(adapter.isZOrderOnTop).isFalse()
+        assertThat(adapter.isZOrderOnTop).isTrue()
         // When Z-order state is unchanged, the provider should not be notified.
         session.zOrderChangedLatch = CountDownLatch(1)
-        view.orderProviderUiAboveClientUi(false)
+        view.orderProviderUiAboveClientUi(true)
         assertThat(session.zOrderChangedLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)).isFalse()
-        assertThat(adapter.isZOrderOnTop).isFalse()
+        assertThat(adapter.isZOrderOnTop).isTrue()
     }
 
     @Test
@@ -219,14 +221,14 @@
         testSandboxedUiAdapter.delayOpenSessionCallback = true
         addViewToLayout()
         testSandboxedUiAdapter.assertSessionOpened()
-        view.orderProviderUiAboveClientUi(true)
+        view.orderProviderUiAboveClientUi(false)
         val session = testSandboxedUiAdapter.testSession!!
         assertThat(session.zOrderChangedLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)).isFalse()
         activityScenarioRule.withActivity { testSandboxedUiAdapter.sendOnSessionOpened() }
         // After session has opened, the pending Z order changed made while loading is notified
         // th the session.
         assertThat(session.zOrderChangedLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)).isTrue()
-        assertThat(testSandboxedUiAdapter.isZOrderOnTop).isTrue()
+        assertThat(testSandboxedUiAdapter.isZOrderOnTop).isFalse()
     }
 
     @Test
diff --git a/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/TestSandboxedUiAdapter.kt b/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/TestSandboxedUiAdapter.kt
index fc8cc93..069aa63 100644
--- a/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/TestSandboxedUiAdapter.kt
+++ b/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/TestSandboxedUiAdapter.kt
@@ -40,7 +40,7 @@
     var isSessionOpened = false
     var internalClient: SandboxedUiAdapter.SessionClient? = null
     var testSession: TestSession? = null
-    var isZOrderOnTop = false
+    var isZOrderOnTop = true
     var sessionData: SessionData? = null
 
     // When set to true, the onSessionOpened callback will only be invoked when specified
diff --git a/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/ContentView.kt b/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/ContentView.kt
deleted file mode 100644
index 69751c2..0000000
--- a/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/ContentView.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.ui.client
-
-import android.content.Context
-import android.os.Handler
-import android.view.MotionEvent
-import android.view.SurfaceView
-import android.view.animation.AnimationUtils
-import androidx.privacysandbox.ui.core.IMotionEventTransferCallback
-import androidx.privacysandbox.ui.core.IRemoteSessionController
-
-/**
- * Custom implementation of the [android.view.SurfaceView] that holds the
- * [android.view.SurfaceControlViewHost.SurfacePackage] passed from the provider. It transfers the
- * [android.view.MotionEvent] objects received in [android.view.View.onTouchEvent] to the provider.
- * It also proxy calls to [android.view.ViewParent.requestDisallowInterceptTouchEvent] from provider
- * side to the parent [android.view.View].
- */
-internal class ContentView(
-    context: Context,
-    val remoteSessionController: IRemoteSessionController
-) : SurfaceView(context) {
-    private var currentGestureMotionEventTransferCallback: IMotionEventTransferCallback? = null
-    private var requestDisallowInterceptHandler: Handler? = null
-
-    override fun onAttachedToWindow() {
-        requestDisallowInterceptHandler = Handler(handler.looper)
-        super.onAttachedToWindow()
-    }
-
-    override fun onDetachedFromWindow() {
-        // Remove all handler posted messages.
-        requestDisallowInterceptHandler?.removeCallbacksAndMessages(/* token */ null)
-        requestDisallowInterceptHandler = null
-        super.onDetachedFromWindow()
-    }
-
-    override fun onTouchEvent(motionEvent: MotionEvent): Boolean {
-        if (motionEvent.action == MotionEvent.ACTION_DOWN) {
-            currentGestureMotionEventTransferCallback = MotionEventTransferCallbackProxy()
-        }
-
-        if (
-            (motionEvent.action == MotionEvent.ACTION_UP ||
-                motionEvent.action == MotionEvent.ACTION_CANCEL)
-        ) {
-            currentGestureMotionEventTransferCallback = null
-        }
-
-        val eventTargetFrameTime = AnimationUtils.currentAnimationTimeMillis()
-        remoteSessionController.notifyMotionEvent(
-            motionEvent,
-            eventTargetFrameTime,
-            currentGestureMotionEventTransferCallback
-        )
-        return true
-    }
-
-    inner class MotionEventTransferCallbackProxy() : IMotionEventTransferCallback.Stub() {
-        override fun requestDisallowIntercept(disallowIntercept: Boolean) {
-            requestDisallowInterceptHandler?.post {
-                if (this == currentGestureMotionEventTransferCallback) {
-                    parent.requestDisallowInterceptTouchEvent(disallowIntercept)
-                }
-            }
-        }
-    }
-}
diff --git a/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/SandboxedUiAdapterFactory.kt b/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/SandboxedUiAdapterFactory.kt
index 59a8582..e233bd1 100644
--- a/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/SandboxedUiAdapterFactory.kt
+++ b/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/SandboxedUiAdapterFactory.kt
@@ -25,6 +25,7 @@
 import android.util.Log
 import android.view.Display
 import android.view.SurfaceControlViewHost
+import android.view.SurfaceView
 import android.view.View
 import android.window.SurfaceSyncGroup
 import androidx.annotation.RequiresApi
@@ -320,7 +321,7 @@
             val clientExecutor: Executor
         ) : IRemoteSessionClient.Stub() {
 
-            lateinit var contentView: ContentView
+            lateinit var surfaceView: SurfaceView
 
             override fun onRemoteSessionOpened(
                 surfacePackage: SurfaceControlViewHost.SurfacePackage,
@@ -328,10 +329,10 @@
                 isZOrderOnTop: Boolean,
                 signalOptions: List<String>
             ) {
-                contentView = ContentView(context, remoteSessionController)
-                contentView.setChildSurfacePackage(surfacePackage)
-                contentView.setZOrderOnTop(isZOrderOnTop)
-                contentView.addOnAttachStateChangeListener(
+                surfaceView = SurfaceView(context)
+                surfaceView.setChildSurfacePackage(surfacePackage)
+                surfaceView.setZOrderOnTop(isZOrderOnTop)
+                surfaceView.addOnAttachStateChangeListener(
                     object : View.OnAttachStateChangeListener {
 
                         private var hasViewBeenPreviouslyAttached = false
@@ -353,7 +354,7 @@
                 clientExecutor.execute {
                     client.onSessionOpened(
                         SessionImpl(
-                            contentView,
+                            surfaceView,
                             remoteSessionController,
                             surfacePackage,
                             signalOptions.toSet()
@@ -374,18 +375,18 @@
             }
 
             override fun onSessionUiFetched(surfacePackage: SurfaceControlViewHost.SurfacePackage) {
-                contentView.setChildSurfacePackage(surfacePackage)
+                surfaceView.setChildSurfacePackage(surfacePackage)
             }
         }
 
         private class SessionImpl(
-            val contentView: ContentView,
+            val surfaceView: SurfaceView,
             val remoteSessionController: IRemoteSessionController,
             val surfacePackage: SurfaceControlViewHost.SurfacePackage,
             override val signalOptions: Set<String>
         ) : SandboxedUiAdapter.Session {
 
-            override val view: View = contentView
+            override val view: View = surfaceView
 
             override fun notifyConfigurationChanged(configuration: Configuration) {
                 tryToCallRemoteObject(remoteSessionController) {
@@ -395,10 +396,10 @@
 
             override fun notifyResized(width: Int, height: Int) {
 
-                val parentView = contentView.parent as View
+                val parentView = surfaceView.parent as View
 
                 val clientResizeRunnable = Runnable {
-                    contentView.layout(
+                    surfaceView.layout(
                         /* left = */ parentView.paddingLeft,
                         /* top = */ parentView.paddingTop,
                         /* right = */ parentView.paddingLeft + width,
@@ -414,13 +415,13 @@
 
                 val syncGroup = SurfaceSyncGroup("AppAndSdkViewsSurfaceSync")
 
-                syncGroup.add(contentView.rootSurfaceControl, clientResizeRunnable)
+                syncGroup.add(surfaceView.rootSurfaceControl, clientResizeRunnable)
                 syncGroup.add(surfacePackage, providerResizeRunnable)
                 syncGroup.markSyncReady()
             }
 
             override fun notifyZOrderChanged(isZOrderOnTop: Boolean) {
-                contentView.setZOrderOnTop(isZOrderOnTop)
+                surfaceView.setZOrderOnTop(isZOrderOnTop)
                 tryToCallRemoteObject(remoteSessionController) {
                     this.notifyZOrderChanged(isZOrderOnTop)
                 }
diff --git a/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/view/SandboxedSdkUi.kt b/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/view/SandboxedSdkUi.kt
index 645e19d..1a1b137 100644
--- a/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/view/SandboxedSdkUi.kt
+++ b/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/view/SandboxedSdkUi.kt
@@ -36,7 +36,7 @@
 fun SandboxedSdkUi(
     sandboxedUiAdapter: SandboxedUiAdapter,
     modifier: Modifier = Modifier,
-    providerUiOnTop: Boolean = false,
+    providerUiOnTop: Boolean = true,
     sandboxedSdkViewEventListener: SandboxedSdkViewEventListener? = null
 ) {
     AndroidView(
diff --git a/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/view/SandboxedSdkView.kt b/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/view/SandboxedSdkView.kt
index d4453b1..406cd99 100644
--- a/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/view/SandboxedSdkView.kt
+++ b/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/view/SandboxedSdkView.kt
@@ -79,7 +79,7 @@
     private var adapter: SandboxedUiAdapter? = null
     private var client: Client? = null
     private var clientSecondary: Client? = null
-    private var isZOrderOnTop = false
+    private var isZOrderOnTop = true
     private var contentView: View? = null
     private var refreshCallback: Consumer<Boolean>? = null
     private var requestedWidth = -1
@@ -119,9 +119,9 @@
      * Sets the Z-ordering of the [SandboxedSdkView]'s surface, relative to its window.
      *
      * When [providerUiOnTop] is true, every [android.view.MotionEvent] on the [SandboxedSdkView]
-     * area will be sent to the UI provider. When [providerUiOnTop] is false, every
-     * [android.view.MotionEvent] will be sent to the client and will also be transferred to the UI
-     * provider. By default, [providerUiOnTop] is false.
+     * will be sent to the UI provider. When [providerUiOnTop] is false, every
+     * [android.view.MotionEvent] will be sent to the client. By default, motion events are sent to
+     * the UI provider.
      *
      * When [providerUiOnTop] is true, the UI provider's surface will be placed above the client's
      * window. In this case, none of the contents of the client's window beneath the provider's
diff --git a/privacysandbox/ui/ui-core/src/main/aidl/androidx/privacysandbox/ui/core/IMotionEventTransferCallback.aidl b/privacysandbox/ui/ui-core/src/main/aidl/androidx/privacysandbox/ui/core/IMotionEventTransferCallback.aidl
deleted file mode 100644
index 4caf175..0000000
--- a/privacysandbox/ui/ui-core/src/main/aidl/androidx/privacysandbox/ui/core/IMotionEventTransferCallback.aidl
+++ /dev/null
@@ -1,24 +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.privacysandbox.ui.core;
-
-import android.view.MotionEvent;
-
-@JavaPassthrough(annotation="@androidx.annotation.RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY)")
-interface IMotionEventTransferCallback {
-    oneway void requestDisallowIntercept(boolean disallowIntercept);
-}
\ No newline at end of file
diff --git a/privacysandbox/ui/ui-core/src/main/aidl/androidx/privacysandbox/ui/core/IRemoteSessionController.aidl b/privacysandbox/ui/ui-core/src/main/aidl/androidx/privacysandbox/ui/core/IRemoteSessionController.aidl
index 905df5e..3510368 100644
--- a/privacysandbox/ui/ui-core/src/main/aidl/androidx/privacysandbox/ui/core/IRemoteSessionController.aidl
+++ b/privacysandbox/ui/ui-core/src/main/aidl/androidx/privacysandbox/ui/core/IRemoteSessionController.aidl
@@ -16,8 +16,6 @@
 
 package androidx.privacysandbox.ui.core;
 
-import androidx.privacysandbox.ui.core.IMotionEventTransferCallback;
-
 @JavaPassthrough(annotation="@androidx.annotation.RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY)")
 oneway interface IRemoteSessionController {
     void close();
@@ -27,5 +25,4 @@
     void notifyFetchUiForSession();
     void notifyUiChanged(in Bundle uiContainerInfo);
     void notifySessionRendered(in List<String> supportedSignalOptions);
-    void notifyMotionEvent(in MotionEvent motionEvent, in long eventTargetFrameTime, in @nullable IMotionEventTransferCallback eventTransferCallback);
 }
\ No newline at end of file
diff --git a/privacysandbox/ui/ui-provider/src/androidTest/kotlin/androidx/privacysandbox/ui/provider/test/BinderAdapterDelegateTest.kt b/privacysandbox/ui/ui-provider/src/androidTest/kotlin/androidx/privacysandbox/ui/provider/test/BinderAdapterDelegateTest.kt
new file mode 100644
index 0000000..caec996
--- /dev/null
+++ b/privacysandbox/ui/ui-provider/src/androidTest/kotlin/androidx/privacysandbox/ui/provider/test/BinderAdapterDelegateTest.kt
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.privacysandbox.ui.provider.test
+
+import android.content.Context
+import android.os.Binder
+import android.os.Build
+import android.os.IBinder
+import android.view.Display
+import android.view.MotionEvent
+import android.view.SurfaceControlViewHost
+import android.view.View
+import android.widget.LinearLayout
+import androidx.privacysandbox.ui.provider.TouchFocusTransferringView
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.action.ViewActions.slowSwipeLeft
+import androidx.test.espresso.action.ViewActions.swipeLeft
+import androidx.test.espresso.action.ViewActions.swipeUp
+import androidx.test.espresso.matcher.ViewMatchers.withId
+import androidx.test.espresso.matcher.ViewMatchers.withParent
+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.test.uiautomator.UiDevice
+import androidx.test.uiautomator.UiScrollable
+import androidx.test.uiautomator.UiSelector
+import androidx.testutils.withActivity
+import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+@RunWith(AndroidJUnit4::class)
+@LargeTest
+class BinderAdapterDelegateTest {
+    companion object {
+        const val TIMEOUT_MILLIS: Long = 2000
+        const val WIDTH = 500
+        const val HEIGHT = 500
+        const val MAIN_LAYOUT_RES = "androidx.privacysandbox.ui.provider.test:id/main_layout"
+    }
+
+    @get:Rule val activityScenarioRule = ActivityScenarioRule(MainActivity::class.java)
+
+    private val transferTouchFocusLatch = CountDownLatch(1)
+
+    @Before
+    fun setUp() {
+        val context = InstrumentationRegistry.getInstrumentation().targetContext
+        val activity = activityScenarioRule.withActivity { this }
+        UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+        activityScenarioRule.withActivity {
+            val surfaceControlViewHost =
+                GestureTransferringSurfaceControlViewHost(
+                    activity,
+                    activity.display!!,
+                    Binder(),
+                    transferTouchFocusLatch
+                )
+            val touchFocusTransferringView =
+                TouchFocusTransferringView(context, surfaceControlViewHost)
+            touchFocusTransferringView.addView(TestView(context))
+            activity
+                .findViewById<LinearLayout>(R.id.main_layout)
+                .addView(touchFocusTransferringView, WIDTH, HEIGHT)
+        }
+    }
+
+    @Test
+    fun touchFocusTransferredForSwipeUp() {
+        onView(withParent(withId(R.id.main_layout))).perform(swipeUp())
+        assertThat(transferTouchFocusLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)).isTrue()
+    }
+
+    @Test
+    fun touchFocusNotTransferredForSwipeLeft() {
+        onView(withParent(withId(R.id.main_layout))).perform(swipeLeft())
+        assertThat(transferTouchFocusLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)).isFalse()
+    }
+
+    @Test
+    fun touchFocusNotTransferredForSlowSwipeLeft() {
+        onView(withParent(withId(R.id.main_layout))).perform(slowSwipeLeft())
+        assertThat(transferTouchFocusLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)).isFalse()
+    }
+
+    @Test
+    fun touchFocusNotTransferredForClicks() {
+        onView(withParent(withId(R.id.main_layout))).perform(click())
+        assertThat(transferTouchFocusLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)).isFalse()
+    }
+
+    @Test
+    fun touchFocusTransferredForFlingForward() {
+        val parentSelector = UiSelector().resourceId(MAIN_LAYOUT_RES)
+        val testView = UiScrollable(parentSelector.childSelector(UiSelector().index(0)))
+        testView.flingForward()
+        assertThat(transferTouchFocusLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)).isTrue()
+    }
+
+    @Test
+    fun touchFocusTransferredForFlingBackward() {
+        val parentSelector = UiSelector().resourceId(MAIN_LAYOUT_RES)
+        val testView = UiScrollable(parentSelector.childSelector(UiSelector().index(0)))
+        testView.flingBackward()
+        assertThat(transferTouchFocusLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)).isTrue()
+    }
+
+    /**
+     * SCVH that takes note of when touch focus is transferred.
+     *
+     * TODO(b/290629538): Add full integration test.
+     */
+    private class GestureTransferringSurfaceControlViewHost(
+        context: Context,
+        display: Display,
+        hostToken: IBinder,
+        countDownLatch: CountDownLatch
+    ) : SurfaceControlViewHost(context, display, hostToken) {
+
+        val latch = countDownLatch
+
+        override fun transferTouchGestureToHost(): Boolean {
+            latch.countDown()
+            return true
+        }
+    }
+
+    private class TestView(context: Context) : View(context) {
+        override fun onTouchEvent(event: MotionEvent?): Boolean {
+            return true
+        }
+    }
+}
diff --git a/privacysandbox/ui/ui-provider/src/androidTest/kotlin/androidx/privacysandbox/ui/provider/test/ProviderViewWrapperTest.kt b/privacysandbox/ui/ui-provider/src/androidTest/kotlin/androidx/privacysandbox/ui/provider/test/ProviderViewWrapperTest.kt
deleted file mode 100644
index 5d1b96f..0000000
--- a/privacysandbox/ui/ui-provider/src/androidTest/kotlin/androidx/privacysandbox/ui/provider/test/ProviderViewWrapperTest.kt
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.ui.provider.test
-
-import android.os.Build
-import android.os.Handler
-import android.os.Looper
-import android.os.SystemClock
-import android.view.MotionEvent
-import android.view.View
-import android.widget.FrameLayout
-import androidx.annotation.RequiresApi
-import androidx.privacysandbox.ui.core.IMotionEventTransferCallback
-import androidx.privacysandbox.ui.provider.ProviderViewWrapper
-import androidx.test.ext.junit.rules.ActivityScenarioRule
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.LargeTest
-import com.google.common.truth.Truth.assertThat
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
-import org.junit.Assert.assertTrue
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
-@RunWith(AndroidJUnit4::class)
-@LargeTest
-class ProviderViewWrapperTest {
-    companion object {
-        const val TIMEOUT_MILLIS: Long = 2000
-        const val VSYNC_INTERVAL_MS: Long = 100
-        const val WIDTH = 500
-        const val HEIGHT = 500
-    }
-
-    @get:Rule val activityRule = ActivityScenarioRule(MainActivity::class.java)
-
-    private lateinit var mainHandler: Handler
-    private lateinit var providerViewWrapper: ProviderViewWrapper
-    private lateinit var providerView: View
-    private var dispatchedEventsSinceLastFrame = 0
-    private lateinit var motionEventTransferCallback: MotionEventTransferCallbackProxy
-
-    @Before
-    fun setup() {
-        activityRule.scenario.onActivity { activity ->
-            mainHandler = Handler(Looper.getMainLooper())
-            providerViewWrapper = ProviderViewWrapper(activity)
-            providerView = View(activity)
-            providerView.layoutParams = FrameLayout.LayoutParams(WIDTH, HEIGHT)
-            providerViewWrapper.addView(providerView)
-            activity.setContentView(providerViewWrapper)
-            setUpOnTouchListener()
-        }
-        motionEventTransferCallback = MotionEventTransferCallbackProxy()
-    }
-
-    @Test
-    fun processingOfMotionEventsWillNotScheduledIfProviderViewDetachedTest() {
-        // Closing the activity, detaching the View.
-        activityRule.scenario.close()
-
-        val frameTimes = simulateFrameTimes(/* frames */ 3)
-
-        val events = createGestureEvents(/* moveEventNumbers */ 1)
-        val eventTargetTimesRelativeToFrames =
-            listOf<Long>(
-                VSYNC_INTERVAL_MS / 2, // (vsync_interval / 2) after frame1
-                0, // at frame2 time
-                -(VSYNC_INTERVAL_MS / 2) // (vsync_interval / 2) before frame3
-            )
-        simulateSchedulingEventDispatchingMessages(
-            events,
-            frameTimes,
-            eventTargetTimesRelativeToFrames
-        )
-
-        val expectedEventsPerFrame = listOf<Long>(0, 0, 0)
-        assertNumberOfDispatchedEventsOnSimulateFrameTimes(frameTimes, expectedEventsPerFrame)
-    }
-
-    @Test
-    fun removePendingMotionEventDispatchMessagesIfViewIsDetachedTest() {
-        val frameTimes = simulateFrameTimes(/* frames */ 3)
-
-        val events = createGestureEvents(/* moveEventNumbers */ 1)
-        val eventTargetTimesRelativeToFrames =
-            listOf<Long>(
-                VSYNC_INTERVAL_MS / 2, // (vsync_interval / 2) after frame1
-                0, // at frame2 time
-                -(VSYNC_INTERVAL_MS / 2) // (vsync_interval / 2) before frame3
-            )
-        simulateSchedulingEventDispatchingMessages(
-            events,
-            frameTimes,
-            eventTargetTimesRelativeToFrames
-        )
-
-        activityRule.scenario.close()
-
-        val expectedEventsPerFrame = listOf<Long>(0, 0, 0)
-        assertNumberOfDispatchedEventsOnSimulateFrameTimes(frameTimes, expectedEventsPerFrame)
-    }
-
-    @Test
-    fun processMotionEventsTargetingNextFrameTest() {
-        val frameTimes = simulateFrameTimes(/* frames */ 5)
-
-        // To simulate real scenarios, setting DOWN, UP and last MOVE as unbuffered events, and
-        // send them randomly between frames.
-        val events = createGestureEvents(/* moveEventNumbers */ 3)
-        val eventTargetTimesRelativeToFrames =
-            listOf<Long>(
-                VSYNC_INTERVAL_MS / 2, // (vsync_interval / 2) after frame1
-                0, // at frame2 time
-                0, // at frame3 time
-                -(VSYNC_INTERVAL_MS / 2), // (vsync_interval / 2) before frame4
-                -(VSYNC_INTERVAL_MS / 2) // (vsync_interval / 2) before frame5
-            )
-
-        simulateSchedulingEventDispatchingMessages(
-            events,
-            frameTimes,
-            eventTargetTimesRelativeToFrames
-        )
-
-        val expectedEventsPerFrame = listOf<Long>(0, 1, 1, 2, 1)
-        assertNumberOfDispatchedEventsOnSimulateFrameTimes(frameTimes, expectedEventsPerFrame)
-    }
-
-    @Test
-    fun requestDisallowInterceptTest() {
-        assertThat(motionEventTransferCallback.lastValueForDisallowIntercept).isFalse()
-
-        val downEvent = createMotionEvent(MotionEvent.ACTION_DOWN)
-        scheduleAndWaitForMotionEventProcessing(downEvent, motionEventTransferCallback)
-
-        activityRule.scenario.onActivity { _ ->
-            providerViewWrapper.requestDisallowInterceptTouchEvent(true)
-        }
-        assertThat(motionEventTransferCallback.lastValueForDisallowIntercept).isTrue()
-
-        activityRule.scenario.onActivity { _ ->
-            providerView.parent.requestDisallowInterceptTouchEvent(false)
-        }
-        assertThat(motionEventTransferCallback.lastValueForDisallowIntercept).isFalse()
-    }
-
-    @Test
-    fun requestDisallowInterceptOnlyCalledOnLastTransferredCallbackTest() {
-        val eventTransferCallback1 = MotionEventTransferCallbackProxy()
-        val eventTransferCallback2 = MotionEventTransferCallbackProxy()
-        assertThat(eventTransferCallback1.lastValueForDisallowIntercept).isFalse()
-        assertThat(eventTransferCallback2.lastValueForDisallowIntercept).isFalse()
-
-        val downEvent1 = createMotionEvent(MotionEvent.ACTION_DOWN)
-        scheduleAndWaitForMotionEventProcessing(downEvent1, eventTransferCallback1)
-        val downEvent2 = createMotionEvent(MotionEvent.ACTION_DOWN)
-        scheduleAndWaitForMotionEventProcessing(downEvent2, eventTransferCallback2)
-
-        activityRule.scenario.onActivity { _ ->
-            providerView.parent.requestDisallowInterceptTouchEvent(true)
-        }
-        assertThat(eventTransferCallback1.lastValueForDisallowIntercept).isFalse()
-        assertThat(eventTransferCallback2.lastValueForDisallowIntercept).isTrue()
-    }
-
-    @Test
-    fun requestDisallowInterceptWillOnlyProxiedOnChangeValueTest() {
-        assertThat(motionEventTransferCallback.lastValueForDisallowIntercept).isFalse()
-        assertThat(motionEventTransferCallback.numberOfRequestDisallowInterceptCalls).isEqualTo(0)
-
-        val downEvent1 = createMotionEvent(MotionEvent.ACTION_DOWN)
-        scheduleAndWaitForMotionEventProcessing(downEvent1, motionEventTransferCallback)
-
-        activityRule.scenario.onActivity { _ ->
-            providerView.parent.requestDisallowInterceptTouchEvent(false)
-        }
-        assertThat(motionEventTransferCallback.lastValueForDisallowIntercept).isFalse()
-        assertThat(motionEventTransferCallback.numberOfRequestDisallowInterceptCalls).isEqualTo(0)
-
-        activityRule.scenario.onActivity { _ ->
-            providerView.parent.requestDisallowInterceptTouchEvent(true)
-        }
-        assertThat(motionEventTransferCallback.lastValueForDisallowIntercept).isTrue()
-        assertThat(motionEventTransferCallback.numberOfRequestDisallowInterceptCalls).isEqualTo(1)
-
-        activityRule.scenario.onActivity { _ ->
-            providerView.parent.requestDisallowInterceptTouchEvent(true)
-        }
-        assertThat(motionEventTransferCallback.lastValueForDisallowIntercept).isTrue()
-        assertThat(motionEventTransferCallback.numberOfRequestDisallowInterceptCalls).isEqualTo(1)
-    }
-
-    @Test
-    fun cachingLastValueOfRequestDisallowInterceptShouldResetForNewGestureTest() {
-        assertThat(motionEventTransferCallback.lastValueForDisallowIntercept).isFalse()
-        assertThat(motionEventTransferCallback.numberOfRequestDisallowInterceptCalls).isEqualTo(0)
-
-        val downEvent1 = createMotionEvent(MotionEvent.ACTION_DOWN)
-        scheduleAndWaitForMotionEventProcessing(downEvent1, motionEventTransferCallback)
-
-        activityRule.scenario.onActivity { _ ->
-            providerView.parent.requestDisallowInterceptTouchEvent(true)
-        }
-        assertThat(motionEventTransferCallback.lastValueForDisallowIntercept).isTrue()
-        assertThat(motionEventTransferCallback.numberOfRequestDisallowInterceptCalls).isEqualTo(1)
-
-        val downEvent2 = createMotionEvent(MotionEvent.ACTION_DOWN)
-        scheduleAndWaitForMotionEventProcessing(downEvent2, motionEventTransferCallback)
-        // Calling requestDisallowIntercept with false, will have no effect for the new gesture.
-        activityRule.scenario.onActivity { _ ->
-            providerView.parent.requestDisallowInterceptTouchEvent(false)
-        }
-        assertThat(motionEventTransferCallback.lastValueForDisallowIntercept).isTrue()
-        assertThat(motionEventTransferCallback.numberOfRequestDisallowInterceptCalls).isEqualTo(1)
-
-        activityRule.scenario.onActivity { _ ->
-            providerView.parent.requestDisallowInterceptTouchEvent(true)
-        }
-        assertThat(motionEventTransferCallback.lastValueForDisallowIntercept).isTrue()
-        assertThat(motionEventTransferCallback.numberOfRequestDisallowInterceptCalls).isEqualTo(2)
-    }
-
-    private fun setUpOnTouchListener() {
-        providerView.setOnTouchListener { _, _ ->
-            dispatchedEventsSinceLastFrame++
-            true
-        }
-    }
-
-    private fun simulateFrameTimes(frames: Int): List<Long> {
-        val firstFrameTime = SystemClock.uptimeMillis() + VSYNC_INTERVAL_MS
-        return List(frames) { index -> firstFrameTime + (index * VSYNC_INTERVAL_MS) }
-    }
-
-    private fun createGestureEvents(moveEventNumbers: Int): List<MotionEvent> {
-        val events: MutableList<MotionEvent> = mutableListOf()
-        events.add(createMotionEvent(MotionEvent.ACTION_DOWN))
-        repeat(moveEventNumbers) { events.add(createMotionEvent(MotionEvent.ACTION_MOVE)) }
-        events.add(createMotionEvent(MotionEvent.ACTION_UP))
-        return events
-    }
-
-    private fun createMotionEvent(motionEventAction: Int): MotionEvent {
-        return MotionEvent.obtain(
-            SystemClock.uptimeMillis(),
-            SystemClock.uptimeMillis(),
-            motionEventAction,
-            providerView.width / 2f,
-            providerView.width / 2f,
-            /* metaState = */ 0
-        )
-    }
-
-    private fun simulateSchedulingEventDispatchingMessages(
-        events: List<MotionEvent>,
-        frameTimes: List<Long>,
-        eventTargetTimesRelativeToFrames: List<Long>
-    ) {
-        val eventTargetTime =
-            eventTargetTimesRelativeToFrames.withIndex().map { (index, value) ->
-                frameTimes[index] + value
-            }
-
-        for (i in 0 until events.size) {
-            providerViewWrapper.scheduleMotionEventProcessing(
-                events[i],
-                eventTargetTime[i],
-                motionEventTransferCallback
-            )
-        }
-    }
-
-    private fun assertNumberOfDispatchedEventsOnSimulateFrameTimes(
-        frameTimes: List<Long>,
-        expectedDispatchedEventsPerFrame: List<Long>
-    ) {
-        val allFramesPassedLatch = CountDownLatch(frameTimes.size)
-        // Simulating doFrame at the frame times.
-        for (i in 0 until frameTimes.size) {
-            mainHandler.postAtTime(
-                {
-                    assertThat(dispatchedEventsSinceLastFrame)
-                        .isEqualTo(expectedDispatchedEventsPerFrame[i])
-                    dispatchedEventsSinceLastFrame = 0
-                    allFramesPassedLatch.countDown()
-                },
-                frameTimes[i]
-            )
-        }
-        assertTrue(
-            "Timeout before passing all frames",
-            allFramesPassedLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
-        )
-    }
-
-    fun scheduleAndWaitForMotionEventProcessing(
-        motionEvent: MotionEvent,
-        eventTransferCallback: MotionEventTransferCallbackProxy
-    ) {
-        val eventDispatchLatch = CountDownLatch(1)
-        activityRule.scenario.onActivity { _ ->
-            providerView.setOnTouchListener { _, event ->
-                eventDispatchLatch.countDown()
-                providerView.onTouchEvent(event)
-                true
-            }
-        }
-        providerViewWrapper.scheduleMotionEventProcessing(
-            motionEvent,
-            motionEvent.eventTime,
-            eventTransferCallback
-        )
-        assertTrue(
-            "dispatchTouchEvent on providerView was not called within the timeout",
-            eventDispatchLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
-        )
-    }
-
-    class MotionEventTransferCallbackProxy : IMotionEventTransferCallback.Stub() {
-        var lastValueForDisallowIntercept = false
-        var numberOfRequestDisallowInterceptCalls = 0
-
-        override fun requestDisallowIntercept(disallowIntercept: Boolean) {
-            lastValueForDisallowIntercept = disallowIntercept
-            numberOfRequestDisallowInterceptCalls++
-        }
-    }
-}
diff --git a/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/BinderAdapterDelegate.kt b/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/BinderAdapterDelegate.kt
index 99fc949..19a9fdbf 100644
--- a/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/BinderAdapterDelegate.kt
+++ b/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/BinderAdapterDelegate.kt
@@ -26,7 +26,6 @@
 import android.os.Looper
 import android.util.Log
 import android.view.Display
-import android.view.MotionEvent
 import android.view.SurfaceControlViewHost
 import android.view.View
 import androidx.annotation.RequiresApi
@@ -36,7 +35,6 @@
 import androidx.privacysandbox.ui.core.IDelegateChangeListener
 import androidx.privacysandbox.ui.core.IDelegatingSandboxedUiAdapter
 import androidx.privacysandbox.ui.core.IDelegatorCallback
-import androidx.privacysandbox.ui.core.IMotionEventTransferCallback
 import androidx.privacysandbox.ui.core.IRemoteSessionClient
 import androidx.privacysandbox.ui.core.IRemoteSessionController
 import androidx.privacysandbox.ui.core.ISandboxedUiAdapter
@@ -245,7 +243,7 @@
 
     @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
     private class SessionClientProxy(
-        private val providerViewWrapper: ProviderViewWrapper,
+        private val touchTransferringView: TouchFocusTransferringView,
         private val surfaceControlViewHost: SurfaceControlViewHost,
         private val isZOrderOnTop: Boolean,
         private val remoteSessionClient: IRemoteSessionClient
@@ -256,16 +254,16 @@
          * step duration and interference with actual openSession() logic (reduce potential delays).
          */
         fun initialize(initialWidth: Int, initialHeight: Int) {
-            surfaceControlViewHost.setView(providerViewWrapper, initialWidth, initialHeight)
+            surfaceControlViewHost.setView(touchTransferringView, initialWidth, initialHeight)
         }
 
         override fun onSessionOpened(session: SandboxedUiAdapter.Session) {
             val view = session.view
 
-            if (providerViewWrapper.childCount > 0) {
-                providerViewWrapper.removeAllViews()
+            if (touchTransferringView.childCount > 0) {
+                touchTransferringView.removeAllViews()
             }
-            providerViewWrapper.addView(view)
+            touchTransferringView.addView(view)
 
             // This var is not locked as it will be set to false by the first event that can trigger
             // sending the remote session opened callback.
@@ -355,18 +353,6 @@
                 session.notifySessionRendered(supportedSignalOptions.toSet())
             }
 
-            override fun notifyMotionEvent(
-                motionEvent: MotionEvent,
-                eventTargetFrameTime: Long,
-                eventTransferCallback: IMotionEventTransferCallback?
-            ) {
-                providerViewWrapper.scheduleMotionEventProcessing(
-                    motionEvent,
-                    eventTargetFrameTime,
-                    eventTransferCallback
-                )
-            }
-
             override fun close() {
                 val mHandler = Handler(Looper.getMainLooper())
                 mHandler.post {
@@ -446,8 +432,10 @@
                 checkNotNull(createSurfaceControlViewHost(displayContext, display, sessionData)) {
                     "Failed to create SurfaceControlViewHost"
                 }
+            val touchTransferringView =
+                TouchFocusTransferringView(displayContext, surfaceControlViewHost)
             return SessionClientProxy(
-                ProviderViewWrapper(displayContext),
+                touchTransferringView,
                 surfaceControlViewHost,
                 isZOrderOnTop,
                 remoteSessionClient
diff --git a/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/ProviderViewWrapper.kt b/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/ProviderViewWrapper.kt
deleted file mode 100644
index 85c8f7c9..0000000
--- a/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/ProviderViewWrapper.kt
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.ui.provider
-
-import android.content.Context
-import android.os.Build
-import android.os.Handler
-import android.os.Message
-import android.view.MotionEvent
-import android.widget.FrameLayout
-import androidx.annotation.RequiresApi
-import androidx.privacysandbox.ui.core.IMotionEventTransferCallback
-
-/**
- * A container [FrameLayout] that wraps the provider content view.
- *
- * It dispatches [MotionEvent] objects passed from the host against the provider view. [MotionEvent]
- * objects passed from the host (accompanied with target frame time) are scheduled to be dispatched
- * on the UiThread with a delay from the target frame time, so any UI impact caused by processing
- * these events will target the following frame.
- *
- * It also proxies the calls of [android.view.ViewParent.requestDisallowInterceptTouchEvent] to the
- * client side.
- */
-@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
-internal class ProviderViewWrapper(context: Context) : FrameLayout(context) {
-    private companion object {
-        // That delay will be used to ensure processing the transferred events after their target
-        // frame time and before the following frame time.
-        const val TRANSFERRED_EVENT_DISPATCH_DELAY_MS = 1
-    }
-
-    private var eventDispatchHandler: Handler? = null
-    private var currentMotionEventCallback: IMotionEventTransferCallback? = null
-    private var lastValueForRequestDisallowIntercept = false
-
-    override fun onAttachedToWindow() {
-        eventDispatchHandler = Handler(handler.looper)
-        super.onAttachedToWindow()
-    }
-
-    override fun onDetachedFromWindow() {
-        /** Remove [eventDispatchHandler] posted messages. */
-        eventDispatchHandler?.removeCallbacksAndMessages(/* token */ null)
-        eventDispatchHandler = null
-        super.onDetachedFromWindow()
-    }
-
-    override fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
-        if (disallowIntercept == lastValueForRequestDisallowIntercept) {
-            return
-        }
-        currentMotionEventCallback?.requestDisallowIntercept(disallowIntercept)
-        lastValueForRequestDisallowIntercept = disallowIntercept
-    }
-
-    fun scheduleMotionEventProcessing(
-        motionEvent: MotionEvent,
-        eventTargetFrameTime: Long,
-        motionEventTransferCallback: IMotionEventTransferCallback?
-    ) {
-        if (eventDispatchHandler == null) {
-            return
-        }
-        val dispatchMessage: Message =
-            Message.obtain(handler) { processMotionEvent(motionEvent, motionEventTransferCallback) }
-        dispatchMessage.isAsynchronous = true
-
-        eventDispatchHandler?.sendMessageAtTime(
-            dispatchMessage,
-            eventTargetFrameTime + TRANSFERRED_EVENT_DISPATCH_DELAY_MS
-        )
-    }
-
-    fun processMotionEvent(
-        motionEvent: MotionEvent,
-        motionEventTransferCallback: IMotionEventTransferCallback?
-    ) {
-        if (motionEvent.action == MotionEvent.ACTION_DOWN) {
-            // Resetting the value of it to false (parent can intercept) for new gestures.
-            lastValueForRequestDisallowIntercept = false
-        }
-        currentMotionEventCallback = motionEventTransferCallback
-        dispatchTouchEvent(motionEvent)
-    }
-}
diff --git a/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/TouchFocusTransferringView.kt b/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/TouchFocusTransferringView.kt
new file mode 100644
index 0000000..d1d55a5
--- /dev/null
+++ b/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/TouchFocusTransferringView.kt
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.privacysandbox.ui.provider
+
+import android.content.Context
+import android.os.Build
+import android.view.GestureDetector
+import android.view.MotionEvent
+import android.view.SurfaceControlViewHost
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import androidx.annotation.RequiresApi
+import kotlin.math.abs
+
+/**
+ * A container [ViewGroup] that delegates touch events to the host or the UI provider.
+ *
+ * Touch events will first be passed to a scroll detector. If a vertical scroll or fling is
+ * detected, the gesture will be transferred to the host. Otherwise, the touch event will pass
+ * through and be handled by the provider of UI.
+ *
+ * TODO(b/286829818): Pass scroll events to the UI provider if it can handle scrolls.
+ */
+@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+internal class TouchFocusTransferringView(
+    context: Context,
+    surfaceControlViewHost: SurfaceControlViewHost
+) : FrameLayout(context) {
+
+    private val scvh: SurfaceControlViewHost = surfaceControlViewHost
+    private val detector = ScrollDetector(context)
+
+    @Suppress("deprecation") // transferTouchGestureToHost needs to be called on U- devices
+    override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
+        detector.onTouchEvent(ev)
+        if (!detector.isScrolling) {
+            return false
+        }
+        detector.reset()
+        return scvh.transferTouchGestureToHost()
+    }
+
+    override fun onTouchEvent(event: MotionEvent): Boolean {
+        // This will only be called if the dispatch of the touch event is intercepted.
+        return true
+    }
+
+    /**
+     * Handles intercepted touch events before they reach the UI provider.
+     *
+     * If a vertical scroll or fling event is caught, this is indicated by the [isScrolling] var.
+     */
+    private class ScrollDetector(context: Context) : GestureDetector.SimpleOnGestureListener() {
+
+        var isScrolling = false
+            private set
+
+        private val gestureDetector = GestureDetector(context, this)
+
+        override fun onScroll(e1: MotionEvent?, e2: MotionEvent, dX: Float, dY: Float): Boolean {
+            // A scroll is vertical if its y displacement is greater than its x displacement.
+            if (abs(dY) > abs(dX)) {
+                isScrolling = true
+                return false
+            }
+            return true
+        }
+
+        override fun onFling(
+            e1: MotionEvent?,
+            e2: MotionEvent,
+            velocityX: Float,
+            velocityY: Float
+        ): Boolean {
+            // A fling is vertical if its y velocity is greater than its x velocity.
+            if (abs(velocityY) > abs(velocityX)) {
+                isScrolling = true
+                return false
+            }
+            return true
+        }
+
+        fun onTouchEvent(ev: MotionEvent) {
+            gestureDetector.onTouchEvent(ev)
+        }
+
+        fun reset() {
+            isScrolling = false
+        }
+    }
+}
diff --git a/savedstate/OWNERS b/savedstate/OWNERS
index a2e56ef..b33056f 100644
--- a/savedstate/OWNERS
+++ b/savedstate/OWNERS
@@ -3,7 +3,6 @@
 clarafok@google.com
 jbwoods@google.com
 mgalhardo@google.com
-kuanyingchou@google.com
 yboyar@google.com
 
 per-file settings.gradle = dustinlam@google.com, rahulrav@google.com
\ No newline at end of file
diff --git a/savedstate/savedstate-samples/build.gradle b/savedstate/savedstate-samples/build.gradle
index cefd8c4..7c46dfe 100644
--- a/savedstate/savedstate-samples/build.gradle
+++ b/savedstate/savedstate-samples/build.gradle
@@ -34,7 +34,7 @@
 
 dependencies {
     api(libs.kotlinStdlib)
-    implementation("androidx.activity:activity:1.10.1")
+    implementation(project(":activity:activity-ktx"))
     implementation(project(":savedstate:savedstate"))
     compileOnly(project(":annotation:annotation-sampled"))
     implementation(libs.kotlinSerializationCore)
diff --git a/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateConfiguration.kt b/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateConfiguration.kt
index 9054b2a..188604b 100644
--- a/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateConfiguration.kt
+++ b/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateConfiguration.kt
@@ -59,9 +59,6 @@
          * Module with contextual and polymorphic serializers to be used in the resulting
          * [SavedStateConfiguration] instance.
          *
-         * Note that this [SerializersModule] will be combined with an internal [SerializersModule]
-         * in the resulting [SavedStateConfiguration] to support built-in types.
-         *
          * @see SerializersModule
          * @see Contextual
          * @see Polymorphic
diff --git a/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateDecoder.kt b/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateDecoder.kt
index f760bef..efd3720 100644
--- a/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateDecoder.kt
+++ b/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateDecoder.kt
@@ -34,8 +34,7 @@
  *
  * @sample androidx.savedstate.decode
  * @param savedState The [SavedState] to decode from.
- * @param configuration The [SavedStateConfiguration] to use. Defaults to
- *   [SavedStateConfiguration.DEFAULT].
+ * @param configuration The [SavedStateConfiguration] to use.
  * @return The decoded object.
  * @throws SerializationException in case of any decoding-specific error.
  * @throws IllegalArgumentException if the decoded input is not a valid instance of [T].
@@ -52,8 +51,7 @@
  * @sample androidx.savedstate.decodeWithExplicitSerializerAndConfig
  * @param deserializer The deserializer to use.
  * @param savedState The [SavedState] to decode from.
- * @param configuration The [SavedStateConfiguration] to use. Defaults to
- *   [SavedStateConfiguration.DEFAULT].
+ * @param configuration The [SavedStateConfiguration] to use.
  * @return The deserialized object.
  * @throws SerializationException in case of any decoding-specific error.
  * @throws IllegalArgumentException if the decoded input is not a valid instance of [T].
diff --git a/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateEncoder.kt b/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateEncoder.kt
index 7c0231c..0efb61a 100644
--- a/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateEncoder.kt
+++ b/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateEncoder.kt
@@ -36,8 +36,7 @@
  *
  * @sample androidx.savedstate.encode
  * @param value The serializable object to encode.
- * @param configuration The [SavedStateConfiguration] to use. Defaults to
- *   [SavedStateConfiguration.DEFAULT].
+ * @param configuration The [SavedStateConfiguration] to use.
  * @return The encoded [SavedState].
  * @throws SerializationException in case of any encoding-specific error.
  */
@@ -53,8 +52,7 @@
  * @sample androidx.savedstate.encodeWithExplicitSerializerAndConfig
  * @param serializer The serializer to use.
  * @param value The serializable object to encode.
- * @param configuration The [SavedStateConfiguration] to use. Defaults to
- *   [SavedStateConfiguration.DEFAULT].
+ * @param configuration The [SavedStateConfiguration] to use.
  * @return The encoded [SavedState].
  * @throws SerializationException in case of any encoding-specific error.
  */
diff --git a/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateRegistryOwnerDelegate.kt b/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateRegistryOwnerDelegate.kt
index 5507a66..19c8990 100644
--- a/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateRegistryOwnerDelegate.kt
+++ b/savedstate/savedstate/src/commonMain/kotlin/androidx/savedstate/serialization/SavedStateRegistryOwnerDelegate.kt
@@ -30,8 +30,7 @@
  * @sample androidx.savedstate.serialization.savedStateRegistryOwner_saved_withKey
  * @param key An optional [String] key to use for storing the value in the [SavedStateRegistry]. A
  *   default key will be generated if it's omitted or when 'null' is passed.
- * @param configuration The [SavedStateConfiguration] to use. Defaults to
- *   [SavedStateConfiguration.DEFAULT].
+ * @param configuration The [SavedStateConfiguration] to use.
  * @param init The function to provide the initial value of the property.
  * @return A property delegate provider that manages the saving and restoring of the value.
  * @see encodeToSavedState
@@ -53,8 +52,7 @@
  * @param serializer The [KSerializer] to use for serializing and deserializing the value.
  * @param key An optional [String] key to use for storing the value in the [SavedStateRegistry]. A
  *   default key will be generated if it's omitted or when 'null' is passed.
- * @param configuration The [SavedStateConfiguration] to use. Defaults to
- *   [SavedStateConfiguration.DEFAULT].
+ * @param configuration The [SavedStateConfiguration] to use.
  * @param init The function to provide the initial value of the property.
  * @return A property delegate provider that manages the saving and restoring of the value.
  * @see encodeToSavedState
diff --git a/settings.gradle b/settings.gradle
index bde8008..4c2b05f 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -903,7 +903,6 @@
 includeProject(":palette:palette", [BuildType.MAIN])
 includeProject(":palette:palette-ktx", [BuildType.MAIN])
 includeProject(":pdf:integration-tests:testapp", [BuildType.MAIN])
-includeProject(":pdf:pdf-compose", [BuildType.COMPOSE])
 includeProject(":pdf:pdf-document-service", [BuildType.MAIN])
 includeProject(":pdf:pdf-viewer", [BuildType.MAIN])
 includeProject(":pdf:pdf-viewer-fragment", [BuildType.MAIN])
@@ -917,7 +916,6 @@
 includeProject(":privacysandbox:activity:activity-provider", [BuildType.MAIN])
 includeProject(":privacysandbox:ads:ads-adservices", [BuildType.MAIN])
 includeProject(":privacysandbox:ads:ads-adservices-java", [BuildType.MAIN])
-includeProject(":privacysandbox:ondevicepersonalization:ondevicepersonalization-client", [BuildType.MAIN])
 includeProject(":privacysandbox:plugins:plugins-privacysandbox-library", [BuildType.MAIN])
 includeProject(":privacysandbox:sdkruntime:integration-tests:testaidl", [BuildType.MAIN])
 includeProject(":privacysandbox:sdkruntime:integration-tests:macrobenchmark", [BuildType.MAIN])
diff --git a/test/uiautomator/integration-tests/testapp/build.gradle b/test/uiautomator/integration-tests/testapp/build.gradle
index 8e4fc10..6e240e0 100644
--- a/test/uiautomator/integration-tests/testapp/build.gradle
+++ b/test/uiautomator/integration-tests/testapp/build.gradle
@@ -27,7 +27,8 @@
     implementation(libs.androidx.annotation)
     implementation("androidx.core:core:1.6.0")
 
-    implementation("androidx.activity:activity-compose:1.10.1")
+    implementation(project(":activity:activity"))
+    implementation(project(":activity:activity-compose"))
     implementation(project(":compose:foundation:foundation"))
     implementation(project(":compose:foundation:foundation-layout"))
     implementation(project(":compose:material:material"))
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 5b327b2..3640dac 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
@@ -63,10 +63,11 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.TimeoutException;
 
 /**
@@ -1411,16 +1412,12 @@
         return uiAutomation.getWindows();
     }
 
-    /**
-     * Returns a list containing the root {@link AccessibilityNodeInfo}s for each active window.
-     * For convenience the returned list is sorted in descending window order, ensuring the root of
-     * the topmost visible window is reported first.
-     */
+    /** Returns a list containing the root {@link AccessibilityNodeInfo}s for each active window */
     @NonNull
     public List<AccessibilityNodeInfo> getWindowRoots() {
         waitForIdle();
 
-        LinkedHashSet<AccessibilityNodeInfo> roots = new LinkedHashSet<>();
+        Set<AccessibilityNodeInfo> roots = new HashSet<>();
         UiAutomation uiAutomation = getUiAutomation();
 
         // Ensure the active window root is included.
diff --git a/versionedparcelable/versionedparcelable/build.gradle b/versionedparcelable/versionedparcelable/build.gradle
index d96809c..1f196db 100644
--- a/versionedparcelable/versionedparcelable/build.gradle
+++ b/versionedparcelable/versionedparcelable/build.gradle
@@ -42,9 +42,9 @@
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.mockitoCore)
+    androidTestImplementation(libs.dexmakerMockito)
     androidTestImplementation(libs.truth)
-    androidTestImplementation(libs.junit)
-
     androidTestAnnotationProcessor(project(":versionedparcelable:versionedparcelable-compiler"))
 }
 
diff --git a/wear/benchmark/integration-tests/macrobenchmark-target/build.gradle b/wear/benchmark/integration-tests/macrobenchmark-target/build.gradle
index f74de36..4acae42 100644
--- a/wear/benchmark/integration-tests/macrobenchmark-target/build.gradle
+++ b/wear/benchmark/integration-tests/macrobenchmark-target/build.gradle
@@ -39,7 +39,7 @@
 dependencies {
     implementation(libs.kotlinStdlib)
     implementation(libs.constraintLayout)
-    implementation("androidx.activity:activity:1.10.1")
+    implementation(project(":activity:activity-ktx"))
     implementation("androidx.core:core-ktx")
     implementation(libs.material)
     implementation(project(":profileinstaller:profileinstaller"))
diff --git a/wear/compose/compose-material3/api/current.txt b/wear/compose/compose-material3/api/current.txt
index 6f512ae..ea11df5 100644
--- a/wear/compose/compose-material3/api/current.txt
+++ b/wear/compose/compose-material3/api/current.txt
@@ -7,9 +7,7 @@
     method @androidx.compose.runtime.Composable public void EdgeButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.wear.compose.material3.ButtonColors colors, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public void GroupSeparator();
     method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.PaddingValues confirmDismissContentPadding();
-    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.PaddingValues confirmDismissWithIconContentPadding();
     method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.PaddingValues contentPadding();
-    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.PaddingValues contentWithIconPadding();
     method public kotlin.jvm.functions.Function1<androidx.compose.foundation.layout.RowScope,kotlin.Unit> getConfirmIcon();
     method public kotlin.jvm.functions.Function1<androidx.compose.foundation.layout.RowScope,kotlin.Unit> getDismissIcon();
     method public androidx.compose.foundation.layout.Arrangement.Vertical getVerticalArrangement();
diff --git a/wear/compose/compose-material3/api/restricted_current.txt b/wear/compose/compose-material3/api/restricted_current.txt
index 6f512ae..ea11df5 100644
--- a/wear/compose/compose-material3/api/restricted_current.txt
+++ b/wear/compose/compose-material3/api/restricted_current.txt
@@ -7,9 +7,7 @@
     method @androidx.compose.runtime.Composable public void EdgeButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.wear.compose.material3.ButtonColors colors, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public void GroupSeparator();
     method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.PaddingValues confirmDismissContentPadding();
-    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.PaddingValues confirmDismissWithIconContentPadding();
     method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.PaddingValues contentPadding();
-    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.PaddingValues contentWithIconPadding();
     method public kotlin.jvm.functions.Function1<androidx.compose.foundation.layout.RowScope,kotlin.Unit> getConfirmIcon();
     method public kotlin.jvm.functions.Function1<androidx.compose.foundation.layout.RowScope,kotlin.Unit> getDismissIcon();
     method public androidx.compose.foundation.layout.Arrangement.Vertical getVerticalArrangement();
diff --git a/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/AlertDialogDemo.kt b/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/AlertDialogDemo.kt
index 975e29d..863387f 100644
--- a/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/AlertDialogDemo.kt
+++ b/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/AlertDialogDemo.kt
@@ -125,7 +125,6 @@
                         label = { Text("Caption") },
                     )
                 }
-
                 item { ListHeader { Text("Buttons") } }
                 item {
                     RadioButton(
@@ -151,7 +150,6 @@
                         label = { Text("No EdgeButton") },
                     )
                 }
-
                 item { Button(onClick = { showDialog = true }, label = { Text("Show dialog") }) }
             }
         }
diff --git a/wear/compose/compose-material3/macrobenchmark-target/build.gradle b/wear/compose/compose-material3/macrobenchmark-target/build.gradle
index 144b29c..e6ca2cb 100644
--- a/wear/compose/compose-material3/macrobenchmark-target/build.gradle
+++ b/wear/compose/compose-material3/macrobenchmark-target/build.gradle
@@ -43,7 +43,7 @@
     implementation(project(":compose:foundation:foundation"))
     implementation(project(":compose:foundation:foundation-layout"))
     implementation(project(":compose:ui:ui"))
-    implementation("androidx.activity:activity-compose:1.10.1")
+    implementation(project(":activity:activity-compose"))
     implementation(project(":profileinstaller:profileinstaller"))
     implementation(project(":wear:compose:compose-material3"))
     implementation(project(":wear:compose:compose-material3-macrobenchmark-common"))
diff --git a/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/AlertDialog.kt b/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/AlertDialog.kt
index ff17682..5d64c5e 100644
--- a/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/AlertDialog.kt
+++ b/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/AlertDialog.kt
@@ -13,6 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package androidx.wear.compose.material3
 
 import androidx.compose.foundation.layout.Arrangement
@@ -37,11 +38,9 @@
 import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.text.style.TextOverflow
-import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.window.DialogProperties
 import androidx.wear.compose.foundation.lazy.ScalingLazyColumn
-import androidx.wear.compose.foundation.lazy.ScalingLazyColumnDefaults
 import androidx.wear.compose.foundation.lazy.ScalingLazyListScope
 import androidx.wear.compose.foundation.lazy.rememberScalingLazyListState
 import androidx.wear.compose.material3.PaddingDefaults.horizontalContentPadding
@@ -88,8 +87,7 @@
  * @param verticalArrangement The vertical arrangement of the dialog's children. There is a default
  *   padding between icon, title, and text, which will be added to the spacing specified in this
  *   [verticalArrangement] parameter.
- * @param contentPadding The padding to apply around the entire dialog's contents. It is recommended
- *   to use the defaults, which adjust to reduce the top padding when an icon is present.
+ * @param contentPadding The padding to apply around the entire dialog's contents.
  * @param properties An optional [DialogProperties] object for configuring the dialog's behavior.
  * @param content A slot for additional content, displayed within a scrollable [ScalingLazyColumn].
  */
@@ -106,12 +104,7 @@
     icon: @Composable (() -> Unit)? = null,
     text: @Composable (() -> Unit)? = null,
     verticalArrangement: Arrangement.Vertical = AlertDialogDefaults.VerticalArrangement,
-    contentPadding: PaddingValues =
-        if (icon != null) {
-            AlertDialogDefaults.confirmDismissWithIconContentPadding()
-        } else {
-            AlertDialogDefaults.confirmDismissContentPadding()
-        },
+    contentPadding: PaddingValues = AlertDialogDefaults.confirmDismissContentPadding(),
     properties: DialogProperties = DialogProperties(),
     content: (ScalingLazyListScope.() -> Unit)? = null
 ) {
@@ -161,8 +154,7 @@
  * @param verticalArrangement The vertical arrangement of the dialog's children. There is a default
  *   padding between icon, title, and text, which will be added to the spacing specified in this
  *   [verticalArrangement] parameter.
- * @param contentPadding The padding to apply around the entire dialog's contents. It is recommended
- *   to use the defaults, which adjust to reduce the top padding when an icon is present.
+ * @param contentPadding The padding to apply around the entire dialog's contents.
  * @param properties An optional [DialogProperties] object for configuring the dialog's behavior.
  * @param content A slot for additional content, displayed within a scrollable [ScalingLazyColumn].
  *   Any buttons added in this slot that are intended to dismiss the dialog must remove the dialog
@@ -177,12 +169,7 @@
     icon: @Composable (() -> Unit)? = null,
     text: @Composable (() -> Unit)? = null,
     verticalArrangement: Arrangement.Vertical = AlertDialogDefaults.VerticalArrangement,
-    contentPadding: PaddingValues =
-        if (icon != null) {
-            AlertDialogDefaults.contentWithIconPadding()
-        } else {
-            AlertDialogDefaults.contentPadding()
-        },
+    contentPadding: PaddingValues = AlertDialogDefaults.contentPadding(),
     properties: DialogProperties = DialogProperties(),
     content: (ScalingLazyListScope.() -> Unit)? = null
 ) {
@@ -242,8 +229,7 @@
  *   padding between icon, title, and text, which will be added to the spacing specified in this
  *   [verticalArrangement] parameter.
  * @param contentPadding The padding to apply around the entire dialog's contents. Bottom padding
- *   will be ignored and default spacing for the [EdgeButton] will be used. It is recommended to use
- *   the defaults, which adjust to reduce the top padding when an icon is present.
+ *   will be ignored and default spacing for the [EdgeButton] will be used.
  * @param properties An optional [DialogProperties] object for configuring the dialog's behavior.
  * @param content A slot for additional content, displayed within a scrollable [ScalingLazyColumn].
  *   Any buttons added in this slot that are intended to dismiss the dialog must remove the dialog
@@ -259,12 +245,7 @@
     icon: @Composable (() -> Unit)? = null,
     text: @Composable (() -> Unit)? = null,
     verticalArrangement: Arrangement.Vertical = AlertDialogDefaults.VerticalArrangement,
-    contentPadding: PaddingValues =
-        if (icon != null) {
-            AlertDialogDefaults.contentWithIconPadding()
-        } else {
-            AlertDialogDefaults.contentPadding()
-        },
+    contentPadding: PaddingValues = AlertDialogDefaults.contentPadding(),
     properties: DialogProperties = DialogProperties(),
     content: (ScalingLazyListScope.() -> Unit)? = null
 ) {
@@ -309,8 +290,7 @@
  * @param verticalArrangement The vertical arrangement of the dialog's children. There is a default
  *   padding between icon, title, and text, which will be added to the spacing specified in this
  *   [verticalArrangement] parameter.
- * @param contentPadding The padding to apply around the entire dialog's contents. It is recommended
- *   to use the defaults, which adjust to reduce the top padding when an icon is present.
+ * @param contentPadding The padding to apply around the entire dialog's contents.
  * @param content A slot for additional content, displayed within a scrollable [ScalingLazyColumn].
  */
 @Composable
@@ -322,22 +302,17 @@
     icon: @Composable (() -> Unit)? = null,
     text: @Composable (() -> Unit)? = null,
     verticalArrangement: Arrangement.Vertical = AlertDialogDefaults.VerticalArrangement,
-    contentPadding: PaddingValues =
-        if (icon != null) {
-            AlertDialogDefaults.confirmDismissWithIconContentPadding()
-        } else {
-            AlertDialogDefaults.confirmDismissContentPadding()
-        },
+    contentPadding: PaddingValues = AlertDialogDefaults.confirmDismissContentPadding(),
     content: (ScalingLazyListScope.() -> Unit)? = null
 ) {
     val state = rememberScalingLazyListState(initialCenterItemIndex = 0)
+
     ScreenScaffold(
         scrollState = state,
         modifier = modifier,
         contentPadding = contentPadding,
     ) {
         ScalingLazyColumn(
-            scalingParams = AlertScalingParams,
             state = state,
             contentPadding = it,
             horizontalAlignment = Alignment.CenterHorizontally,
@@ -346,6 +321,7 @@
             modifier = Modifier.fillMaxSize(),
         ) {
             alertDialogCommonContent(icon = icon, title = title, text = text, content = content)
+
             item {
                 ConfirmDismissButtons(confirmButton = confirmButton, dismissButton = dismissButton)
             }
@@ -370,8 +346,7 @@
  * @param verticalArrangement The vertical arrangement of the dialog's children. There is a default
  *   padding between icon, title, and text, which will be added to the spacing specified in this
  *   [verticalArrangement] parameter.
- * @param contentPadding The padding to apply around the entire dialog's contents. It is recommended
- *   to use the defaults, which adjust to reduce the top padding when an icon is present.
+ * @param contentPadding The padding to apply around the entire dialog's contents.
  * @param content A slot for additional content, displayed within a scrollable [ScalingLazyColumn].
  */
 @Composable
@@ -381,22 +356,17 @@
     icon: @Composable (() -> Unit)? = null,
     text: @Composable (() -> Unit)? = null,
     verticalArrangement: Arrangement.Vertical = AlertDialogDefaults.VerticalArrangement,
-    contentPadding: PaddingValues =
-        if (icon != null) {
-            AlertDialogDefaults.contentWithIconPadding()
-        } else {
-            AlertDialogDefaults.contentPadding()
-        },
+    contentPadding: PaddingValues = AlertDialogDefaults.contentPadding(),
     content: (ScalingLazyListScope.() -> Unit)? = null
 ) {
     val state = rememberScalingLazyListState(initialCenterItemIndex = 0)
+
     ScreenScaffold(
         scrollState = state,
         modifier = modifier,
         contentPadding = contentPadding,
     ) {
         ScalingLazyColumn(
-            scalingParams = AlertScalingParams,
             state = state,
             contentPadding = it,
             horizontalAlignment = Alignment.CenterHorizontally,
@@ -431,8 +401,7 @@
  *   padding between icon, title, and text, which will be added to the spacing specified in this
  *   [verticalArrangement] parameter.
  * @param contentPadding The padding to apply around the entire dialog's contents. Bottom padding
- *   will be ignored and default spacing for the [EdgeButton] will be used. It is recommended to use
- *   the defaults, which adjust to reduce the top padding when an icon is present.
+ *   will be ignored and default spacing for the [EdgeButton] will be used.
  * @param content A slot for additional content, displayed within a scrollable [ScalingLazyColumn].
  */
 @Composable
@@ -443,15 +412,11 @@
     icon: @Composable (() -> Unit)? = null,
     text: @Composable (() -> Unit)? = null,
     verticalArrangement: Arrangement.Vertical = AlertDialogDefaults.VerticalArrangement,
-    contentPadding: PaddingValues =
-        if (icon != null) {
-            AlertDialogDefaults.contentWithIconPadding()
-        } else {
-            AlertDialogDefaults.contentPadding()
-        },
+    contentPadding: PaddingValues = AlertDialogDefaults.contentPadding(),
     content: (ScalingLazyListScope.() -> Unit)? = null
 ) {
     val state = rememberScalingLazyListState(initialCenterItemIndex = 0)
+
     val noTextAndContent = text == null && content == null
     ScreenScaffold(
         scrollState = state,
@@ -463,7 +428,6 @@
             else AlertEdgeButtonSpacing,
     ) {
         ScalingLazyColumn(
-            scalingParams = AlertScalingParams,
             state = state,
             contentPadding = it,
             horizontalAlignment = Alignment.CenterHorizontally,
@@ -522,7 +486,9 @@
     ) {
         val confirmWidth = 63.dp
         val confirmHeight = 54.dp
+
         val confirmShape = CircleShape
+
         FilledIconButton(
             onClick = onClick,
             modifier = modifier.rotate(-45f).size(confirmWidth, confirmHeight),
@@ -554,6 +520,7 @@
     ) {
         val dismissSize = 60.dp
         val dismissShape = MaterialTheme.shapes.medium
+
         Box(modifier = Modifier.size(dismissSize + cancelButtonPadding)) {
             FilledTonalIconButton(
                 onClick = onClick,
@@ -568,60 +535,25 @@
 
     /**
      * The padding to apply around the content for the [AlertDialog] variation with confirm dismiss
-     * buttons and no icon content.
+     * buttons.
      */
     @Composable
     public fun confirmDismissContentPadding(): PaddingValues {
         val verticalPadding = verticalContentPadding()
         val horizontalPadding = horizontalContentPadding()
-        return PaddingValues(
-            top = calculateTopPadding(hasIcon = false),
-            bottom = verticalPadding,
-            start = horizontalPadding,
-            end = horizontalPadding,
-        )
+        return PaddingValues(horizontal = horizontalPadding, vertical = verticalPadding)
     }
 
     /**
-     * The padding to apply around the content for the [AlertDialog] variation when an icon is
-     * provided and with confirm dismiss buttons.
-     */
-    @Composable
-    public fun confirmDismissWithIconContentPadding(): PaddingValues {
-        val verticalPadding = verticalContentPadding()
-        val horizontalPadding = horizontalContentPadding()
-        return PaddingValues(
-            top = calculateTopPadding(hasIcon = true),
-            bottom = verticalPadding,
-            start = horizontalPadding,
-            end = horizontalPadding,
-        )
-    }
-
-    /**
-     * The padding to apply around the content for the [AlertDialog] variation without an icon, that
-     * has a stack of buttons for options and no confirm or dismiss buttons at the end.
+     * The padding to apply around the content for the [AlertDialog] variation with a stack of
+     * options and no buttons at the end.
      */
     @Composable
     public fun contentPadding(): PaddingValues {
+        val topPadding = verticalContentPadding()
         val horizontalPadding = horizontalContentPadding()
         return PaddingValues(
-            top = calculateTopPadding(hasIcon = false),
-            bottom = screenHeightDp().dp * noEdgeButtonBottomPaddingFraction,
-            start = horizontalPadding,
-            end = horizontalPadding,
-        )
-    }
-
-    /**
-     * The padding to apply around the content for the [AlertDialog] variation with an icon, that
-     * has a stack of buttons for options and no confirm or dismiss buttons at the end.
-     */
-    @Composable
-    public fun contentWithIconPadding(): PaddingValues {
-        val horizontalPadding = horizontalContentPadding()
-        return PaddingValues(
-            top = calculateTopPadding(hasIcon = true),
+            top = topPadding,
             bottom = screenHeightDp().dp * noEdgeButtonBottomPaddingFraction,
             start = horizontalPadding,
             end = horizontalPadding,
@@ -640,6 +572,7 @@
     /** Default vertical arrangement for an [AlertDialog]. */
     public val VerticalArrangement: Arrangement.Vertical =
         Arrangement.spacedBy(space = 4.dp, alignment = Alignment.CenterVertically)
+
     /** Default icon for the confirm button. */
     public val ConfirmIcon: @Composable RowScope.() -> Unit = {
         Icon(
@@ -648,6 +581,7 @@
             modifier = Modifier.size(28.dp).align(Alignment.CenterVertically)
         )
     }
+
     /** Default icon for the dismiss button. */
     public val DismissIcon: @Composable RowScope.() -> Unit = {
         Icon(
@@ -657,13 +591,8 @@
         )
     }
 
-    @Composable
-    private fun calculateTopPadding(hasIcon: Boolean): Dp {
-        return if (hasIcon) screenHeightDp().dp * iconTopPaddingFraction
-        else verticalContentPadding()
-    }
-
-    internal val iconTopPaddingFraction = 0.012f
+    /** The extra top padding to apply to the edge button. */
+    internal val edgeButtonExtraTopPadding = 1.dp
     internal val noEdgeButtonBottomPaddingFraction = 0.3646f
     internal val cancelButtonPadding = 1.dp
 }
@@ -767,10 +696,7 @@
 internal val AlertContentTopSpacing = 8.dp
 internal const val ConfirmDismissButtonsBottomSpacingFraction = 0.045f
 internal const val AlertTitleMaxLines = 3
+
 private const val TextPaddingFraction = 0.0416f
 private const val TitlePaddingFraction = 0.12f
 private const val ConfirmDismissBetweenButtonsPaddingFraction = 0.03f
-private val AlertScalingParams =
-    ScalingLazyColumnDefaults.scalingParams(
-        minTransitionArea = 0.2f,
-    )
diff --git a/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/AnimationSpecUtils.kt b/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/AnimationSpecUtils.kt
index f283325..980af7f 100644
--- a/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/AnimationSpecUtils.kt
+++ b/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/AnimationSpecUtils.kt
@@ -17,7 +17,6 @@
 package androidx.wear.compose.material3
 
 import androidx.annotation.FloatRange
-import androidx.compose.animation.core.Animatable
 import androidx.compose.animation.core.AnimationVector
 import androidx.compose.animation.core.AnimationVector1D
 import androidx.compose.animation.core.AnimationVector2D
@@ -27,20 +26,8 @@
 import androidx.compose.animation.core.SpringSpec
 import androidx.compose.animation.core.TwoWayConverter
 import androidx.compose.animation.core.VectorizedFiniteAnimationSpec
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
 import androidx.compose.runtime.withFrameMillis
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.graphicsLayer
-import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.style.TextAlign
 import java.util.concurrent.TimeUnit
-import kotlin.math.abs
 import kotlinx.coroutines.delay
 
 /**
@@ -115,6 +102,8 @@
     val speedupFactor: Float,
     val startDelayNanos: Long = 0
 ) : VectorizedFiniteAnimationSpec<V> {
+    override val isInfinite: Boolean
+        get() = wrapped.isInfinite
 
     override fun getValueFromNanos(
         playTimeNanos: Long,
@@ -184,59 +173,4 @@
     }
 }
 
-/**
- * Animated [Text] based component that on text change fades out the old value and then fades in the
- * new value in one smooth animation.
- */
-@Composable
-internal fun FadeLabel(
-    text: String,
-    animationSpec: FiniteAnimationSpec<Float>,
-    modifier: Modifier = Modifier,
-    color: Color = Color.Unspecified,
-    style: TextStyle = LocalTextStyle.current,
-    maxLines: Int = LocalTextConfiguration.current.maxLines,
-    textAlign: TextAlign? = LocalTextConfiguration.current.textAlign,
-) {
-    var currentText by remember { mutableStateOf(text) }
-    var targetText by remember { mutableStateOf(text) }
-    val animatedAlpha = remember { Animatable(1f) }
-
-    LaunchedEffect(text) {
-        // Don't animate the first time the text is set
-        if (currentText.isEmpty() || currentText == text) {
-            currentText = text
-            return@LaunchedEffect
-        }
-
-        // If an animation is already running when a new animation is started, finish the animation
-        // quickly and then start the new animation
-        if (animatedAlpha.value != animatedAlpha.targetValue) {
-            animatedAlpha.animateTo(-1f, animationSpec.faster(200f)) {
-                if (animatedAlpha.value < 0f) {
-                    currentText = targetText
-                }
-            }
-            animatedAlpha.snapTo(1f)
-        }
-
-        targetText = text
-        animatedAlpha.animateTo(-1f, animationSpec) {
-            if (animatedAlpha.value < 0f) {
-                currentText = targetText
-            }
-        }
-        animatedAlpha.snapTo(1f)
-    }
-
-    Text(
-        text = currentText,
-        modifier = modifier.graphicsLayer { alpha = abs(animatedAlpha.value) },
-        color = color,
-        style = style,
-        maxLines = maxLines,
-        textAlign = textAlign
-    )
-}
-
 private const val MAX_WAIT_TIME_MILLIS = 1_000L
diff --git a/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/DatePicker.kt b/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/DatePicker.kt
index f506972..4e02db7 100644
--- a/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/DatePicker.kt
+++ b/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/DatePicker.kt
@@ -19,7 +19,12 @@
 import android.os.Build
 import android.text.format.DateFormat
 import androidx.annotation.RequiresApi
+import androidx.compose.animation.AnimatedContent
+import androidx.compose.animation.ContentTransform
 import androidx.compose.animation.core.Animatable
+import androidx.compose.animation.core.FiniteAnimationSpec
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
 import androidx.compose.foundation.focusable
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.BoxWithConstraints
@@ -264,25 +269,38 @@
         val maxTextLines = if (selectedIndex == null) 2 else 1
         val textPaddingPercentage = 24f
 
+        val headingAnimationSpec: FiniteAnimationSpec<Float> =
+            MaterialTheme.motionScheme.defaultEffectsSpec()
         Column(
             verticalArrangement = Arrangement.Center,
             horizontalAlignment = Alignment.CenterHorizontally,
         ) {
             Spacer(Modifier.height(14.dp))
-            FadeLabel(
-                text = heading,
-                animationSpec = MaterialTheme.motionScheme.defaultEffectsSpec(),
-                modifier =
-                    Modifier.padding(
-                            horizontal =
-                                PaddingDefaults.horizontalContentPadding(textPaddingPercentage)
-                        )
-                        .fillMaxWidth(),
-                color = colors.pickerLabelColor,
-                style = labelTextStyle,
-                maxLines = maxTextLines,
-                textAlign = TextAlign.Center
-            )
+            AnimatedContent(
+                targetState = heading,
+                transitionSpec = {
+                    ContentTransform(
+                        targetContentEnter =
+                            fadeIn(animationSpec = headingAnimationSpec.delayMillis(200)),
+                        initialContentExit = fadeOut(animationSpec = headingAnimationSpec),
+                        sizeTransform = null
+                    )
+                }
+            ) { targetText ->
+                Text(
+                    modifier =
+                        Modifier.padding(
+                                horizontal =
+                                    PaddingDefaults.horizontalContentPadding(textPaddingPercentage)
+                            )
+                            .fillMaxWidth(),
+                    text = targetText,
+                    color = colors.pickerLabelColor,
+                    textAlign = TextAlign.Center,
+                    style = labelTextStyle,
+                    maxLines = maxTextLines,
+                )
+            }
             Spacer(Modifier.height(if (isLargeScreen) 6.dp else 4.dp))
             FontScaleIndependent {
                 val measurer = rememberTextMeasurer()
diff --git a/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/PagerScaffold.kt b/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/PagerScaffold.kt
index 7437135..28f7ca9 100644
--- a/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/PagerScaffold.kt
+++ b/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/PagerScaffold.kt
@@ -160,6 +160,13 @@
     val isReduceMotionEnabled = LocalReduceMotion.current
     val isRtlEnabled = LocalLayoutDirection.current == LayoutDirection.Rtl
     val isCurrentPage: Boolean = pageIndex == pagerState.currentPage
+    val pageTransitionFraction =
+        if (isCurrentPage) {
+            pagerState.currentPageOffsetFraction.absoluteValue
+        } else {
+            // interpolate left or right pages in opposite direction
+            1 - pagerState.currentPageOffsetFraction.absoluteValue
+        }
     val graphicsLayerModifier =
         if (isReduceMotionEnabled) Modifier
         else
@@ -180,8 +187,6 @@
                         // Flip X and Y for vertical pager
                         TransformOrigin(0.5f, pivotFractionX)
                     }
-                val pageTransitionFraction =
-                    getPageTransitionFraction(isCurrentPage, pagerState.currentPageOffsetFraction)
                 val scale = lerp(start = 1f, stop = 0.55f, fraction = pageTransitionFraction)
                 scaleX = scale
                 scaleY = scale
@@ -191,8 +196,6 @@
 
         if (contentScrimColor.isSpecified) {
             Canvas(Modifier.fillMaxSize()) {
-                val pageTransitionFraction =
-                    getPageTransitionFraction(isCurrentPage, pagerState.currentPageOffsetFraction)
                 val color =
                     contentScrimColor.copy(
                         alpha = lerp(start = 0f, stop = 0.5f, fraction = pageTransitionFraction)
@@ -281,15 +284,3 @@
         )
     }
 }
-
-private fun getPageTransitionFraction(
-    isCurrentPage: Boolean,
-    currentPageOffsetFraction: Float
-): Float {
-    return if (isCurrentPage) {
-        currentPageOffsetFraction.absoluteValue
-    } else {
-        // interpolate left or right pages in opposite direction
-        1 - currentPageOffsetFraction.absoluteValue
-    }
-}
diff --git a/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/TimePicker.kt b/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/TimePicker.kt
index 87a5a9f..0910732 100644
--- a/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/TimePicker.kt
+++ b/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/TimePicker.kt
@@ -18,7 +18,12 @@
 
 import android.os.Build
 import androidx.annotation.RequiresApi
+import androidx.compose.animation.AnimatedContent
+import androidx.compose.animation.ContentTransform
 import androidx.compose.animation.core.Animatable
+import androidx.compose.animation.core.FiniteAnimationSpec
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
 import androidx.compose.foundation.focusable
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
@@ -201,27 +206,43 @@
                         }
                     } ?: if (touchExplorationServicesEnabled) instructionHeadingString else ""
 
+                val headingAnimationSpec: FiniteAnimationSpec<Float> =
+                    MaterialTheme.motionScheme.defaultEffectsSpec()
+
                 // Allow more room for the initial instruction heading under TalkBack
                 val maxTextLines = if (selectedIndex == null) 2 else 1
                 val textPaddingPercentage = 30f
                 val textModifier = if (selectedIndex == null) Modifier else Modifier.height(24.dp)
 
-                FadeLabel(
-                    text = heading,
-                    animationSpec = MaterialTheme.motionScheme.defaultEffectsSpec(),
-                    modifier =
-                        textModifier
-                            .padding(
-                                horizontal =
-                                    PaddingDefaults.horizontalContentPadding(textPaddingPercentage)
-                            )
-                            .fillMaxWidth()
-                            .align(Alignment.CenterHorizontally),
-                    color = colors.pickerLabelColor,
-                    style = styles.labelTextStyle,
-                    maxLines = maxTextLines,
-                    textAlign = TextAlign.Center
-                )
+                AnimatedContent(
+                    targetState = heading,
+                    transitionSpec = {
+                        ContentTransform(
+                            targetContentEnter =
+                                fadeIn(animationSpec = headingAnimationSpec.delayMillis(200)),
+                            initialContentExit = fadeOut(animationSpec = headingAnimationSpec),
+                            sizeTransform = null
+                        )
+                    }
+                ) { targetText ->
+                    Text(
+                        text = targetText,
+                        color = colors.pickerLabelColor,
+                        style = styles.labelTextStyle,
+                        maxLines = maxTextLines,
+                        modifier =
+                            textModifier
+                                .padding(
+                                    horizontal =
+                                        PaddingDefaults.horizontalContentPadding(
+                                            textPaddingPercentage
+                                        )
+                                )
+                                .fillMaxWidth()
+                                .align(Alignment.CenterHorizontally),
+                        textAlign = TextAlign.Center
+                    )
+                }
                 Spacer(Modifier.height(styles.sectionVerticalPadding))
                 Row(
                     modifier = Modifier.fillMaxWidth().weight(1f),
diff --git a/wear/compose/integration-tests/demos/build.gradle b/wear/compose/integration-tests/demos/build.gradle
index a286922..44d482b 100644
--- a/wear/compose/integration-tests/demos/build.gradle
+++ b/wear/compose/integration-tests/demos/build.gradle
@@ -28,8 +28,8 @@
     defaultConfig {
         applicationId = "androidx.wear.compose.integration.demos"
         minSdk = 25
-        versionCode = 72
-        versionName = "1.72"
+        versionCode = 71
+        versionName = "1.71"
     }
 
     buildTypes {
diff --git a/wear/compose/integration-tests/macrobenchmark-target/build.gradle b/wear/compose/integration-tests/macrobenchmark-target/build.gradle
index 6a50fb6..f4a5733 100644
--- a/wear/compose/integration-tests/macrobenchmark-target/build.gradle
+++ b/wear/compose/integration-tests/macrobenchmark-target/build.gradle
@@ -45,7 +45,7 @@
     implementation(project(":compose:foundation:foundation-layout"))
     implementation(project(":compose:runtime:runtime"))
     implementation(project(":compose:ui:ui-tooling"))
-    implementation("androidx.activity:activity-compose:1.10.1")
+    implementation(project(":activity:activity-compose"))
     implementation(project(":profileinstaller:profileinstaller"))
     implementation(project(":wear:compose:compose-foundation"))
     implementation(project(":wear:compose:compose-material"))
diff --git a/wear/protolayout/protolayout-expression-pipeline/api/1.3.0-beta01.txt b/wear/protolayout/protolayout-expression-pipeline/api/1.3.0-beta01.txt
deleted file mode 100644
index 28d52cc..0000000
--- a/wear/protolayout/protolayout-expression-pipeline/api/1.3.0-beta01.txt
+++ /dev/null
@@ -1,80 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.protolayout.expression.pipeline {
-
-  public interface BoundDynamicType extends java.lang.AutoCloseable {
-    method @UiThread public void close();
-    method @UiThread public void startEvaluation();
-  }
-
-  public abstract class DynamicTypeBindingRequest {
-    method public static androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest forDynamicBool(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool, java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Boolean!>);
-    method public static androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest forDynamicColor(androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor, java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Integer!>);
-    method public static androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest forDynamicDuration(androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration, java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.time.Duration!>);
-    method public static androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest forDynamicFloat(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat, java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Float!>);
-    method public static androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest forDynamicInstant(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant, java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.time.Instant!>);
-    method public static androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest forDynamicInt32(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32, java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Integer!>);
-    method public static androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest forDynamicString(androidx.wear.protolayout.expression.DynamicBuilders.DynamicString, android.icu.util.ULocale, java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.String!>);
-  }
-
-  public class DynamicTypeEvaluator {
-    ctor public DynamicTypeEvaluator(androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config);
-    method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest) throws androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.EvaluationException;
-  }
-
-  public static final class DynamicTypeEvaluator.Config {
-    method public androidx.wear.protolayout.expression.pipeline.QuotaManager? getAnimationQuotaManager();
-    method @VisibleForTesting public java.util.function.Supplier<java.time.Instant!>? getClock();
-    method public androidx.wear.protolayout.expression.pipeline.QuotaManager? getDynamicTypesQuotaManager();
-    method public java.util.Map<androidx.wear.protolayout.expression.PlatformDataKey<? extends java.lang.Object!>!,androidx.wear.protolayout.expression.pipeline.PlatformDataProvider!> getPlatformDataProviders();
-    method public androidx.wear.protolayout.expression.pipeline.PlatformTimeUpdateNotifier? getPlatformTimeUpdateNotifier();
-    method public androidx.wear.protolayout.expression.pipeline.StateStore? getStateStore();
-  }
-
-  public static final class DynamicTypeEvaluator.Config.Builder {
-    ctor public DynamicTypeEvaluator.Config.Builder();
-    method public androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config.Builder addPlatformDataProvider(androidx.wear.protolayout.expression.pipeline.PlatformDataProvider, java.util.Set<androidx.wear.protolayout.expression.PlatformDataKey<? extends java.lang.Object!>!>);
-    method public androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config build();
-    method public androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config.Builder setAnimationQuotaManager(androidx.wear.protolayout.expression.pipeline.QuotaManager);
-    method @VisibleForTesting public androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config.Builder setClock(java.util.function.Supplier<java.time.Instant!>);
-    method public androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config.Builder setDynamicTypesQuotaManager(androidx.wear.protolayout.expression.pipeline.QuotaManager);
-    method public androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config.Builder setPlatformTimeUpdateNotifier(androidx.wear.protolayout.expression.pipeline.PlatformTimeUpdateNotifier);
-    method public androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config.Builder setStateStore(androidx.wear.protolayout.expression.pipeline.StateStore);
-  }
-
-  public static class DynamicTypeEvaluator.EvaluationException extends java.lang.Exception {
-    ctor public DynamicTypeEvaluator.EvaluationException(String);
-  }
-
-  public interface DynamicTypeValueReceiver<T> {
-    method public void onData(T);
-    method public void onInvalidated();
-  }
-
-  public interface PlatformDataProvider {
-    method public void clearReceiver();
-    method public void setReceiver(java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.PlatformDataReceiver);
-  }
-
-  public interface PlatformDataReceiver {
-    method public void onData(androidx.wear.protolayout.expression.PlatformDataValues);
-    method public void onInvalidated(java.util.Set<androidx.wear.protolayout.expression.PlatformDataKey<? extends java.lang.Object!>!>);
-  }
-
-  public interface PlatformTimeUpdateNotifier {
-    method public void clearReceiver();
-    method public void setReceiver(java.util.concurrent.Executor, Runnable);
-  }
-
-  public interface QuotaManager {
-    method public void releaseQuota(int);
-    method public boolean tryAcquireQuota(int);
-  }
-
-  public final class StateStore {
-    method public static androidx.wear.protolayout.expression.pipeline.StateStore create(java.util.Map<androidx.wear.protolayout.expression.AppDataKey<? extends java.lang.Object!>!,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends java.lang.Object!>!>);
-    method public static int getMaxStateEntryCount();
-    method @UiThread public void setAppStateEntryValues(java.util.Map<androidx.wear.protolayout.expression.AppDataKey<? extends java.lang.Object!>!,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends java.lang.Object!>!>);
-  }
-
-}
-
diff --git a/wear/protolayout/protolayout-expression-pipeline/api/res-1.3.0-beta01.txt b/wear/protolayout/protolayout-expression-pipeline/api/res-1.3.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/wear/protolayout/protolayout-expression-pipeline/api/res-1.3.0-beta01.txt
+++ /dev/null
diff --git a/wear/protolayout/protolayout-expression-pipeline/api/restricted_1.3.0-beta01.txt b/wear/protolayout/protolayout-expression-pipeline/api/restricted_1.3.0-beta01.txt
deleted file mode 100644
index 14e2a44..0000000
--- a/wear/protolayout/protolayout-expression-pipeline/api/restricted_1.3.0-beta01.txt
+++ /dev/null
@@ -1,95 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.protolayout.expression.pipeline {
-
-  public interface BoundDynamicType extends java.lang.AutoCloseable {
-    method @UiThread public void close();
-    method @UiThread public void startEvaluation();
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface DynamicTypeAnimator {
-    method public void advanceToAnimationTime(long);
-    method public Object? getCurrentValue();
-    method public long getDurationMs();
-    method public Object? getEndValue();
-    method public long getStartDelayMs();
-    method public Object? getStartValue();
-    method public android.animation.TypeEvaluator<? extends java.lang.Object!> getTypeEvaluator();
-    method public boolean isTerminal();
-    method public void setFloatValues(float...);
-    method public void setIntValues(int...);
-  }
-
-  public abstract class DynamicTypeBindingRequest {
-    method public static androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest forDynamicBool(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool, java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Boolean!>);
-    method public static androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest forDynamicColor(androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor, java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Integer!>);
-    method public static androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest forDynamicDuration(androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration, java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.time.Duration!>);
-    method public static androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest forDynamicFloat(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat, java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Float!>);
-    method public static androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest forDynamicInstant(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant, java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.time.Instant!>);
-    method public static androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest forDynamicInt32(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32, java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Integer!>);
-    method public static androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest forDynamicString(androidx.wear.protolayout.expression.DynamicBuilders.DynamicString, android.icu.util.ULocale, java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.String!>);
-  }
-
-  public class DynamicTypeEvaluator {
-    ctor public DynamicTypeEvaluator(androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config);
-    method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.pipeline.DynamicTypeBindingRequest) throws androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.EvaluationException;
-  }
-
-  public static final class DynamicTypeEvaluator.Config {
-    method public androidx.wear.protolayout.expression.pipeline.QuotaManager? getAnimationQuotaManager();
-    method @VisibleForTesting public java.util.function.Supplier<java.time.Instant!>? getClock();
-    method public androidx.wear.protolayout.expression.pipeline.QuotaManager? getDynamicTypesQuotaManager();
-    method public java.util.Map<androidx.wear.protolayout.expression.PlatformDataKey<? extends java.lang.Object!>!,androidx.wear.protolayout.expression.pipeline.PlatformDataProvider!> getPlatformDataProviders();
-    method public androidx.wear.protolayout.expression.pipeline.PlatformTimeUpdateNotifier? getPlatformTimeUpdateNotifier();
-    method public androidx.wear.protolayout.expression.pipeline.StateStore? getStateStore();
-  }
-
-  public static final class DynamicTypeEvaluator.Config.Builder {
-    ctor public DynamicTypeEvaluator.Config.Builder();
-    method public androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config.Builder addPlatformDataProvider(androidx.wear.protolayout.expression.pipeline.PlatformDataProvider, java.util.Set<androidx.wear.protolayout.expression.PlatformDataKey<? extends java.lang.Object!>!>);
-    method public androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config build();
-    method public androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config.Builder setAnimationQuotaManager(androidx.wear.protolayout.expression.pipeline.QuotaManager);
-    method @VisibleForTesting public androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config.Builder setClock(java.util.function.Supplier<java.time.Instant!>);
-    method public androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config.Builder setDynamicTypesQuotaManager(androidx.wear.protolayout.expression.pipeline.QuotaManager);
-    method public androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config.Builder setPlatformTimeUpdateNotifier(androidx.wear.protolayout.expression.pipeline.PlatformTimeUpdateNotifier);
-    method public androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator.Config.Builder setStateStore(androidx.wear.protolayout.expression.pipeline.StateStore);
-  }
-
-  public static class DynamicTypeEvaluator.EvaluationException extends java.lang.Exception {
-    ctor public DynamicTypeEvaluator.EvaluationException(String);
-  }
-
-  public interface DynamicTypeValueReceiver<T> {
-    method public void onData(T);
-    method public void onInvalidated();
-  }
-
-  public interface PlatformDataProvider {
-    method public void clearReceiver();
-    method public void setReceiver(java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.PlatformDataReceiver);
-  }
-
-  public interface PlatformDataReceiver {
-    method public void onData(androidx.wear.protolayout.expression.PlatformDataValues);
-    method public void onInvalidated(java.util.Set<androidx.wear.protolayout.expression.PlatformDataKey<? extends java.lang.Object!>!>);
-  }
-
-  public interface PlatformTimeUpdateNotifier {
-    method public void clearReceiver();
-    method public void setReceiver(java.util.concurrent.Executor, Runnable);
-  }
-
-  public interface QuotaManager {
-    method public void releaseQuota(int);
-    method public boolean tryAcquireQuota(int);
-  }
-
-  public final class StateStore {
-    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public StateStore(java.util.Map<androidx.wear.protolayout.expression.AppDataKey<? extends java.lang.Object!>!,androidx.wear.protolayout.expression.proto.DynamicDataProto.DynamicDataValue!>);
-    method public static androidx.wear.protolayout.expression.pipeline.StateStore create(java.util.Map<androidx.wear.protolayout.expression.AppDataKey<? extends java.lang.Object!>!,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends java.lang.Object!>!>);
-    method public static int getMaxStateEntryCount();
-    method @UiThread public void setAppStateEntryValues(java.util.Map<androidx.wear.protolayout.expression.AppDataKey<? extends java.lang.Object!>!,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends java.lang.Object!>!>);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @UiThread public void setAppStateEntryValuesProto(java.util.Map<androidx.wear.protolayout.expression.AppDataKey<? extends java.lang.Object!>!,androidx.wear.protolayout.expression.proto.DynamicDataProto.DynamicDataValue!>);
-  }
-
-}
-
diff --git a/wear/protolayout/protolayout-expression/api/1.3.0-beta01.txt b/wear/protolayout/protolayout-expression/api/1.3.0-beta01.txt
deleted file mode 100644
index 34cb16ee..0000000
--- a/wear/protolayout/protolayout-expression/api/1.3.0-beta01.txt
+++ /dev/null
@@ -1,513 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.protolayout.expression {
-
-  public final class AnimationParameterBuilders {
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int REPEAT_MODE_RESTART = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int REPEAT_MODE_REVERSE = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int REPEAT_MODE_UNKNOWN = 0; // 0x0
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class AnimationParameterBuilders.AnimationParameters {
-    method @IntRange(from=0) public long getDelayMillis();
-    method @IntRange(from=0) public long getDurationMillis();
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing? getEasing();
-  }
-
-  public static final class AnimationParameterBuilders.AnimationParameters.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public AnimationParameterBuilders.AnimationParameters.Builder();
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters.Builder setDelayMillis(@IntRange(from=0) long);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters.Builder setDurationMillis(@IntRange(from=0) long);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters.Builder setEasing(androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class AnimationParameterBuilders.AnimationSpec {
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters? getAnimationParameters();
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable? getRepeatable();
-  }
-
-  public static final class AnimationParameterBuilders.AnimationSpec.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public AnimationParameterBuilders.AnimationSpec.Builder();
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setAnimationParameters(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setRepeatable(androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface AnimationParameterBuilders.Easing {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing cubicBezier(float, float, float, float);
-    method public static androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing fromByteArray(byte[]);
-    method public default byte[] toEasingByteArray();
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing FAST_OUT_LINEAR_IN_EASING;
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing FAST_OUT_SLOW_IN_EASING;
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing LINEAR_OUT_SLOW_IN_EASING;
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class AnimationParameterBuilders.Repeatable {
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters? getForwardRepeatOverride();
-    method public int getIterations();
-    method public int getRepeatMode();
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters? getReverseRepeatOverride();
-    method public boolean hasInfiniteIteration();
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable INFINITE_REPEATABLE_WITH_RESTART;
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable INFINITE_REPEATABLE_WITH_REVERSE;
-  }
-
-  public static final class AnimationParameterBuilders.Repeatable.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public AnimationParameterBuilders.Repeatable.Builder();
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable.Builder setForwardRepeatOverride(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable.Builder setIterations(@IntRange(from=1) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable.Builder setRepeatMode(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable.Builder setReverseRepeatOverride(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters);
-  }
-
-  public final class AppDataKey<T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> extends androidx.wear.protolayout.expression.DynamicDataKey<T> {
-    ctor public AppDataKey(String key);
-  }
-
-  public final class AppDataKeyUtil {
-    method public static androidx.wear.protolayout.expression.AppDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> boolAppDataKey(String key);
-    method public static androidx.wear.protolayout.expression.AppDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor> colorAppDataKey(String key);
-    method public static androidx.wear.protolayout.expression.AppDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration> durationAppDataKey(String key);
-    method public static androidx.wear.protolayout.expression.AppDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat> floatAppDataKey(String key);
-    method public static androidx.wear.protolayout.expression.AppDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant> instantAppDataKey(String key);
-    method public static androidx.wear.protolayout.expression.AppDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32> intAppDataKey(String key);
-    method public static androidx.wear.protolayout.expression.AppDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString> stringAppDataKey(String key);
-  }
-
-  public class ConditionScopes {
-  }
-
-  public static class ConditionScopes.ConditionScope<T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType, RawT> {
-    method public androidx.wear.protolayout.expression.ConditionScopes.IfTrueScope<T!,RawT!> use(RawT!);
-    method public androidx.wear.protolayout.expression.ConditionScopes.IfTrueScope<T!,RawT!> use(T!);
-  }
-
-  public static class ConditionScopes.IfTrueScope<T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType, RawT> {
-    method public T! elseUse(RawT!);
-    method public T! elseUse(T!);
-  }
-
-  public final class DynamicBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicBuilders.DynamicBool extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool and(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool constant(boolean);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool eq(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool from(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool!>);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool ne(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool negate();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool or(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method public default byte[] toDynamicBoolByteArray();
-    method public default int toDynamicBoolByteArray(byte[]);
-    method public default int toDynamicBoolByteArray(byte[], int, int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicBuilders.DynamicColor extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor!>);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor!>, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(@ColorInt int, @ColorInt int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(@ColorInt int, @ColorInt int, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor constant(@ColorInt int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor from(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor!>);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.ConditionScopes.ConditionScope<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor!,java.lang.Integer!> onCondition(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method public default byte[] toDynamicColorByteArray();
-    method public default int toDynamicColorByteArray(byte[]);
-    method public default int toDynamicColorByteArray(byte[], int, int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicBuilders.DynamicDuration extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration from(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration!>);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getHoursPart();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getIntDaysPart();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getMinutesPart();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getSecondsPart();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.ConditionScopes.ConditionScope<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration!,java.time.Duration!> onCondition(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method public default byte[] toDynamicDurationByteArray();
-    method public default int toDynamicDurationByteArray(byte[]);
-    method public default int toDynamicDurationByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntDays();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntHours();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntMinutes();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntSeconds();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration withSecondsPrecision(java.time.Duration);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicBuilders.DynamicFloat extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!>);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!>, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 asInt();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat constant(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat div(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat div(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat div(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool eq(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool eq(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat from(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!>);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gt(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gt(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gte(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gte(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lt(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lt(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lte(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lte(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat minus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat minus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat minus(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool ne(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool ne(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.ConditionScopes.ConditionScope<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!,java.lang.Float!> onCondition(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat plus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat plus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat plus(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat rem(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat rem(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat rem(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat times(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat times(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat times(float);
-    method public default byte[] toDynamicFloatByteArray();
-    method public default int toDynamicFloatByteArray(byte[]);
-    method public default int toDynamicFloatByteArray(byte[], int, int);
-  }
-
-  public static class DynamicBuilders.DynamicFloat.FloatFormatter {
-    method @IntRange(from=0) public int getMaxFractionDigits();
-    method @IntRange(from=0) public int getMinFractionDigits();
-    method @IntRange(from=0) public int getMinIntegerDigits();
-    method public boolean isGroupingUsed();
-  }
-
-  public static final class DynamicBuilders.DynamicFloat.FloatFormatter.Builder {
-    ctor public DynamicBuilders.DynamicFloat.FloatFormatter.Builder();
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter.Builder setGroupingUsed(boolean);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter.Builder setMaxFractionDigits(@IntRange(from=0) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter.Builder setMinFractionDigits(@IntRange(from=0) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter.Builder setMinIntegerDigits(@IntRange(from=0) int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicBuilders.DynamicInstant extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration durationUntil(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant from(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant!>);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getDayOfMonth(java.time.ZoneId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getDayOfWeek(java.time.ZoneId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getHour(java.time.ZoneId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getMinute(java.time.ZoneId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getMonth(java.time.ZoneId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getSecond(java.time.ZoneId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getYear(java.time.ZoneId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.ConditionScopes.ConditionScope<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant!,java.time.Instant!> onCondition(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant platformTimeWithSecondsPrecision();
-    method public default byte[] toDynamicInstantByteArray();
-    method public default int toDynamicInstantByteArray(byte[]);
-    method public default int toDynamicInstantByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant withSecondsPrecision(java.time.Instant);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicBuilders.DynamicInt32 extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32!>);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32!>, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(int, int, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat asFloat();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 constant(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat div(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 div(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat div(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 div(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool eq(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool eq(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32.IntFormatter);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 from(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32!>);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gt(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gt(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gte(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gte(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lt(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lt(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lte(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lte(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat minus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 minus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat minus(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 minus(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool ne(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool ne(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.ConditionScopes.ConditionScope<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32!,java.lang.Integer!> onCondition(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat plus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 plus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat plus(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 plus(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat rem(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 rem(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat rem(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 rem(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat times(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 times(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat times(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 times(int);
-    method public default byte[] toDynamicInt32ByteArray();
-    method public default int toDynamicInt32ByteArray(byte[]);
-    method public default int toDynamicInt32ByteArray(byte[], int, int);
-  }
-
-  public static class DynamicBuilders.DynamicInt32.IntFormatter {
-    method @IntRange(from=0) public int getMinIntegerDigits();
-    method public boolean isGroupingUsed();
-  }
-
-  public static final class DynamicBuilders.DynamicInt32.IntFormatter.Builder {
-    ctor public DynamicBuilders.DynamicInt32.IntFormatter.Builder();
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32.IntFormatter build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32.IntFormatter.Builder setGroupingUsed(boolean);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32.IntFormatter.Builder setMinIntegerDigits(@IntRange(from=0) int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicBuilders.DynamicString extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicString concat(androidx.wear.protolayout.expression.DynamicBuilders.DynamicString);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicString constant(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format(String, java.lang.Object!...);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicString from(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString!>);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicString fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicString fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.ConditionScopes.ConditionScope<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString!,java.lang.String!> onCondition(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method public default byte[] toDynamicStringByteArray();
-    method public default int toDynamicStringByteArray(byte[]);
-    method public default int toDynamicStringByteArray(byte[], int, int);
-  }
-
-  public static interface DynamicBuilders.DynamicType {
-  }
-
-  public final class DynamicDataBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicDataBuilders.DynamicDataValue<T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool!> fromBool(boolean);
-    method public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends java.lang.Object!> fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends java.lang.Object!> fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor!> fromColor(@ColorInt int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration!> fromDuration(java.time.Duration);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!> fromFloat(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant!> fromInstant(java.time.Instant);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32!> fromInt(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString!> fromString(String);
-    method public default boolean getBoolValue();
-    method @ColorInt public default int getColorValue();
-    method public default java.time.Duration getDurationValue();
-    method public default float getFloatValue();
-    method public default java.time.Instant getInstantValue();
-    method public default int getIntValue();
-    method public default String getStringValue();
-    method public default boolean hasBoolValue();
-    method public default boolean hasColorValue();
-    method public default boolean hasDurationValue();
-    method public default boolean hasFloatValue();
-    method public default boolean hasInstantValue();
-    method public default boolean hasIntValue();
-    method public default boolean hasStringValue();
-    method public default boolean hasValueOfType(Class<? extends java.lang.Object!>);
-    method public default byte[] toDynamicDataValueByteArray();
-    method public default int toDynamicDataValueByteArray(byte[]);
-    method public default int toDynamicDataValueByteArray(byte[], int, int);
-  }
-
-  public abstract class DynamicDataKey<T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> {
-    method public final String getKey();
-    method public final String getNamespace();
-    property public final String key;
-    property public final String namespace;
-  }
-
-  public class DynamicDataMap {
-    method public final inline operator <reified T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> boolean contains(androidx.wear.protolayout.expression.DynamicDataKey<T> key);
-    method public final <T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> boolean contains(androidx.wear.protolayout.expression.DynamicDataKey<T> key, Class<T> type);
-    method public final operator Boolean? get(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> key);
-    method public final operator android.graphics.Color? get(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor> key);
-    method public final operator java.time.Duration? get(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration> key);
-    method public final operator Float? get(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat> key);
-    method public final operator java.time.Instant? get(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant> key);
-    method public final operator Integer? get(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32> key);
-    method public final operator String? get(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString> key);
-    method public final java.util.Set<java.util.Map.Entry<androidx.wear.protolayout.expression.DynamicDataKey<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>>> getEntries();
-    method public final java.util.Set<androidx.wear.protolayout.expression.DynamicDataKey<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>> getKeys();
-    method public final int getSize();
-    method public final java.util.Collection<androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>> getValues();
-    method public final operator androidx.wear.protolayout.expression.DynamicDataMap plus(androidx.wear.protolayout.expression.DynamicDataMap rhs);
-    property public final java.util.Set<java.util.Map.Entry<androidx.wear.protolayout.expression.DynamicDataKey<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>>> entries;
-    property public final java.util.Set<androidx.wear.protolayout.expression.DynamicDataKey<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>> keys;
-    property public final int size;
-    property public final java.util.Collection<androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>> values;
-  }
-
-  public final class DynamicDataMapUtil {
-    method public static androidx.wear.protolayout.expression.DynamicDataMap dynamicDataMapOf(androidx.wear.protolayout.expression.DynamicDataPair<? extends java.lang.Object?>... pairs);
-    method public static androidx.wear.protolayout.expression.MutableDynamicDataMap mutableDynamicDataMapOf(androidx.wear.protolayout.expression.DynamicDataPair<? extends java.lang.Object?>... pairs);
-  }
-
-  public final class DynamicDataPair<T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> {
-    ctor public DynamicDataPair(androidx.wear.protolayout.expression.DynamicDataKey<T> key, androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T> value);
-    method public kotlin.Pair<androidx.wear.protolayout.expression.DynamicDataKey<T>,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T>> asPair();
-    method public androidx.wear.protolayout.expression.DynamicDataKey<T> getKey();
-    method public androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T> getValue();
-    property public androidx.wear.protolayout.expression.DynamicDataKey<T> key;
-    property public androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T> value;
-  }
-
-  public final class DynamicDataPairUtil {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static infix androidx.wear.protolayout.expression.DynamicDataPair<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> dynamicDataPairOf(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool>, boolean value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static infix androidx.wear.protolayout.expression.DynamicDataPair<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor> dynamicDataPairOf(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor>, android.graphics.Color value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static infix androidx.wear.protolayout.expression.DynamicDataPair<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration> dynamicDataPairOf(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration>, java.time.Duration value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static infix androidx.wear.protolayout.expression.DynamicDataPair<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat> dynamicDataPairOf(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat>, float value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static infix androidx.wear.protolayout.expression.DynamicDataPair<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant> dynamicDataPairOf(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant>, java.time.Instant value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static infix androidx.wear.protolayout.expression.DynamicDataPair<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32> dynamicDataPairOf(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32>, int value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static infix androidx.wear.protolayout.expression.DynamicDataPair<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString> dynamicDataPairOf(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString>, String value);
-  }
-
-  @SuppressCompatibility @RequiresOptIn(level=androidx.annotation.RequiresOptIn.Level.ERROR) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD}) public @interface ExperimentalProtoLayoutExtensionApi {
-  }
-
-  public final class MutableDynamicDataMap extends androidx.wear.protolayout.expression.DynamicDataMap {
-    ctor public MutableDynamicDataMap(androidx.wear.protolayout.expression.DynamicDataPair<? extends java.lang.Object?>... pairs);
-    method public void putAll(androidx.wear.protolayout.expression.DynamicDataMap other);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public operator void set(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> key, boolean value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public operator void set(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor> key, android.graphics.Color value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public operator void set(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration> key, java.time.Duration value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public operator void set(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat> key, float value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public operator void set(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant> key, java.time.Instant value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public operator void set(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32> key, int value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public operator void set(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString> key, String value);
-    method public operator <T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> void set(androidx.wear.protolayout.expression.DynamicDataKey<T> key, androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T> value);
-  }
-
-  public final class PlatformDataKey<T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> extends androidx.wear.protolayout.expression.DynamicDataKey<T!> {
-    ctor public PlatformDataKey(String, String);
-  }
-
-  public final class PlatformDataValues {
-    method public java.util.Map<androidx.wear.protolayout.expression.PlatformDataKey<? extends java.lang.Object!>!,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends java.lang.Object!>!> getAll();
-    method public static <T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> androidx.wear.protolayout.expression.PlatformDataValues of(androidx.wear.protolayout.expression.PlatformDataKey<T!>, androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T!>);
-  }
-
-  public static final class PlatformDataValues.Builder {
-    ctor public PlatformDataValues.Builder();
-    method public androidx.wear.protolayout.expression.PlatformDataValues build();
-    method public <T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> androidx.wear.protolayout.expression.PlatformDataValues.Builder put(androidx.wear.protolayout.expression.PlatformDataKey<T!>, androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T!>);
-    method public androidx.wear.protolayout.expression.PlatformDataValues.Builder putAll(androidx.wear.protolayout.expression.DynamicDataMap);
-    method public androidx.wear.protolayout.expression.PlatformDataValues.Builder putAll(androidx.wear.protolayout.expression.PlatformDataValues);
-  }
-
-  public final class PlatformEventSources {
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=600) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool isLayoutUpdatePending();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool isLayoutVisible();
-    field public static final androidx.wear.protolayout.expression.PlatformEventSources INSTANCE;
-  }
-
-  public static final class PlatformEventSources.Keys {
-    property @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> LAYOUT_UPDATE_PENDING;
-    property public androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> LAYOUT_VISIBILITY;
-    field public static final androidx.wear.protolayout.expression.PlatformEventSources.Keys INSTANCE;
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> LAYOUT_UPDATE_PENDING;
-    field public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> LAYOUT_VISIBILITY;
-  }
-
-  public class PlatformHealthSources {
-    method @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat dailyCalories();
-    method @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat dailyDistanceMeters();
-    method @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat dailyFloors();
-    method @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 dailySteps();
-    method @RequiresPermission(android.Manifest.permission.BODY_SENSORS) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.PlatformHealthSources.DynamicHeartRateAccuracy heartRateAccuracy();
-    method @RequiresPermission(android.Manifest.permission.BODY_SENSORS) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat heartRateBpm();
-    field public static final int HEART_RATE_ACCURACY_HIGH = 5; // 0x5
-    field public static final int HEART_RATE_ACCURACY_LOW = 3; // 0x3
-    field public static final int HEART_RATE_ACCURACY_MEDIUM = 4; // 0x4
-    field public static final int HEART_RATE_ACCURACY_NO_CONTACT = 1; // 0x1
-    field public static final int HEART_RATE_ACCURACY_UNKNOWN = 0; // 0x0
-    field public static final int HEART_RATE_ACCURACY_UNRELIABLE = 2; // 0x2
-  }
-
-  public static final class PlatformHealthSources.DynamicHeartRateAccuracy implements androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.PlatformHealthSources.DynamicHeartRateAccuracy constant(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.PlatformHealthSources.DynamicHeartRateAccuracy!> dynamicDataValueOf(int);
-  }
-
-  public static class PlatformHealthSources.Keys {
-    field @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!> DAILY_CALORIES;
-    field @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!> DAILY_DISTANCE_METERS;
-    field @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!> DAILY_FLOORS;
-    field @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32!> DAILY_STEPS;
-    field @RequiresPermission(android.Manifest.permission.BODY_SENSORS) public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.PlatformHealthSources.DynamicHeartRateAccuracy!> HEART_RATE_ACCURACY;
-    field @RequiresPermission(android.Manifest.permission.BODY_SENSORS) public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!> HEART_RATE_BPM;
-  }
-
-  @SuppressCompatibility @RequiresOptIn(level=androidx.annotation.RequiresOptIn.Level.ERROR) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD}) public @interface ProtoLayoutExperimental {
-  }
-
-  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @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.PARAMETER}) @kotlin.annotation.MustBeDocumented public @interface RequiresSchemaVersion {
-    method public abstract int major();
-    method public abstract int minor();
-  }
-
-  public final class VersionBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class VersionBuilders.VersionInfo implements java.lang.Comparable<androidx.wear.protolayout.expression.VersionBuilders.VersionInfo!> {
-    method public int compareTo(androidx.wear.protolayout.expression.VersionBuilders.VersionInfo);
-    method public int getMajor();
-    method public int getMinor();
-  }
-
-  public static final class VersionBuilders.VersionInfo.Builder {
-    ctor public VersionBuilders.VersionInfo.Builder();
-    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo.Builder setMajor(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo.Builder setMinor(int);
-  }
-
-}
-
-package androidx.wear.protolayout.expression.util {
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public final class DynamicDateFormat {
-    ctor public DynamicDateFormat(String pattern);
-    ctor public DynamicDateFormat(String pattern, optional java.time.ZoneId timeZone);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format(optional androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant instant);
-    method public java.time.ZoneId getTimeZone();
-    method public void setTimeZone(java.time.ZoneId);
-    property public java.time.ZoneId timeZone;
-  }
-
-  public final class DynamicFormatter {
-    ctor public DynamicFormatter();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format(String format, java.lang.Object?... args);
-  }
-
-}
-
diff --git a/wear/protolayout/protolayout-expression/api/res-1.3.0-beta01.txt b/wear/protolayout/protolayout-expression/api/res-1.3.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/wear/protolayout/protolayout-expression/api/res-1.3.0-beta01.txt
+++ /dev/null
diff --git a/wear/protolayout/protolayout-expression/api/restricted_1.3.0-beta01.txt b/wear/protolayout/protolayout-expression/api/restricted_1.3.0-beta01.txt
deleted file mode 100644
index 44784a0..0000000
--- a/wear/protolayout/protolayout-expression/api/restricted_1.3.0-beta01.txt
+++ /dev/null
@@ -1,514 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.protolayout.expression {
-
-  public final class AnimationParameterBuilders {
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int REPEAT_MODE_RESTART = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int REPEAT_MODE_REVERSE = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int REPEAT_MODE_UNKNOWN = 0; // 0x0
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class AnimationParameterBuilders.AnimationParameters {
-    method @IntRange(from=0) public long getDelayMillis();
-    method @IntRange(from=0) public long getDurationMillis();
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing? getEasing();
-  }
-
-  public static final class AnimationParameterBuilders.AnimationParameters.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public AnimationParameterBuilders.AnimationParameters.Builder();
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters.Builder setDelayMillis(@IntRange(from=0) long);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters.Builder setDurationMillis(@IntRange(from=0) long);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters.Builder setEasing(androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class AnimationParameterBuilders.AnimationSpec {
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters? getAnimationParameters();
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable? getRepeatable();
-  }
-
-  public static final class AnimationParameterBuilders.AnimationSpec.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public AnimationParameterBuilders.AnimationSpec.Builder();
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setAnimationParameters(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setRepeatable(androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface AnimationParameterBuilders.Easing {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing cubicBezier(float, float, float, float);
-    method public static androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing fromByteArray(byte[]);
-    method public default byte[] toEasingByteArray();
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing FAST_OUT_LINEAR_IN_EASING;
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing FAST_OUT_SLOW_IN_EASING;
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing LINEAR_OUT_SLOW_IN_EASING;
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class AnimationParameterBuilders.Repeatable {
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters? getForwardRepeatOverride();
-    method public int getIterations();
-    method public int getRepeatMode();
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters? getReverseRepeatOverride();
-    method public boolean hasInfiniteIteration();
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable INFINITE_REPEATABLE_WITH_RESTART;
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable INFINITE_REPEATABLE_WITH_REVERSE;
-  }
-
-  public static final class AnimationParameterBuilders.Repeatable.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public AnimationParameterBuilders.Repeatable.Builder();
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable.Builder setForwardRepeatOverride(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable.Builder setIterations(@IntRange(from=1) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable.Builder setRepeatMode(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable.Builder setReverseRepeatOverride(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationParameters);
-  }
-
-  public final class AppDataKey<T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> extends androidx.wear.protolayout.expression.DynamicDataKey<T> {
-    ctor public AppDataKey(String key);
-  }
-
-  public final class AppDataKeyUtil {
-    method public static androidx.wear.protolayout.expression.AppDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> boolAppDataKey(String key);
-    method public static androidx.wear.protolayout.expression.AppDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor> colorAppDataKey(String key);
-    method public static androidx.wear.protolayout.expression.AppDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration> durationAppDataKey(String key);
-    method public static androidx.wear.protolayout.expression.AppDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat> floatAppDataKey(String key);
-    method public static androidx.wear.protolayout.expression.AppDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant> instantAppDataKey(String key);
-    method public static androidx.wear.protolayout.expression.AppDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32> intAppDataKey(String key);
-    method public static androidx.wear.protolayout.expression.AppDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString> stringAppDataKey(String key);
-  }
-
-  public class ConditionScopes {
-  }
-
-  public static class ConditionScopes.ConditionScope<T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType, RawT> {
-    method public androidx.wear.protolayout.expression.ConditionScopes.IfTrueScope<T!,RawT!> use(RawT!);
-    method public androidx.wear.protolayout.expression.ConditionScopes.IfTrueScope<T!,RawT!> use(T!);
-  }
-
-  public static class ConditionScopes.IfTrueScope<T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType, RawT> {
-    method public T! elseUse(RawT!);
-    method public T! elseUse(T!);
-  }
-
-  public final class DynamicBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicBuilders.DynamicBool extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool and(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool constant(boolean);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool eq(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool from(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool!>);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool ne(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool negate();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool or(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method public default byte[] toDynamicBoolByteArray();
-    method public default int toDynamicBoolByteArray(byte[]);
-    method public default int toDynamicBoolByteArray(byte[], int, int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicBuilders.DynamicColor extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor!>);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor!>, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(@ColorInt int, @ColorInt int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(@ColorInt int, @ColorInt int, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor constant(@ColorInt int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor from(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor!>);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.ConditionScopes.ConditionScope<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor!,java.lang.Integer!> onCondition(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method public default byte[] toDynamicColorByteArray();
-    method public default int toDynamicColorByteArray(byte[]);
-    method public default int toDynamicColorByteArray(byte[], int, int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicBuilders.DynamicDuration extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration from(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration!>);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getHoursPart();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getIntDaysPart();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getMinutesPart();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getSecondsPart();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.ConditionScopes.ConditionScope<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration!,java.time.Duration!> onCondition(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method public default byte[] toDynamicDurationByteArray();
-    method public default int toDynamicDurationByteArray(byte[]);
-    method public default int toDynamicDurationByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntDays();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntHours();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntMinutes();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntSeconds();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration withSecondsPrecision(java.time.Duration);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicBuilders.DynamicFloat extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!>);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!>, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 asInt();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat constant(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat div(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat div(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat div(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool eq(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool eq(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat from(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!>);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gt(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gt(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gte(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gte(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lt(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lt(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lte(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lte(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat minus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat minus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat minus(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool ne(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool ne(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.ConditionScopes.ConditionScope<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!,java.lang.Float!> onCondition(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat plus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat plus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat plus(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat rem(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat rem(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat rem(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat times(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat times(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat times(float);
-    method public default byte[] toDynamicFloatByteArray();
-    method public default int toDynamicFloatByteArray(byte[]);
-    method public default int toDynamicFloatByteArray(byte[], int, int);
-  }
-
-  public static class DynamicBuilders.DynamicFloat.FloatFormatter {
-    method @IntRange(from=0) public int getMaxFractionDigits();
-    method @IntRange(from=0) public int getMinFractionDigits();
-    method @IntRange(from=0) public int getMinIntegerDigits();
-    method public boolean isGroupingUsed();
-  }
-
-  public static final class DynamicBuilders.DynamicFloat.FloatFormatter.Builder {
-    ctor public DynamicBuilders.DynamicFloat.FloatFormatter.Builder();
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter.Builder setGroupingUsed(boolean);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter.Builder setMaxFractionDigits(@IntRange(from=0) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter.Builder setMinFractionDigits(@IntRange(from=0) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter.Builder setMinIntegerDigits(@IntRange(from=0) int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicBuilders.DynamicInstant extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration durationUntil(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant from(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant!>);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getDayOfMonth(java.time.ZoneId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getDayOfWeek(java.time.ZoneId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getHour(java.time.ZoneId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getMinute(java.time.ZoneId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getMonth(java.time.ZoneId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getSecond(java.time.ZoneId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getYear(java.time.ZoneId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.ConditionScopes.ConditionScope<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant!,java.time.Instant!> onCondition(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant platformTimeWithSecondsPrecision();
-    method public default byte[] toDynamicInstantByteArray();
-    method public default int toDynamicInstantByteArray(byte[]);
-    method public default int toDynamicInstantByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant withSecondsPrecision(java.time.Instant);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicBuilders.DynamicInt32 extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32!>);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32!>, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(int, int, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat asFloat();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 constant(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat div(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 div(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat div(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 div(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool eq(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool eq(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32.IntFormatter);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 from(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32!>);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gt(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gt(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gte(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool gte(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lt(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lt(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lte(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool lte(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat minus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 minus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat minus(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 minus(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool ne(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool ne(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.ConditionScopes.ConditionScope<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32!,java.lang.Integer!> onCondition(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat plus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 plus(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat plus(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 plus(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat rem(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 rem(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat rem(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 rem(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat times(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 times(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat times(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 times(int);
-    method public default byte[] toDynamicInt32ByteArray();
-    method public default int toDynamicInt32ByteArray(byte[]);
-    method public default int toDynamicInt32ByteArray(byte[], int, int);
-  }
-
-  public static class DynamicBuilders.DynamicInt32.IntFormatter {
-    method @IntRange(from=0) public int getMinIntegerDigits();
-    method public boolean isGroupingUsed();
-  }
-
-  public static final class DynamicBuilders.DynamicInt32.IntFormatter.Builder {
-    ctor public DynamicBuilders.DynamicInt32.IntFormatter.Builder();
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32.IntFormatter build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32.IntFormatter.Builder setGroupingUsed(boolean);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32.IntFormatter.Builder setMinIntegerDigits(@IntRange(from=0) int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicBuilders.DynamicString extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicString concat(androidx.wear.protolayout.expression.DynamicBuilders.DynamicString);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicString constant(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format(String, java.lang.Object!...);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicString from(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString!>);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicString fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicString fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.ConditionScopes.ConditionScope<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString!,java.lang.String!> onCondition(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method public default byte[] toDynamicStringByteArray();
-    method public default int toDynamicStringByteArray(byte[]);
-    method public default int toDynamicStringByteArray(byte[], int, int);
-  }
-
-  public static interface DynamicBuilders.DynamicType {
-  }
-
-  public final class DynamicDataBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface DynamicDataBuilders.DynamicDataValue<T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool!> fromBool(boolean);
-    method public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends java.lang.Object!> fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends java.lang.Object!> fromByteArray(byte[], int, int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor!> fromColor(@ColorInt int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration!> fromDuration(java.time.Duration);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!> fromFloat(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant!> fromInstant(java.time.Instant);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32!> fromInt(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString!> fromString(String);
-    method public default boolean getBoolValue();
-    method @ColorInt public default int getColorValue();
-    method public default java.time.Duration getDurationValue();
-    method public default float getFloatValue();
-    method public default java.time.Instant getInstantValue();
-    method public default int getIntValue();
-    method public default String getStringValue();
-    method public default boolean hasBoolValue();
-    method public default boolean hasColorValue();
-    method public default boolean hasDurationValue();
-    method public default boolean hasFloatValue();
-    method public default boolean hasInstantValue();
-    method public default boolean hasIntValue();
-    method public default boolean hasStringValue();
-    method public default boolean hasValueOfType(Class<? extends java.lang.Object!>);
-    method public default byte[] toDynamicDataValueByteArray();
-    method public default int toDynamicDataValueByteArray(byte[]);
-    method public default int toDynamicDataValueByteArray(byte[], int, int);
-  }
-
-  public abstract class DynamicDataKey<T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> {
-    method public final String getKey();
-    method public final String getNamespace();
-    property public final String key;
-    property public final String namespace;
-  }
-
-  public class DynamicDataMap {
-    method public final inline operator <reified T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> boolean contains(androidx.wear.protolayout.expression.DynamicDataKey<T> key);
-    method public final <T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> boolean contains(androidx.wear.protolayout.expression.DynamicDataKey<T> key, Class<T> type);
-    method public final operator Boolean? get(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> key);
-    method public final operator android.graphics.Color? get(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor> key);
-    method public final operator java.time.Duration? get(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration> key);
-    method public final operator Float? get(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat> key);
-    method public final operator java.time.Instant? get(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant> key);
-    method public final operator Integer? get(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32> key);
-    method public final operator String? get(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString> key);
-    method public final java.util.Set<java.util.Map.Entry<androidx.wear.protolayout.expression.DynamicDataKey<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>>> getEntries();
-    method public final java.util.Set<androidx.wear.protolayout.expression.DynamicDataKey<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>> getKeys();
-    method public final int getSize();
-    method public final java.util.Collection<androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>> getValues();
-    method public final operator androidx.wear.protolayout.expression.DynamicDataMap plus(androidx.wear.protolayout.expression.DynamicDataMap rhs);
-    property public final java.util.Set<java.util.Map.Entry<androidx.wear.protolayout.expression.DynamicDataKey<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>>> entries;
-    property public final java.util.Set<androidx.wear.protolayout.expression.DynamicDataKey<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>> keys;
-    property public final int size;
-    property public final java.util.Collection<androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType>> values;
-  }
-
-  public final class DynamicDataMapUtil {
-    method public static androidx.wear.protolayout.expression.DynamicDataMap dynamicDataMapOf(androidx.wear.protolayout.expression.DynamicDataPair<? extends java.lang.Object?>... pairs);
-    method public static androidx.wear.protolayout.expression.MutableDynamicDataMap mutableDynamicDataMapOf(androidx.wear.protolayout.expression.DynamicDataPair<? extends java.lang.Object?>... pairs);
-  }
-
-  public final class DynamicDataPair<T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> {
-    ctor public DynamicDataPair(androidx.wear.protolayout.expression.DynamicDataKey<T> key, androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T> value);
-    method public kotlin.Pair<androidx.wear.protolayout.expression.DynamicDataKey<T>,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T>> asPair();
-    method public androidx.wear.protolayout.expression.DynamicDataKey<T> getKey();
-    method public androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T> getValue();
-    property public androidx.wear.protolayout.expression.DynamicDataKey<T> key;
-    property public androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T> value;
-  }
-
-  public final class DynamicDataPairUtil {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static infix androidx.wear.protolayout.expression.DynamicDataPair<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> dynamicDataPairOf(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool>, boolean value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static infix androidx.wear.protolayout.expression.DynamicDataPair<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor> dynamicDataPairOf(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor>, android.graphics.Color value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static infix androidx.wear.protolayout.expression.DynamicDataPair<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration> dynamicDataPairOf(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration>, java.time.Duration value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static infix androidx.wear.protolayout.expression.DynamicDataPair<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat> dynamicDataPairOf(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat>, float value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static infix androidx.wear.protolayout.expression.DynamicDataPair<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant> dynamicDataPairOf(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant>, java.time.Instant value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static infix androidx.wear.protolayout.expression.DynamicDataPair<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32> dynamicDataPairOf(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32>, int value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static infix androidx.wear.protolayout.expression.DynamicDataPair<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString> dynamicDataPairOf(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString>, String value);
-  }
-
-  @SuppressCompatibility @RequiresOptIn(level=androidx.annotation.RequiresOptIn.Level.ERROR) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD}) public @interface ExperimentalProtoLayoutExtensionApi {
-  }
-
-  public final class MutableDynamicDataMap extends androidx.wear.protolayout.expression.DynamicDataMap {
-    ctor public MutableDynamicDataMap(androidx.wear.protolayout.expression.DynamicDataPair<? extends java.lang.Object?>... pairs);
-    method public void putAll(androidx.wear.protolayout.expression.DynamicDataMap other);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public operator void set(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> key, boolean value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public operator void set(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor> key, android.graphics.Color value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public operator void set(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration> key, java.time.Duration value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public operator void set(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat> key, float value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public operator void set(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant> key, java.time.Instant value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public operator void set(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32> key, int value);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public operator void set(androidx.wear.protolayout.expression.DynamicDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicString> key, String value);
-    method public operator <T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> void set(androidx.wear.protolayout.expression.DynamicDataKey<T> key, androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T> value);
-  }
-
-  public final class PlatformDataKey<T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> extends androidx.wear.protolayout.expression.DynamicDataKey<T!> {
-    ctor public PlatformDataKey(String, String);
-  }
-
-  public final class PlatformDataValues {
-    method public java.util.Map<androidx.wear.protolayout.expression.PlatformDataKey<? extends java.lang.Object!>!,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends java.lang.Object!>!> getAll();
-    method public static <T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> androidx.wear.protolayout.expression.PlatformDataValues of(androidx.wear.protolayout.expression.PlatformDataKey<T!>, androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T!>);
-  }
-
-  public static final class PlatformDataValues.Builder {
-    ctor public PlatformDataValues.Builder();
-    method public androidx.wear.protolayout.expression.PlatformDataValues build();
-    method public <T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> androidx.wear.protolayout.expression.PlatformDataValues.Builder put(androidx.wear.protolayout.expression.PlatformDataKey<T!>, androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T!>);
-    method public androidx.wear.protolayout.expression.PlatformDataValues.Builder putAll(androidx.wear.protolayout.expression.DynamicDataMap);
-    method public androidx.wear.protolayout.expression.PlatformDataValues.Builder putAll(androidx.wear.protolayout.expression.PlatformDataValues);
-  }
-
-  public final class PlatformEventSources {
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=600) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool isLayoutUpdatePending();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool isLayoutVisible();
-    field public static final androidx.wear.protolayout.expression.PlatformEventSources INSTANCE;
-  }
-
-  public static final class PlatformEventSources.Keys {
-    property @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> LAYOUT_UPDATE_PENDING;
-    property public androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> LAYOUT_VISIBILITY;
-    field public static final androidx.wear.protolayout.expression.PlatformEventSources.Keys INSTANCE;
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> LAYOUT_UPDATE_PENDING;
-    field public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool> LAYOUT_VISIBILITY;
-  }
-
-  public class PlatformHealthSources {
-    method @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat dailyCalories();
-    method @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat dailyDistanceMeters();
-    method @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat dailyFloors();
-    method @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 dailySteps();
-    method @RequiresPermission(android.Manifest.permission.BODY_SENSORS) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.PlatformHealthSources.DynamicHeartRateAccuracy heartRateAccuracy();
-    method @RequiresPermission(android.Manifest.permission.BODY_SENSORS) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat heartRateBpm();
-    field public static final int HEART_RATE_ACCURACY_HIGH = 5; // 0x5
-    field public static final int HEART_RATE_ACCURACY_LOW = 3; // 0x3
-    field public static final int HEART_RATE_ACCURACY_MEDIUM = 4; // 0x4
-    field public static final int HEART_RATE_ACCURACY_NO_CONTACT = 1; // 0x1
-    field public static final int HEART_RATE_ACCURACY_UNKNOWN = 0; // 0x0
-    field public static final int HEART_RATE_ACCURACY_UNRELIABLE = 2; // 0x2
-  }
-
-  public static final class PlatformHealthSources.DynamicHeartRateAccuracy implements androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.PlatformHealthSources.DynamicHeartRateAccuracy constant(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<androidx.wear.protolayout.expression.PlatformHealthSources.DynamicHeartRateAccuracy!> dynamicDataValueOf(int);
-  }
-
-  public static class PlatformHealthSources.Keys {
-    field @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!> DAILY_CALORIES;
-    field @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!> DAILY_DISTANCE_METERS;
-    field @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!> DAILY_FLOORS;
-    field @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32!> DAILY_STEPS;
-    field @RequiresPermission(android.Manifest.permission.BODY_SENSORS) public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.PlatformHealthSources.DynamicHeartRateAccuracy!> HEART_RATE_ACCURACY;
-    field @RequiresPermission(android.Manifest.permission.BODY_SENSORS) public static final androidx.wear.protolayout.expression.PlatformDataKey<androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat!> HEART_RATE_BPM;
-  }
-
-  @SuppressCompatibility @RequiresOptIn(level=androidx.annotation.RequiresOptIn.Level.ERROR) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD}) public @interface ProtoLayoutExperimental {
-  }
-
-  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @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.PARAMETER}) @kotlin.annotation.MustBeDocumented public @interface RequiresSchemaVersion {
-    method public abstract int major();
-    method public abstract int minor();
-  }
-
-  public final class VersionBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class VersionBuilders.VersionInfo implements java.lang.Comparable<androidx.wear.protolayout.expression.VersionBuilders.VersionInfo!> {
-    method public int compareTo(androidx.wear.protolayout.expression.VersionBuilders.VersionInfo);
-    method public int getMajor();
-    method public int getMinor();
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final androidx.wear.protolayout.expression.VersionBuilders.VersionInfo CURRENT;
-  }
-
-  public static final class VersionBuilders.VersionInfo.Builder {
-    ctor public VersionBuilders.VersionInfo.Builder();
-    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo.Builder setMajor(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo.Builder setMinor(int);
-  }
-
-}
-
-package androidx.wear.protolayout.expression.util {
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public final class DynamicDateFormat {
-    ctor public DynamicDateFormat(String pattern);
-    ctor public DynamicDateFormat(String pattern, optional java.time.ZoneId timeZone);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format(optional androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant instant);
-    method public java.time.ZoneId getTimeZone();
-    method public void setTimeZone(java.time.ZoneId);
-    property public java.time.ZoneId timeZone;
-  }
-
-  public final class DynamicFormatter {
-    ctor public DynamicFormatter();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format(String format, java.lang.Object?... args);
-  }
-
-}
-
diff --git a/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/PlatformEventSources.kt b/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/PlatformEventSources.kt
index f0133e4..8a565f1 100644
--- a/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/PlatformEventSources.kt
+++ b/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/PlatformEventSources.kt
@@ -21,29 +21,17 @@
 /** Dynamic types for platform events */
 public object PlatformEventSources {
 
-    /** A [DynamicBool] which receives the current visibility status from platform. */
-    @RequiresSchemaVersion(major = 1, minor = 500)
-    private val isLayoutVisible: DynamicBool = DynamicBool.from(Keys.LAYOUT_VISIBILITY)
-
     /**
-     * A [DynamicBool] which receives the current state of any pending updates for the current
-     * layout.
-     */
-    @ProtoLayoutExperimental
-    @RequiresSchemaVersion(major = 1, minor = 600)
-    private val isLayoutUpdatePending: DynamicBool = DynamicBool.from(Keys.LAYOUT_UPDATE_PENDING)
-
-    /**
-     * Returns a [DynamicBool] which receives the current visibility status from platform.
+     * Creates a [DynamicBool] which receives the current visibility status from platform.
      *
      * The visibility status value is `true` when layout is visible, and `false` when invisible.
      */
     @JvmStatic
     @RequiresSchemaVersion(major = 1, minor = 500)
-    public fun isLayoutVisible(): DynamicBool = isLayoutVisible
+    public fun isLayoutVisible(): DynamicBool = DynamicBool.from(Keys.LAYOUT_VISIBILITY)
 
     /**
-     * Returns a [DynamicBool] which receives the current state of any pending updates for the
+     * Creates a [DynamicBool] which receives the current state of any pending updates for the
      * current layout.
      *
      * The layout update pending status is `true` from when a new layout is requested until it is
@@ -52,7 +40,7 @@
     @JvmStatic
     @ProtoLayoutExperimental
     @RequiresSchemaVersion(major = 1, minor = 600)
-    public fun isLayoutUpdatePending(): DynamicBool = isLayoutUpdatePending
+    public fun isLayoutUpdatePending(): DynamicBool = DynamicBool.from(Keys.LAYOUT_UPDATE_PENDING)
 
     /** Data sources keys for platform event. */
     public object Keys {
diff --git a/wear/protolayout/protolayout-external-protobuf/api/1.3.0-beta01.txt b/wear/protolayout/protolayout-external-protobuf/api/1.3.0-beta01.txt
deleted file mode 100644
index e6f50d0..0000000
--- a/wear/protolayout/protolayout-external-protobuf/api/1.3.0-beta01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 4.0
diff --git a/wear/protolayout/protolayout-external-protobuf/api/restricted_1.3.0-beta01.txt b/wear/protolayout/protolayout-external-protobuf/api/restricted_1.3.0-beta01.txt
deleted file mode 100644
index e6f50d0..0000000
--- a/wear/protolayout/protolayout-external-protobuf/api/restricted_1.3.0-beta01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 4.0
diff --git a/wear/protolayout/protolayout-material-core/api/1.3.0-beta01.txt b/wear/protolayout/protolayout-material-core/api/1.3.0-beta01.txt
deleted file mode 100644
index e6f50d0..0000000
--- a/wear/protolayout/protolayout-material-core/api/1.3.0-beta01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 4.0
diff --git a/wear/protolayout/protolayout-material-core/api/res-1.3.0-beta01.txt b/wear/protolayout/protolayout-material-core/api/res-1.3.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/wear/protolayout/protolayout-material-core/api/res-1.3.0-beta01.txt
+++ /dev/null
diff --git a/wear/protolayout/protolayout-material-core/api/restricted_1.3.0-beta01.txt b/wear/protolayout/protolayout-material-core/api/restricted_1.3.0-beta01.txt
deleted file mode 100644
index e6f50d0..0000000
--- a/wear/protolayout/protolayout-material-core/api/restricted_1.3.0-beta01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 4.0
diff --git a/wear/protolayout/protolayout-material/api/1.3.0-beta01.txt b/wear/protolayout/protolayout-material/api/1.3.0-beta01.txt
deleted file mode 100644
index c51a973..0000000
--- a/wear/protolayout/protolayout-material/api/1.3.0-beta01.txt
+++ /dev/null
@@ -1,337 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.protolayout.material {
-
-  public class Button implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.Button? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.ButtonColors getButtonColors();
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable getClickable();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getContentDescription();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getCustomContent();
-    method public String? getIconContent();
-    method public String? getImageContent();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension getSize();
-    method public String? getTextContent();
-  }
-
-  public static final class Button.Builder {
-    ctor public Button.Builder(android.content.Context, androidx.wear.protolayout.ModifiersBuilders.Clickable);
-    method public androidx.wear.protolayout.material.Button build();
-    method public androidx.wear.protolayout.material.Button.Builder setButtonColors(androidx.wear.protolayout.material.ButtonColors);
-    method public androidx.wear.protolayout.material.Button.Builder setContentDescription(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method public androidx.wear.protolayout.material.Button.Builder setContentDescription(CharSequence);
-    method public androidx.wear.protolayout.material.Button.Builder setCustomContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.Button.Builder setIconContent(String);
-    method public androidx.wear.protolayout.material.Button.Builder setIconContent(String, androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method public androidx.wear.protolayout.material.Button.Builder setImageContent(String);
-    method public androidx.wear.protolayout.material.Button.Builder setSize(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method public androidx.wear.protolayout.material.Button.Builder setSize(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method public androidx.wear.protolayout.material.Button.Builder setTextContent(String);
-    method public androidx.wear.protolayout.material.Button.Builder setTextContent(String, int);
-  }
-
-  public class ButtonColors {
-    ctor public ButtonColors(androidx.wear.protolayout.ColorBuilders.ColorProp, androidx.wear.protolayout.ColorBuilders.ColorProp);
-    ctor public ButtonColors(@ColorInt int, @ColorInt int);
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getBackgroundColor();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getContentColor();
-    method public static androidx.wear.protolayout.material.ButtonColors primaryButtonColors(androidx.wear.protolayout.material.Colors);
-    method public static androidx.wear.protolayout.material.ButtonColors secondaryButtonColors(androidx.wear.protolayout.material.Colors);
-  }
-
-  public class ButtonDefaults {
-    method public static androidx.wear.protolayout.DimensionBuilders.DpProp recommendedIconSize(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method public static androidx.wear.protolayout.DimensionBuilders.DpProp recommendedIconSize(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp DEFAULT_SIZE;
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp EXTRA_LARGE_SIZE;
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp LARGE_SIZE;
-    field public static final androidx.wear.protolayout.material.ButtonColors PRIMARY_COLORS;
-    field public static final androidx.wear.protolayout.material.ButtonColors SECONDARY_COLORS;
-  }
-
-  public class Chip implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.Chip? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.ChipColors getChipColors();
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable getClickable();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getContentDescription();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getCustomContent();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension getHeight();
-    method public int getHorizontalAlignment();
-    method public String? getIconContent();
-    method public String? getPrimaryLabelContent();
-    method public String? getSecondaryLabelContent();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension getWidth();
-  }
-
-  public static final class Chip.Builder {
-    ctor public Chip.Builder(android.content.Context, androidx.wear.protolayout.ModifiersBuilders.Clickable, androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method public androidx.wear.protolayout.material.Chip build();
-    method public androidx.wear.protolayout.material.Chip.Builder setChipColors(androidx.wear.protolayout.material.ChipColors);
-    method public androidx.wear.protolayout.material.Chip.Builder setContentDescription(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method public androidx.wear.protolayout.material.Chip.Builder setContentDescription(CharSequence);
-    method public androidx.wear.protolayout.material.Chip.Builder setCustomContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.Chip.Builder setHorizontalAlignment(int);
-    method public androidx.wear.protolayout.material.Chip.Builder setIconContent(String);
-    method public androidx.wear.protolayout.material.Chip.Builder setPrimaryLabelContent(String);
-    method public androidx.wear.protolayout.material.Chip.Builder setSecondaryLabelContent(String);
-    method public androidx.wear.protolayout.material.Chip.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-    method public androidx.wear.protolayout.material.Chip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  public class ChipColors {
-    ctor public ChipColors(androidx.wear.protolayout.ColorBuilders.ColorProp, androidx.wear.protolayout.ColorBuilders.ColorProp);
-    ctor public ChipColors(androidx.wear.protolayout.ColorBuilders.ColorProp, androidx.wear.protolayout.ColorBuilders.ColorProp, androidx.wear.protolayout.ColorBuilders.ColorProp, androidx.wear.protolayout.ColorBuilders.ColorProp);
-    ctor public ChipColors(@ColorInt int, @ColorInt int);
-    ctor public ChipColors(@ColorInt int, @ColorInt int, @ColorInt int, @ColorInt int);
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getBackgroundColor();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getContentColor();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getIconColor();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getSecondaryContentColor();
-    method public static androidx.wear.protolayout.material.ChipColors primaryChipColors(androidx.wear.protolayout.material.Colors);
-    method public static androidx.wear.protolayout.material.ChipColors secondaryChipColors(androidx.wear.protolayout.material.Colors);
-  }
-
-  public class ChipDefaults {
-    field public static final androidx.wear.protolayout.material.ChipColors COMPACT_PRIMARY_COLORS;
-    field public static final androidx.wear.protolayout.material.ChipColors COMPACT_SECONDARY_COLORS;
-    field public static final androidx.wear.protolayout.material.ChipColors PRIMARY_COLORS;
-    field public static final androidx.wear.protolayout.material.ChipColors SECONDARY_COLORS;
-    field public static final androidx.wear.protolayout.material.ChipColors TITLE_PRIMARY_COLORS;
-    field public static final androidx.wear.protolayout.material.ChipColors TITLE_SECONDARY_COLORS;
-  }
-
-  public class CircularProgressIndicator implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.CircularProgressIndicator? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.ProgressIndicatorColors getCircularProgressIndicatorColors();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getContentDescription();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getEndAngle();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getProgress();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getStartAngle();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getStrokeWidth();
-    method public boolean isOuterMarginApplied();
-  }
-
-  public static final class CircularProgressIndicator.Builder {
-    ctor public CircularProgressIndicator.Builder();
-    method public androidx.wear.protolayout.material.CircularProgressIndicator build();
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setCircularProgressIndicatorColors(androidx.wear.protolayout.material.ProgressIndicatorColors);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setContentDescription(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setContentDescription(CharSequence);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setEndAngle(float);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setOuterMarginApplied(boolean);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setProgress(androidx.wear.protolayout.TypeBuilders.FloatProp);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setProgress(@FloatRange(from=0, to=1) float);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setStartAngle(float);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setStrokeWidth(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setStrokeWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  public class Colors {
-    ctor public Colors(@ColorInt int, @ColorInt int, @ColorInt int, @ColorInt int);
-    method @ColorInt public int getOnPrimary();
-    method @ColorInt public int getOnSurface();
-    method @ColorInt public int getPrimary();
-    method @ColorInt public int getSurface();
-    field public static final androidx.wear.protolayout.material.Colors DEFAULT;
-  }
-
-  public class CompactChip implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.CompactChip? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.ChipColors getChipColors();
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable getClickable();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getContentDescription();
-    method public String? getIconContent();
-    method public String getText();
-    method public boolean hasText();
-  }
-
-  public static final class CompactChip.Builder {
-    ctor public CompactChip.Builder(android.content.Context, androidx.wear.protolayout.ModifiersBuilders.Clickable, androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    ctor public CompactChip.Builder(android.content.Context, String, androidx.wear.protolayout.ModifiersBuilders.Clickable, androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method public androidx.wear.protolayout.material.CompactChip build();
-    method public androidx.wear.protolayout.material.CompactChip.Builder setChipColors(androidx.wear.protolayout.material.ChipColors);
-    method public androidx.wear.protolayout.material.CompactChip.Builder setContentDescription(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method public androidx.wear.protolayout.material.CompactChip.Builder setContentDescription(CharSequence);
-    method public androidx.wear.protolayout.material.CompactChip.Builder setIconContent(String);
-    method public androidx.wear.protolayout.material.CompactChip.Builder setTextContent(String);
-  }
-
-  public class ProgressIndicatorColors {
-    ctor public ProgressIndicatorColors(androidx.wear.protolayout.ColorBuilders.ColorProp, androidx.wear.protolayout.ColorBuilders.ColorProp);
-    ctor public ProgressIndicatorColors(@ColorInt int, @ColorInt int);
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getIndicatorColor();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getTrackColor();
-    method public static androidx.wear.protolayout.material.ProgressIndicatorColors progressIndicatorColors(androidx.wear.protolayout.material.Colors);
-  }
-
-  public class ProgressIndicatorDefaults {
-    field public static final androidx.wear.protolayout.material.ProgressIndicatorColors DEFAULT_COLORS;
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp DEFAULT_STROKE_WIDTH;
-    field public static final float GAP_END_ANGLE = 156.1f;
-    field public static final float GAP_START_ANGLE = -156.1f;
-  }
-
-  public class Text implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.Text? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getColor();
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle getFontStyle();
-    method public float getLineHeight();
-    method public int getMaxLines();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers getModifiers();
-    method public int getMultilineAlignment();
-    method public int getOverflow();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp getText();
-    method public int getWeight();
-    method public boolean isItalic();
-    method public boolean isUnderline();
-  }
-
-  public static final class Text.Builder {
-    ctor public Text.Builder(android.content.Context, androidx.wear.protolayout.TypeBuilders.StringProp, androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint);
-    ctor public Text.Builder(android.content.Context, String);
-    method public androidx.wear.protolayout.material.Text build();
-    method public androidx.wear.protolayout.material.Text.Builder setColor(androidx.wear.protolayout.ColorBuilders.ColorProp);
-    method public androidx.wear.protolayout.material.Text.Builder setItalic(boolean);
-    method public androidx.wear.protolayout.material.Text.Builder setMaxLines(@IntRange(from=1) int);
-    method public androidx.wear.protolayout.material.Text.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method public androidx.wear.protolayout.material.Text.Builder setMultilineAlignment(int);
-    method public androidx.wear.protolayout.material.Text.Builder setOverflow(int);
-    method public androidx.wear.protolayout.material.Text.Builder setScalable(boolean);
-    method public androidx.wear.protolayout.material.Text.Builder setTypography(int);
-    method public androidx.wear.protolayout.material.Text.Builder setUnderline(boolean);
-    method public androidx.wear.protolayout.material.Text.Builder setWeight(int);
-  }
-
-  public class TitleChip implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.TitleChip? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.ChipColors getChipColors();
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable getClickable();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getContentDescription();
-    method public int getHorizontalAlignment();
-    method public String? getIconContent();
-    method public String getText();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension getWidth();
-  }
-
-  public static final class TitleChip.Builder {
-    ctor public TitleChip.Builder(android.content.Context, String, androidx.wear.protolayout.ModifiersBuilders.Clickable, androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method public androidx.wear.protolayout.material.TitleChip build();
-    method public androidx.wear.protolayout.material.TitleChip.Builder setChipColors(androidx.wear.protolayout.material.ChipColors);
-    method public androidx.wear.protolayout.material.TitleChip.Builder setContentDescription(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method public androidx.wear.protolayout.material.TitleChip.Builder setContentDescription(CharSequence);
-    method public androidx.wear.protolayout.material.TitleChip.Builder setHorizontalAlignment(int);
-    method public androidx.wear.protolayout.material.TitleChip.Builder setIconContent(String);
-    method public androidx.wear.protolayout.material.TitleChip.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-    method public androidx.wear.protolayout.material.TitleChip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  public class Typography {
-    field public static final int TYPOGRAPHY_BODY1 = 7; // 0x7
-    field public static final int TYPOGRAPHY_BODY2 = 8; // 0x8
-    field public static final int TYPOGRAPHY_BUTTON = 9; // 0x9
-    field public static final int TYPOGRAPHY_CAPTION1 = 10; // 0xa
-    field public static final int TYPOGRAPHY_CAPTION2 = 11; // 0xb
-    field public static final int TYPOGRAPHY_CAPTION3 = 12; // 0xc
-    field public static final int TYPOGRAPHY_DISPLAY1 = 1; // 0x1
-    field public static final int TYPOGRAPHY_DISPLAY2 = 2; // 0x2
-    field public static final int TYPOGRAPHY_DISPLAY3 = 3; // 0x3
-    field public static final int TYPOGRAPHY_TITLE1 = 4; // 0x4
-    field public static final int TYPOGRAPHY_TITLE2 = 5; // 0x5
-    field public static final int TYPOGRAPHY_TITLE3 = 6; // 0x6
-  }
-
-}
-
-package androidx.wear.protolayout.material.layouts {
-
-  public class EdgeContentLayout implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.layouts.EdgeContentLayout? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getContent();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getContentAndSecondaryLabelSpacing();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getEdgeContent();
-    method public float getEdgeContentThickness();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getPrimaryLabelTextContent();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getSecondaryLabelTextContent();
-    method public boolean isEdgeContentBehindAllOtherContent();
-    method public boolean isResponsiveContentInsetEnabled();
-  }
-
-  public static final class EdgeContentLayout.Builder {
-    ctor public EdgeContentLayout.Builder(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout build();
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setContentAndSecondaryLabelSpacing(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setEdgeContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setEdgeContentBehindAllOtherContent(boolean);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setEdgeContentThickness(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setPrimaryLabelTextContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setResponsiveContentInsetEnabled(boolean);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setSecondaryLabelTextContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-  }
-
-  public class LayoutDefaults {
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp DEFAULT_LARGE_VERTICAL_SPACER_HEIGHT;
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp DEFAULT_VERTICAL_SPACER_HEIGHT;
-    field public static final float EDGE_CONTENT_LAYOUT_PADDING_ABOVE_MAIN_CONTENT_DP = 6.0f;
-    field public static final float EDGE_CONTENT_LAYOUT_PADDING_BELOW_MAIN_CONTENT_DP = 8.0f;
-    field @Deprecated public static final int MULTI_BUTTON_MAX_NUMBER = 7; // 0x7
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp MULTI_SLOT_LAYOUT_HORIZONTAL_SPACER_WIDTH;
-  }
-
-  public static final class LayoutDefaults.MultiButtonLayoutDefaults {
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp BUTTON_SIZE_FOR_1_BUTTON;
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp BUTTON_SIZE_FOR_2_BUTTONS;
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp BUTTON_SIZE_FOR_3_PLUS_BUTTONS;
-    field public static final int MAX_BUTTONS = 7; // 0x7
-  }
-
-  public class MultiButtonLayout implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.layouts.MultiButtonLayout? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.LayoutElement!> getButtonContents();
-    method public int getFiveButtonDistribution();
-    field public static final int FIVE_BUTTON_DISTRIBUTION_BOTTOM_HEAVY = 2; // 0x2
-    field public static final int FIVE_BUTTON_DISTRIBUTION_TOP_HEAVY = 1; // 0x1
-  }
-
-  public static final class MultiButtonLayout.Builder {
-    ctor public MultiButtonLayout.Builder();
-    method public androidx.wear.protolayout.material.layouts.MultiButtonLayout.Builder addButtonContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.MultiButtonLayout build();
-    method public androidx.wear.protolayout.material.layouts.MultiButtonLayout.Builder setFiveButtonDistribution(int);
-  }
-
-  public class MultiSlotLayout implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.layouts.MultiSlotLayout? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getHorizontalSpacerWidth();
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.LayoutElement!> getSlotContents();
-  }
-
-  public static final class MultiSlotLayout.Builder {
-    ctor public MultiSlotLayout.Builder();
-    method public androidx.wear.protolayout.material.layouts.MultiSlotLayout.Builder addSlotContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.MultiSlotLayout build();
-    method public androidx.wear.protolayout.material.layouts.MultiSlotLayout.Builder setHorizontalSpacerWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  public class PrimaryLayout implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.layouts.PrimaryLayout? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getContent();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getPrimaryChipContent();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getPrimaryLabelTextContent();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getSecondaryLabelTextContent();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getVerticalSpacerHeight();
-    method public boolean isResponsiveContentInsetEnabled();
-  }
-
-  public static final class PrimaryLayout.Builder {
-    ctor public PrimaryLayout.Builder(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method public androidx.wear.protolayout.material.layouts.PrimaryLayout build();
-    method public androidx.wear.protolayout.material.layouts.PrimaryLayout.Builder setContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.PrimaryLayout.Builder setPrimaryChipContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.PrimaryLayout.Builder setPrimaryLabelTextContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.PrimaryLayout.Builder setResponsiveContentInsetEnabled(boolean);
-    method public androidx.wear.protolayout.material.layouts.PrimaryLayout.Builder setSecondaryLabelTextContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.PrimaryLayout.Builder setVerticalSpacerHeight(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-}
-
diff --git a/wear/protolayout/protolayout-material/api/res-1.3.0-beta01.txt b/wear/protolayout/protolayout-material/api/res-1.3.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/wear/protolayout/protolayout-material/api/res-1.3.0-beta01.txt
+++ /dev/null
diff --git a/wear/protolayout/protolayout-material/api/restricted_1.3.0-beta01.txt b/wear/protolayout/protolayout-material/api/restricted_1.3.0-beta01.txt
deleted file mode 100644
index c51a973..0000000
--- a/wear/protolayout/protolayout-material/api/restricted_1.3.0-beta01.txt
+++ /dev/null
@@ -1,337 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.protolayout.material {
-
-  public class Button implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.Button? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.ButtonColors getButtonColors();
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable getClickable();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getContentDescription();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getCustomContent();
-    method public String? getIconContent();
-    method public String? getImageContent();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension getSize();
-    method public String? getTextContent();
-  }
-
-  public static final class Button.Builder {
-    ctor public Button.Builder(android.content.Context, androidx.wear.protolayout.ModifiersBuilders.Clickable);
-    method public androidx.wear.protolayout.material.Button build();
-    method public androidx.wear.protolayout.material.Button.Builder setButtonColors(androidx.wear.protolayout.material.ButtonColors);
-    method public androidx.wear.protolayout.material.Button.Builder setContentDescription(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method public androidx.wear.protolayout.material.Button.Builder setContentDescription(CharSequence);
-    method public androidx.wear.protolayout.material.Button.Builder setCustomContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.Button.Builder setIconContent(String);
-    method public androidx.wear.protolayout.material.Button.Builder setIconContent(String, androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method public androidx.wear.protolayout.material.Button.Builder setImageContent(String);
-    method public androidx.wear.protolayout.material.Button.Builder setSize(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method public androidx.wear.protolayout.material.Button.Builder setSize(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method public androidx.wear.protolayout.material.Button.Builder setTextContent(String);
-    method public androidx.wear.protolayout.material.Button.Builder setTextContent(String, int);
-  }
-
-  public class ButtonColors {
-    ctor public ButtonColors(androidx.wear.protolayout.ColorBuilders.ColorProp, androidx.wear.protolayout.ColorBuilders.ColorProp);
-    ctor public ButtonColors(@ColorInt int, @ColorInt int);
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getBackgroundColor();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getContentColor();
-    method public static androidx.wear.protolayout.material.ButtonColors primaryButtonColors(androidx.wear.protolayout.material.Colors);
-    method public static androidx.wear.protolayout.material.ButtonColors secondaryButtonColors(androidx.wear.protolayout.material.Colors);
-  }
-
-  public class ButtonDefaults {
-    method public static androidx.wear.protolayout.DimensionBuilders.DpProp recommendedIconSize(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method public static androidx.wear.protolayout.DimensionBuilders.DpProp recommendedIconSize(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp DEFAULT_SIZE;
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp EXTRA_LARGE_SIZE;
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp LARGE_SIZE;
-    field public static final androidx.wear.protolayout.material.ButtonColors PRIMARY_COLORS;
-    field public static final androidx.wear.protolayout.material.ButtonColors SECONDARY_COLORS;
-  }
-
-  public class Chip implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.Chip? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.ChipColors getChipColors();
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable getClickable();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getContentDescription();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getCustomContent();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension getHeight();
-    method public int getHorizontalAlignment();
-    method public String? getIconContent();
-    method public String? getPrimaryLabelContent();
-    method public String? getSecondaryLabelContent();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension getWidth();
-  }
-
-  public static final class Chip.Builder {
-    ctor public Chip.Builder(android.content.Context, androidx.wear.protolayout.ModifiersBuilders.Clickable, androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method public androidx.wear.protolayout.material.Chip build();
-    method public androidx.wear.protolayout.material.Chip.Builder setChipColors(androidx.wear.protolayout.material.ChipColors);
-    method public androidx.wear.protolayout.material.Chip.Builder setContentDescription(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method public androidx.wear.protolayout.material.Chip.Builder setContentDescription(CharSequence);
-    method public androidx.wear.protolayout.material.Chip.Builder setCustomContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.Chip.Builder setHorizontalAlignment(int);
-    method public androidx.wear.protolayout.material.Chip.Builder setIconContent(String);
-    method public androidx.wear.protolayout.material.Chip.Builder setPrimaryLabelContent(String);
-    method public androidx.wear.protolayout.material.Chip.Builder setSecondaryLabelContent(String);
-    method public androidx.wear.protolayout.material.Chip.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-    method public androidx.wear.protolayout.material.Chip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  public class ChipColors {
-    ctor public ChipColors(androidx.wear.protolayout.ColorBuilders.ColorProp, androidx.wear.protolayout.ColorBuilders.ColorProp);
-    ctor public ChipColors(androidx.wear.protolayout.ColorBuilders.ColorProp, androidx.wear.protolayout.ColorBuilders.ColorProp, androidx.wear.protolayout.ColorBuilders.ColorProp, androidx.wear.protolayout.ColorBuilders.ColorProp);
-    ctor public ChipColors(@ColorInt int, @ColorInt int);
-    ctor public ChipColors(@ColorInt int, @ColorInt int, @ColorInt int, @ColorInt int);
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getBackgroundColor();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getContentColor();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getIconColor();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getSecondaryContentColor();
-    method public static androidx.wear.protolayout.material.ChipColors primaryChipColors(androidx.wear.protolayout.material.Colors);
-    method public static androidx.wear.protolayout.material.ChipColors secondaryChipColors(androidx.wear.protolayout.material.Colors);
-  }
-
-  public class ChipDefaults {
-    field public static final androidx.wear.protolayout.material.ChipColors COMPACT_PRIMARY_COLORS;
-    field public static final androidx.wear.protolayout.material.ChipColors COMPACT_SECONDARY_COLORS;
-    field public static final androidx.wear.protolayout.material.ChipColors PRIMARY_COLORS;
-    field public static final androidx.wear.protolayout.material.ChipColors SECONDARY_COLORS;
-    field public static final androidx.wear.protolayout.material.ChipColors TITLE_PRIMARY_COLORS;
-    field public static final androidx.wear.protolayout.material.ChipColors TITLE_SECONDARY_COLORS;
-  }
-
-  public class CircularProgressIndicator implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.CircularProgressIndicator? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.ProgressIndicatorColors getCircularProgressIndicatorColors();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getContentDescription();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getEndAngle();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getProgress();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getStartAngle();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getStrokeWidth();
-    method public boolean isOuterMarginApplied();
-  }
-
-  public static final class CircularProgressIndicator.Builder {
-    ctor public CircularProgressIndicator.Builder();
-    method public androidx.wear.protolayout.material.CircularProgressIndicator build();
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setCircularProgressIndicatorColors(androidx.wear.protolayout.material.ProgressIndicatorColors);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setContentDescription(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setContentDescription(CharSequence);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setEndAngle(float);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setOuterMarginApplied(boolean);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setProgress(androidx.wear.protolayout.TypeBuilders.FloatProp);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setProgress(@FloatRange(from=0, to=1) float);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setStartAngle(float);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setStrokeWidth(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method public androidx.wear.protolayout.material.CircularProgressIndicator.Builder setStrokeWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  public class Colors {
-    ctor public Colors(@ColorInt int, @ColorInt int, @ColorInt int, @ColorInt int);
-    method @ColorInt public int getOnPrimary();
-    method @ColorInt public int getOnSurface();
-    method @ColorInt public int getPrimary();
-    method @ColorInt public int getSurface();
-    field public static final androidx.wear.protolayout.material.Colors DEFAULT;
-  }
-
-  public class CompactChip implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.CompactChip? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.ChipColors getChipColors();
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable getClickable();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getContentDescription();
-    method public String? getIconContent();
-    method public String getText();
-    method public boolean hasText();
-  }
-
-  public static final class CompactChip.Builder {
-    ctor public CompactChip.Builder(android.content.Context, androidx.wear.protolayout.ModifiersBuilders.Clickable, androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    ctor public CompactChip.Builder(android.content.Context, String, androidx.wear.protolayout.ModifiersBuilders.Clickable, androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method public androidx.wear.protolayout.material.CompactChip build();
-    method public androidx.wear.protolayout.material.CompactChip.Builder setChipColors(androidx.wear.protolayout.material.ChipColors);
-    method public androidx.wear.protolayout.material.CompactChip.Builder setContentDescription(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method public androidx.wear.protolayout.material.CompactChip.Builder setContentDescription(CharSequence);
-    method public androidx.wear.protolayout.material.CompactChip.Builder setIconContent(String);
-    method public androidx.wear.protolayout.material.CompactChip.Builder setTextContent(String);
-  }
-
-  public class ProgressIndicatorColors {
-    ctor public ProgressIndicatorColors(androidx.wear.protolayout.ColorBuilders.ColorProp, androidx.wear.protolayout.ColorBuilders.ColorProp);
-    ctor public ProgressIndicatorColors(@ColorInt int, @ColorInt int);
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getIndicatorColor();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getTrackColor();
-    method public static androidx.wear.protolayout.material.ProgressIndicatorColors progressIndicatorColors(androidx.wear.protolayout.material.Colors);
-  }
-
-  public class ProgressIndicatorDefaults {
-    field public static final androidx.wear.protolayout.material.ProgressIndicatorColors DEFAULT_COLORS;
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp DEFAULT_STROKE_WIDTH;
-    field public static final float GAP_END_ANGLE = 156.1f;
-    field public static final float GAP_START_ANGLE = -156.1f;
-  }
-
-  public class Text implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.Text? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getColor();
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle getFontStyle();
-    method public float getLineHeight();
-    method public int getMaxLines();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers getModifiers();
-    method public int getMultilineAlignment();
-    method public int getOverflow();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp getText();
-    method public int getWeight();
-    method public boolean isItalic();
-    method public boolean isUnderline();
-  }
-
-  public static final class Text.Builder {
-    ctor public Text.Builder(android.content.Context, androidx.wear.protolayout.TypeBuilders.StringProp, androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint);
-    ctor public Text.Builder(android.content.Context, String);
-    method public androidx.wear.protolayout.material.Text build();
-    method public androidx.wear.protolayout.material.Text.Builder setColor(androidx.wear.protolayout.ColorBuilders.ColorProp);
-    method public androidx.wear.protolayout.material.Text.Builder setItalic(boolean);
-    method public androidx.wear.protolayout.material.Text.Builder setMaxLines(@IntRange(from=1) int);
-    method public androidx.wear.protolayout.material.Text.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method public androidx.wear.protolayout.material.Text.Builder setMultilineAlignment(int);
-    method public androidx.wear.protolayout.material.Text.Builder setOverflow(int);
-    method public androidx.wear.protolayout.material.Text.Builder setScalable(boolean);
-    method public androidx.wear.protolayout.material.Text.Builder setTypography(int);
-    method public androidx.wear.protolayout.material.Text.Builder setUnderline(boolean);
-    method public androidx.wear.protolayout.material.Text.Builder setWeight(int);
-  }
-
-  public class TitleChip implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.TitleChip? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.ChipColors getChipColors();
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable getClickable();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getContentDescription();
-    method public int getHorizontalAlignment();
-    method public String? getIconContent();
-    method public String getText();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension getWidth();
-  }
-
-  public static final class TitleChip.Builder {
-    ctor public TitleChip.Builder(android.content.Context, String, androidx.wear.protolayout.ModifiersBuilders.Clickable, androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method public androidx.wear.protolayout.material.TitleChip build();
-    method public androidx.wear.protolayout.material.TitleChip.Builder setChipColors(androidx.wear.protolayout.material.ChipColors);
-    method public androidx.wear.protolayout.material.TitleChip.Builder setContentDescription(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method public androidx.wear.protolayout.material.TitleChip.Builder setContentDescription(CharSequence);
-    method public androidx.wear.protolayout.material.TitleChip.Builder setHorizontalAlignment(int);
-    method public androidx.wear.protolayout.material.TitleChip.Builder setIconContent(String);
-    method public androidx.wear.protolayout.material.TitleChip.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-    method public androidx.wear.protolayout.material.TitleChip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  public class Typography {
-    field public static final int TYPOGRAPHY_BODY1 = 7; // 0x7
-    field public static final int TYPOGRAPHY_BODY2 = 8; // 0x8
-    field public static final int TYPOGRAPHY_BUTTON = 9; // 0x9
-    field public static final int TYPOGRAPHY_CAPTION1 = 10; // 0xa
-    field public static final int TYPOGRAPHY_CAPTION2 = 11; // 0xb
-    field public static final int TYPOGRAPHY_CAPTION3 = 12; // 0xc
-    field public static final int TYPOGRAPHY_DISPLAY1 = 1; // 0x1
-    field public static final int TYPOGRAPHY_DISPLAY2 = 2; // 0x2
-    field public static final int TYPOGRAPHY_DISPLAY3 = 3; // 0x3
-    field public static final int TYPOGRAPHY_TITLE1 = 4; // 0x4
-    field public static final int TYPOGRAPHY_TITLE2 = 5; // 0x5
-    field public static final int TYPOGRAPHY_TITLE3 = 6; // 0x6
-  }
-
-}
-
-package androidx.wear.protolayout.material.layouts {
-
-  public class EdgeContentLayout implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.layouts.EdgeContentLayout? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getContent();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getContentAndSecondaryLabelSpacing();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getEdgeContent();
-    method public float getEdgeContentThickness();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getPrimaryLabelTextContent();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getSecondaryLabelTextContent();
-    method public boolean isEdgeContentBehindAllOtherContent();
-    method public boolean isResponsiveContentInsetEnabled();
-  }
-
-  public static final class EdgeContentLayout.Builder {
-    ctor public EdgeContentLayout.Builder(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout build();
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setContentAndSecondaryLabelSpacing(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setEdgeContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setEdgeContentBehindAllOtherContent(boolean);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setEdgeContentThickness(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setPrimaryLabelTextContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setResponsiveContentInsetEnabled(boolean);
-    method public androidx.wear.protolayout.material.layouts.EdgeContentLayout.Builder setSecondaryLabelTextContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-  }
-
-  public class LayoutDefaults {
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp DEFAULT_LARGE_VERTICAL_SPACER_HEIGHT;
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp DEFAULT_VERTICAL_SPACER_HEIGHT;
-    field public static final float EDGE_CONTENT_LAYOUT_PADDING_ABOVE_MAIN_CONTENT_DP = 6.0f;
-    field public static final float EDGE_CONTENT_LAYOUT_PADDING_BELOW_MAIN_CONTENT_DP = 8.0f;
-    field @Deprecated public static final int MULTI_BUTTON_MAX_NUMBER = 7; // 0x7
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp MULTI_SLOT_LAYOUT_HORIZONTAL_SPACER_WIDTH;
-  }
-
-  public static final class LayoutDefaults.MultiButtonLayoutDefaults {
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp BUTTON_SIZE_FOR_1_BUTTON;
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp BUTTON_SIZE_FOR_2_BUTTONS;
-    field public static final androidx.wear.protolayout.DimensionBuilders.DpProp BUTTON_SIZE_FOR_3_PLUS_BUTTONS;
-    field public static final int MAX_BUTTONS = 7; // 0x7
-  }
-
-  public class MultiButtonLayout implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.layouts.MultiButtonLayout? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.LayoutElement!> getButtonContents();
-    method public int getFiveButtonDistribution();
-    field public static final int FIVE_BUTTON_DISTRIBUTION_BOTTOM_HEAVY = 2; // 0x2
-    field public static final int FIVE_BUTTON_DISTRIBUTION_TOP_HEAVY = 1; // 0x1
-  }
-
-  public static final class MultiButtonLayout.Builder {
-    ctor public MultiButtonLayout.Builder();
-    method public androidx.wear.protolayout.material.layouts.MultiButtonLayout.Builder addButtonContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.MultiButtonLayout build();
-    method public androidx.wear.protolayout.material.layouts.MultiButtonLayout.Builder setFiveButtonDistribution(int);
-  }
-
-  public class MultiSlotLayout implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.layouts.MultiSlotLayout? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getHorizontalSpacerWidth();
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.LayoutElement!> getSlotContents();
-  }
-
-  public static final class MultiSlotLayout.Builder {
-    ctor public MultiSlotLayout.Builder();
-    method public androidx.wear.protolayout.material.layouts.MultiSlotLayout.Builder addSlotContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.MultiSlotLayout build();
-    method public androidx.wear.protolayout.material.layouts.MultiSlotLayout.Builder setHorizontalSpacerWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  public class PrimaryLayout implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public static androidx.wear.protolayout.material.layouts.PrimaryLayout? fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getContent();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getPrimaryChipContent();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getPrimaryLabelTextContent();
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getSecondaryLabelTextContent();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getVerticalSpacerHeight();
-    method public boolean isResponsiveContentInsetEnabled();
-  }
-
-  public static final class PrimaryLayout.Builder {
-    ctor public PrimaryLayout.Builder(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method public androidx.wear.protolayout.material.layouts.PrimaryLayout build();
-    method public androidx.wear.protolayout.material.layouts.PrimaryLayout.Builder setContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.PrimaryLayout.Builder setPrimaryChipContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.PrimaryLayout.Builder setPrimaryLabelTextContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.PrimaryLayout.Builder setResponsiveContentInsetEnabled(boolean);
-    method public androidx.wear.protolayout.material.layouts.PrimaryLayout.Builder setSecondaryLabelTextContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.material.layouts.PrimaryLayout.Builder setVerticalSpacerHeight(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-}
-
diff --git a/wear/protolayout/protolayout-material3/api/1.3.0-beta01.txt b/wear/protolayout/protolayout-material3/api/1.3.0-beta01.txt
deleted file mode 100644
index 0f3c820..0000000
--- a/wear/protolayout/protolayout-material3/api/1.3.0-beta01.txt
+++ /dev/null
@@ -1,408 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.protolayout.material3 {
-
-  public final class AppCardStyle {
-    field public static final androidx.wear.protolayout.material3.AppCardStyle.Companion Companion;
-  }
-
-  public static final class AppCardStyle.Companion {
-    method public androidx.wear.protolayout.material3.AppCardStyle defaultAppCardStyle();
-    method public androidx.wear.protolayout.material3.AppCardStyle largeAppCardStyle();
-    method public androidx.wear.protolayout.material3.AppCardStyle smallAppCardStyle();
-  }
-
-  public final class AvatarButtonStyle {
-    field public static final androidx.wear.protolayout.material3.AvatarButtonStyle.Companion Companion;
-  }
-
-  public static final class AvatarButtonStyle.Companion {
-    method public androidx.wear.protolayout.material3.AvatarButtonStyle defaultAvatarButtonStyle();
-    method public androidx.wear.protolayout.material3.AvatarButtonStyle largeAvatarButtonStyle();
-  }
-
-  public final class ButtonColors {
-    ctor public ButtonColors();
-    ctor public ButtonColors(optional androidx.wear.protolayout.types.LayoutColor containerColor, optional androidx.wear.protolayout.types.LayoutColor iconColor, optional androidx.wear.protolayout.types.LayoutColor labelColor, optional androidx.wear.protolayout.types.LayoutColor secondaryLabelColor);
-    method public androidx.wear.protolayout.material3.ButtonColors copy(optional androidx.wear.protolayout.types.LayoutColor containerColor, optional androidx.wear.protolayout.types.LayoutColor iconColor, optional androidx.wear.protolayout.types.LayoutColor labelColor, optional androidx.wear.protolayout.types.LayoutColor secondaryLabelColor);
-    method public androidx.wear.protolayout.types.LayoutColor getContainerColor();
-    method public androidx.wear.protolayout.types.LayoutColor getIconColor();
-    method public androidx.wear.protolayout.types.LayoutColor getLabelColor();
-    method public androidx.wear.protolayout.types.LayoutColor getSecondaryLabelColor();
-    property public androidx.wear.protolayout.types.LayoutColor containerColor;
-    property public androidx.wear.protolayout.types.LayoutColor iconColor;
-    property public androidx.wear.protolayout.types.LayoutColor labelColor;
-    property public androidx.wear.protolayout.types.LayoutColor secondaryLabelColor;
-  }
-
-  public final class ButtonDefaults {
-    method public androidx.wear.protolayout.material3.ButtonColors filledButtonColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.material3.ButtonColors filledTonalButtonColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.material3.ButtonColors filledVariantButtonColors(androidx.wear.protolayout.material3.MaterialScope);
-    field public static final androidx.wear.protolayout.material3.ButtonDefaults INSTANCE;
-  }
-
-  public final class ButtonGroupDefaults {
-    property public androidx.wear.protolayout.LayoutElementBuilders.Spacer DEFAULT_SPACER_BETWEEN_BUTTON_GROUPS;
-    property @Dimension(unit=androidx.annotation.Dimension.Companion.DP) public static float DEFAULT_SPACER_WIDTH_DP;
-    field public static final androidx.wear.protolayout.LayoutElementBuilders.Spacer DEFAULT_SPACER_BETWEEN_BUTTON_GROUPS;
-    field @Dimension(unit=androidx.annotation.Dimension.Companion.DP) public static final float DEFAULT_SPACER_WIDTH_DP = 4.0f;
-    field public static final androidx.wear.protolayout.material3.ButtonGroupDefaults INSTANCE;
-  }
-
-  public final class ButtonGroupKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement buttonGroup(androidx.wear.protolayout.material3.MaterialScope, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float spacing, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.ButtonGroupScope,kotlin.Unit> content);
-  }
-
-  @androidx.wear.protolayout.material3.MaterialScopeMarker public final class ButtonGroupScope {
-    method public void buttonGroupItem(kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> content);
-  }
-
-  public final class ButtonKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement avatarButton(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> labelContent, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> avatarContent, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? secondaryLabelContent, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.ButtonColors colors, optional androidx.wear.protolayout.material3.AvatarButtonStyle style, optional int horizontalAlignment, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement button(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> labelContent, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? secondaryLabelContent, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? iconContent, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.ButtonColors colors, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? backgroundContent, optional androidx.wear.protolayout.material3.ButtonStyle style, optional int horizontalAlignment, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement compactButton(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? labelContent, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? iconContent, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.ButtonColors colors, optional int horizontalAlignment, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement iconButton(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> iconContent, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.ButtonColors colors, optional androidx.wear.protolayout.material3.IconButtonStyle style, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement imageButton(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> backgroundContent, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement textButton(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> labelContent, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.ButtonColors colors, optional androidx.wear.protolayout.material3.TextButtonStyle style, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-  }
-
-  public final class ButtonStyle {
-    field public static final androidx.wear.protolayout.material3.ButtonStyle.Companion Companion;
-  }
-
-  public static final class ButtonStyle.Companion {
-    method public androidx.wear.protolayout.material3.ButtonStyle defaultButtonStyle();
-    method public androidx.wear.protolayout.material3.ButtonStyle largeButtonStyle();
-    method public androidx.wear.protolayout.material3.ButtonStyle smallButtonStyle();
-  }
-
-  public final class CardColors {
-    ctor public CardColors();
-    ctor public CardColors(optional androidx.wear.protolayout.types.LayoutColor backgroundColor, optional androidx.wear.protolayout.types.LayoutColor titleColor, optional androidx.wear.protolayout.types.LayoutColor contentColor, optional androidx.wear.protolayout.types.LayoutColor timeColor, optional androidx.wear.protolayout.types.LayoutColor labelColor, optional androidx.wear.protolayout.types.LayoutColor secondaryIconColor, optional androidx.wear.protolayout.types.LayoutColor secondaryTextColor, optional androidx.wear.protolayout.material3.ProgressIndicatorColors? graphicProgressIndicatorColors, optional androidx.wear.protolayout.types.LayoutColor? graphicIconColor);
-    method public androidx.wear.protolayout.material3.CardColors copy(optional androidx.wear.protolayout.types.LayoutColor backgroundColor, optional androidx.wear.protolayout.types.LayoutColor titleColor, optional androidx.wear.protolayout.types.LayoutColor contentColor, optional androidx.wear.protolayout.types.LayoutColor timeColor, optional androidx.wear.protolayout.types.LayoutColor labelColor, optional androidx.wear.protolayout.types.LayoutColor secondaryIconColor, optional androidx.wear.protolayout.types.LayoutColor secondaryTextColor, optional androidx.wear.protolayout.material3.ProgressIndicatorColors? graphicProgressIndicatorColors, optional androidx.wear.protolayout.types.LayoutColor? graphicIconColor);
-    method public androidx.wear.protolayout.types.LayoutColor getBackgroundColor();
-    method public androidx.wear.protolayout.types.LayoutColor getContentColor();
-    method public androidx.wear.protolayout.types.LayoutColor? getGraphicIconColor();
-    method public androidx.wear.protolayout.material3.ProgressIndicatorColors? getGraphicProgressIndicatorColors();
-    method public androidx.wear.protolayout.types.LayoutColor getLabelColor();
-    method public androidx.wear.protolayout.types.LayoutColor getSecondaryIconColor();
-    method public androidx.wear.protolayout.types.LayoutColor getSecondaryTextColor();
-    method public androidx.wear.protolayout.types.LayoutColor getTimeColor();
-    method public androidx.wear.protolayout.types.LayoutColor getTitleColor();
-    property public androidx.wear.protolayout.types.LayoutColor backgroundColor;
-    property public androidx.wear.protolayout.types.LayoutColor contentColor;
-    property public androidx.wear.protolayout.types.LayoutColor? graphicIconColor;
-    property public androidx.wear.protolayout.material3.ProgressIndicatorColors? graphicProgressIndicatorColors;
-    property public androidx.wear.protolayout.types.LayoutColor labelColor;
-    property public androidx.wear.protolayout.types.LayoutColor secondaryIconColor;
-    property public androidx.wear.protolayout.types.LayoutColor secondaryTextColor;
-    property public androidx.wear.protolayout.types.LayoutColor timeColor;
-    property public androidx.wear.protolayout.types.LayoutColor titleColor;
-  }
-
-  public final class CardDefaults {
-    method public androidx.wear.protolayout.material3.CardColors filledCardColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.material3.CardColors filledTonalCardColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.material3.CardColors filledVariantCardColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.material3.CardColors imageBackgroundCardColors(androidx.wear.protolayout.material3.MaterialScope);
-    field public static final androidx.wear.protolayout.material3.CardDefaults INSTANCE;
-  }
-
-  public final class CardKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement appCard(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> title, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? content, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? avatar, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? label, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? time, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.CardColors colors, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? backgroundContent, optional androidx.wear.protolayout.material3.AppCardStyle style, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement card(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? backgroundContent, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> content);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement graphicDataCard(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> graphic, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> title, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? content, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.CardColors colors, optional androidx.wear.protolayout.material3.GraphicDataCardStyle style, optional int horizontalAlignment, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement iconDataCard(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> title, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? content, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? secondaryIcon, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.CardColors colors, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? backgroundContent, optional androidx.wear.protolayout.material3.DataCardStyle style, optional int titleContentPlacement, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement textDataCard(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> title, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? content, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? secondaryText, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.CardColors colors, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? backgroundContent, optional androidx.wear.protolayout.material3.DataCardStyle style, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement titleCard(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> title, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? content, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? time, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.CardColors colors, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? backgroundContent, optional androidx.wear.protolayout.material3.TitleCardStyle style, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding, optional int horizontalAlignment);
-  }
-
-  public final class CircularProgressIndicatorDefaults {
-    method @Dimension(unit=androidx.annotation.Dimension.Companion.DP) public float calculateRecommendedGapSize(@Dimension(unit=androidx.annotation.Dimension.Companion.DP) float strokeWidth);
-    method public androidx.wear.protolayout.material3.ProgressIndicatorColors filledProgressIndicatorColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.material3.ProgressIndicatorColors filledTonalProgressIndicatorColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.material3.ProgressIndicatorColors filledVariantProgressIndicatorColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec getRecommendedAnimationSpec();
-    property @Dimension(unit=androidx.annotation.Dimension.Companion.DP) public static float LARGE_STROKE_WIDTH;
-    property @Dimension(unit=androidx.annotation.Dimension.Companion.DP) public static float SMALL_STROKE_WIDTH;
-    property public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec recommendedAnimationSpec;
-    field public static final androidx.wear.protolayout.material3.CircularProgressIndicatorDefaults INSTANCE;
-    field @Dimension(unit=androidx.annotation.Dimension.Companion.DP) public static final float LARGE_STROKE_WIDTH = 8.0f;
-    field @Dimension(unit=androidx.annotation.Dimension.Companion.DP) public static final float SMALL_STROKE_WIDTH = 4.0f;
-  }
-
-  public final class CircularProgressIndicatorKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.Box circularProgressIndicator(androidx.wear.protolayout.material3.MaterialScope, optional float staticProgress, optional androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? dynamicProgress, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional float startAngleDegrees, optional float endAngleDegrees, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float strokeWidth, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float gapSize, optional androidx.wear.protolayout.material3.ProgressIndicatorColors colors, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension size);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.Box segmentedCircularProgressIndicator(androidx.wear.protolayout.material3.MaterialScope, @IntRange(from=1L) int segmentCount, optional float staticProgress, optional androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? dynamicProgress, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional float startAngleDegrees, optional float endAngleDegrees, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float strokeWidth, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float gapSize, optional androidx.wear.protolayout.material3.ProgressIndicatorColors colors, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension size);
-  }
-
-  public final class ColorScheme {
-    ctor public ColorScheme();
-    ctor public ColorScheme(optional androidx.wear.protolayout.types.LayoutColor primary, optional androidx.wear.protolayout.types.LayoutColor primaryDim, optional androidx.wear.protolayout.types.LayoutColor primaryContainer, optional androidx.wear.protolayout.types.LayoutColor onPrimary, optional androidx.wear.protolayout.types.LayoutColor onPrimaryContainer, optional androidx.wear.protolayout.types.LayoutColor secondary, optional androidx.wear.protolayout.types.LayoutColor secondaryDim, optional androidx.wear.protolayout.types.LayoutColor secondaryContainer, optional androidx.wear.protolayout.types.LayoutColor onSecondary, optional androidx.wear.protolayout.types.LayoutColor onSecondaryContainer, optional androidx.wear.protolayout.types.LayoutColor tertiary, optional androidx.wear.protolayout.types.LayoutColor tertiaryDim, optional androidx.wear.protolayout.types.LayoutColor tertiaryContainer, optional androidx.wear.protolayout.types.LayoutColor onTertiary, optional androidx.wear.protolayout.types.LayoutColor onTertiaryContainer, optional androidx.wear.protolayout.types.LayoutColor surfaceContainerLow, optional androidx.wear.protolayout.types.LayoutColor surfaceContainer, optional androidx.wear.protolayout.types.LayoutColor surfaceContainerHigh, optional androidx.wear.protolayout.types.LayoutColor onSurface, optional androidx.wear.protolayout.types.LayoutColor onSurfaceVariant, optional androidx.wear.protolayout.types.LayoutColor outline, optional androidx.wear.protolayout.types.LayoutColor outlineVariant, optional androidx.wear.protolayout.types.LayoutColor background, optional androidx.wear.protolayout.types.LayoutColor onBackground, optional androidx.wear.protolayout.types.LayoutColor error, optional androidx.wear.protolayout.types.LayoutColor errorDim, optional androidx.wear.protolayout.types.LayoutColor errorContainer, optional androidx.wear.protolayout.types.LayoutColor onError, optional androidx.wear.protolayout.types.LayoutColor onErrorContainer);
-    method public androidx.wear.protolayout.types.LayoutColor getBackground();
-    method public androidx.wear.protolayout.types.LayoutColor getError();
-    method public androidx.wear.protolayout.types.LayoutColor getErrorContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getErrorDim();
-    method public androidx.wear.protolayout.types.LayoutColor getOnBackground();
-    method public androidx.wear.protolayout.types.LayoutColor getOnError();
-    method public androidx.wear.protolayout.types.LayoutColor getOnErrorContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getOnPrimary();
-    method public androidx.wear.protolayout.types.LayoutColor getOnPrimaryContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getOnSecondary();
-    method public androidx.wear.protolayout.types.LayoutColor getOnSecondaryContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getOnSurface();
-    method public androidx.wear.protolayout.types.LayoutColor getOnSurfaceVariant();
-    method public androidx.wear.protolayout.types.LayoutColor getOnTertiary();
-    method public androidx.wear.protolayout.types.LayoutColor getOnTertiaryContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getOutline();
-    method public androidx.wear.protolayout.types.LayoutColor getOutlineVariant();
-    method public androidx.wear.protolayout.types.LayoutColor getPrimary();
-    method public androidx.wear.protolayout.types.LayoutColor getPrimaryContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getPrimaryDim();
-    method public androidx.wear.protolayout.types.LayoutColor getSecondary();
-    method public androidx.wear.protolayout.types.LayoutColor getSecondaryContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getSecondaryDim();
-    method public androidx.wear.protolayout.types.LayoutColor getSurfaceContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getSurfaceContainerHigh();
-    method public androidx.wear.protolayout.types.LayoutColor getSurfaceContainerLow();
-    method public androidx.wear.protolayout.types.LayoutColor getTertiary();
-    method public androidx.wear.protolayout.types.LayoutColor getTertiaryContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getTertiaryDim();
-    property public androidx.wear.protolayout.types.LayoutColor background;
-    property public androidx.wear.protolayout.types.LayoutColor error;
-    property public androidx.wear.protolayout.types.LayoutColor errorContainer;
-    property public androidx.wear.protolayout.types.LayoutColor errorDim;
-    property public androidx.wear.protolayout.types.LayoutColor onBackground;
-    property public androidx.wear.protolayout.types.LayoutColor onError;
-    property public androidx.wear.protolayout.types.LayoutColor onErrorContainer;
-    property public androidx.wear.protolayout.types.LayoutColor onPrimary;
-    property public androidx.wear.protolayout.types.LayoutColor onPrimaryContainer;
-    property public androidx.wear.protolayout.types.LayoutColor onSecondary;
-    property public androidx.wear.protolayout.types.LayoutColor onSecondaryContainer;
-    property public androidx.wear.protolayout.types.LayoutColor onSurface;
-    property public androidx.wear.protolayout.types.LayoutColor onSurfaceVariant;
-    property public androidx.wear.protolayout.types.LayoutColor onTertiary;
-    property public androidx.wear.protolayout.types.LayoutColor onTertiaryContainer;
-    property public androidx.wear.protolayout.types.LayoutColor outline;
-    property public androidx.wear.protolayout.types.LayoutColor outlineVariant;
-    property public androidx.wear.protolayout.types.LayoutColor primary;
-    property public androidx.wear.protolayout.types.LayoutColor primaryContainer;
-    property public androidx.wear.protolayout.types.LayoutColor primaryDim;
-    property public androidx.wear.protolayout.types.LayoutColor secondary;
-    property public androidx.wear.protolayout.types.LayoutColor secondaryContainer;
-    property public androidx.wear.protolayout.types.LayoutColor secondaryDim;
-    property public androidx.wear.protolayout.types.LayoutColor surfaceContainer;
-    property public androidx.wear.protolayout.types.LayoutColor surfaceContainerHigh;
-    property public androidx.wear.protolayout.types.LayoutColor surfaceContainerLow;
-    property public androidx.wear.protolayout.types.LayoutColor tertiary;
-    property public androidx.wear.protolayout.types.LayoutColor tertiaryContainer;
-    property public androidx.wear.protolayout.types.LayoutColor tertiaryDim;
-  }
-
-  public final class DataCardStyle {
-    field public static final androidx.wear.protolayout.material3.DataCardStyle.Companion Companion;
-  }
-
-  public static final class DataCardStyle.Companion {
-    method public androidx.wear.protolayout.material3.DataCardStyle defaultCompactDataCardStyle();
-    method public androidx.wear.protolayout.material3.DataCardStyle defaultDataCardStyle();
-    method public androidx.wear.protolayout.material3.DataCardStyle extraLargeDataCardStyle();
-    method public androidx.wear.protolayout.material3.DataCardStyle largeCompactDataCardStyle();
-    method public androidx.wear.protolayout.material3.DataCardStyle largeDataCardStyle();
-    method public androidx.wear.protolayout.material3.DataCardStyle smallCompactDataCardStyle();
-    method public androidx.wear.protolayout.material3.DataCardStyle smallDataCardStyle();
-  }
-
-  public final class DynamicColorSchemeKt {
-    method public static androidx.wear.protolayout.material3.ColorScheme dynamicColorScheme(android.content.Context context, optional androidx.wear.protolayout.material3.ColorScheme defaultColorScheme);
-    method public static boolean isDynamicColorSchemeEnabled(android.content.Context context);
-  }
-
-  public final class EdgeButtonKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement iconEdgeButton(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional androidx.wear.protolayout.material3.ButtonColors colors, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> iconContent);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement textEdgeButton(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional androidx.wear.protolayout.material3.ButtonColors colors, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> labelContent);
-  }
-
-  public final class GraphicDataCardDefaults {
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement constructGraphic(androidx.wear.protolayout.material3.MaterialScope, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,androidx.wear.protolayout.LayoutElementBuilders.Box> mainContent, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> iconContent, optional float iconSizeRatio);
-    field public static final androidx.wear.protolayout.material3.GraphicDataCardDefaults INSTANCE;
-  }
-
-  public final class GraphicDataCardStyle {
-    field public static final androidx.wear.protolayout.material3.GraphicDataCardStyle.Companion Companion;
-  }
-
-  public static final class GraphicDataCardStyle.Companion {
-    method public androidx.wear.protolayout.material3.GraphicDataCardStyle defaultGraphicDataCardStyle();
-    method public androidx.wear.protolayout.material3.GraphicDataCardStyle largeGraphicDataCardStyle();
-  }
-
-  public final class IconButtonStyle {
-    field public static final androidx.wear.protolayout.material3.IconButtonStyle.Companion Companion;
-  }
-
-  public static final class IconButtonStyle.Companion {
-    method public androidx.wear.protolayout.material3.IconButtonStyle defaultIconButtonStyle();
-    method public androidx.wear.protolayout.material3.IconButtonStyle largeIconButtonStyle();
-  }
-
-  public final class IconKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement icon(androidx.wear.protolayout.material3.MaterialScope, String protoLayoutResourceId, optional androidx.wear.protolayout.DimensionBuilders.ImageDimension width, optional androidx.wear.protolayout.DimensionBuilders.ImageDimension height, optional androidx.wear.protolayout.types.LayoutColor tintColor);
-  }
-
-  public final class ImageKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement avatarImage(androidx.wear.protolayout.material3.MaterialScope, String protoLayoutResourceId, optional androidx.wear.protolayout.DimensionBuilders.ImageDimension width, optional androidx.wear.protolayout.DimensionBuilders.ImageDimension height, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional int contentScaleMode);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement backgroundImage(androidx.wear.protolayout.material3.MaterialScope, String protoLayoutResourceId, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional androidx.wear.protolayout.DimensionBuilders.ImageDimension width, optional androidx.wear.protolayout.DimensionBuilders.ImageDimension height, optional androidx.wear.protolayout.types.LayoutColor? overlayColor, optional int contentScaleMode);
-  }
-
-  @androidx.wear.protolayout.material3.MaterialScopeMarker public class MaterialScope {
-    method public final androidx.wear.protolayout.material3.ColorScheme getColorScheme();
-    method public final android.content.Context getContext();
-    method public final androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters getDeviceConfiguration();
-    method public final androidx.wear.protolayout.material3.Shapes getShapes();
-    property public final androidx.wear.protolayout.material3.ColorScheme colorScheme;
-    property public final android.content.Context context;
-    property public final androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters deviceConfiguration;
-    property public final androidx.wear.protolayout.material3.Shapes shapes;
-  }
-
-  public final class MaterialScopeKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement materialScope(android.content.Context context, androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters deviceConfiguration, optional boolean allowDynamicTheme, optional androidx.wear.protolayout.material3.ColorScheme defaultColorScheme, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> layout);
-  }
-
-  @kotlin.DslMarker public @interface MaterialScopeMarker {
-  }
-
-  public final class PrimaryLayoutKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement primaryLayout(androidx.wear.protolayout.material3.MaterialScope, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> mainSlot, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? titleSlot, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? bottomSlot, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? labelForBottomSlot, optional androidx.wear.protolayout.ModifiersBuilders.Clickable? onClick, optional androidx.wear.protolayout.material3.PrimaryLayoutMargins margins);
-  }
-
-  public abstract class PrimaryLayoutMargins {
-    field public static final androidx.wear.protolayout.material3.PrimaryLayoutMargins.Companion Companion;
-    field public static final androidx.wear.protolayout.material3.PrimaryLayoutMargins DEFAULT_PRIMARY_LAYOUT_MARGIN;
-    field public static final androidx.wear.protolayout.material3.PrimaryLayoutMargins MAX_PRIMARY_LAYOUT_MARGIN;
-    field public static final androidx.wear.protolayout.material3.PrimaryLayoutMargins MID_PRIMARY_LAYOUT_MARGIN;
-    field public static final androidx.wear.protolayout.material3.PrimaryLayoutMargins MIN_PRIMARY_LAYOUT_MARGIN;
-  }
-
-  public static final class PrimaryLayoutMargins.Companion {
-    method public androidx.wear.protolayout.material3.PrimaryLayoutMargins customizedPrimaryLayoutMargin(@FloatRange(from=0.0, to=1.0) float start, @FloatRange(from=0.0, to=1.0) float end);
-    method public androidx.wear.protolayout.material3.PrimaryLayoutMargins customizedPrimaryLayoutMargin(@FloatRange(from=0.0, to=1.0) float start, @FloatRange(from=0.0, to=1.0) float end, @FloatRange(from=0.0, to=1.0) float bottom);
-    property public androidx.wear.protolayout.material3.PrimaryLayoutMargins DEFAULT_PRIMARY_LAYOUT_MARGIN;
-    property public androidx.wear.protolayout.material3.PrimaryLayoutMargins MAX_PRIMARY_LAYOUT_MARGIN;
-    property public androidx.wear.protolayout.material3.PrimaryLayoutMargins MID_PRIMARY_LAYOUT_MARGIN;
-    property public androidx.wear.protolayout.material3.PrimaryLayoutMargins MIN_PRIMARY_LAYOUT_MARGIN;
-  }
-
-  public final class ProgressIndicatorColors {
-    ctor public ProgressIndicatorColors(androidx.wear.protolayout.types.LayoutColor indicatorColor, androidx.wear.protolayout.types.LayoutColor trackColor, optional androidx.wear.protolayout.types.LayoutColor trackOverflowColor);
-    method public androidx.wear.protolayout.material3.ProgressIndicatorColors copy(optional androidx.wear.protolayout.types.LayoutColor indicatorColor, optional androidx.wear.protolayout.types.LayoutColor trackColor, optional androidx.wear.protolayout.types.LayoutColor trackOverflowColor);
-    method public androidx.wear.protolayout.types.LayoutColor getIndicatorColor();
-    method public androidx.wear.protolayout.types.LayoutColor getTrackColor();
-    method public androidx.wear.protolayout.types.LayoutColor getTrackOverflowColor();
-    property public androidx.wear.protolayout.types.LayoutColor indicatorColor;
-    property public androidx.wear.protolayout.types.LayoutColor trackColor;
-    property public androidx.wear.protolayout.types.LayoutColor trackOverflowColor;
-  }
-
-  public final class Shapes {
-    ctor public Shapes();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner getExtraLarge();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner getExtraSmall();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner getFull();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner getLarge();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner getMedium();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner getNone();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner getSmall();
-    property public androidx.wear.protolayout.ModifiersBuilders.Corner extraLarge;
-    property public androidx.wear.protolayout.ModifiersBuilders.Corner extraSmall;
-    property public androidx.wear.protolayout.ModifiersBuilders.Corner full;
-    property public androidx.wear.protolayout.ModifiersBuilders.Corner large;
-    property public androidx.wear.protolayout.ModifiersBuilders.Corner medium;
-    property public androidx.wear.protolayout.ModifiersBuilders.Corner none;
-    property public androidx.wear.protolayout.ModifiersBuilders.Corner small;
-  }
-
-  public final class TextButtonStyle {
-    field public static final androidx.wear.protolayout.material3.TextButtonStyle.Companion Companion;
-  }
-
-  public static final class TextButtonStyle.Companion {
-    method public androidx.wear.protolayout.material3.TextButtonStyle defaultTextButtonStyle();
-    method public androidx.wear.protolayout.material3.TextButtonStyle extraLargeTextButtonStyle();
-    method public androidx.wear.protolayout.material3.TextButtonStyle largeTextButtonStyle();
-    method public androidx.wear.protolayout.material3.TextButtonStyle smallTextButtonStyle();
-  }
-
-  public final class TextKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement text(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.types.LayoutString text, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional int typography, optional androidx.wear.protolayout.types.LayoutColor color, optional boolean italic, optional boolean underline, optional boolean scalable, optional int maxLines, optional int alignment, optional int overflow, optional @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) java.util.List<? extends androidx.wear.protolayout.LayoutElementBuilders.FontSetting> settings);
-  }
-
-  public final class TitleCardDefaults {
-    field public static final androidx.wear.protolayout.material3.TitleCardDefaults INSTANCE;
-  }
-
-  public final class TitleCardStyle {
-    field public static final androidx.wear.protolayout.material3.TitleCardStyle.Companion Companion;
-  }
-
-  public static final class TitleCardStyle.Companion {
-    method public androidx.wear.protolayout.material3.TitleCardStyle defaultTitleCardStyle();
-    method public androidx.wear.protolayout.material3.TitleCardStyle extraLargeTitleCardStyle();
-    method public androidx.wear.protolayout.material3.TitleCardStyle largeTitleCardStyle();
-    method public androidx.wear.protolayout.material3.TitleCardStyle smallTitleCardStyle();
-  }
-
-  @kotlin.jvm.JvmInline public final value class TitleContentPlacementInDataCard {
-    field public static final androidx.wear.protolayout.material3.TitleContentPlacementInDataCard.Companion Companion;
-  }
-
-  public static final class TitleContentPlacementInDataCard.Companion {
-    method public int getBottom();
-    method public int getTop();
-    property public int Bottom;
-    property public int Top;
-  }
-
-  public final class Typography {
-    property public static int BODY_EXTRA_SMALL;
-    property public static int BODY_LARGE;
-    property public static int BODY_MEDIUM;
-    property public static int BODY_SMALL;
-    property public static int DISPLAY_LARGE;
-    property public static int DISPLAY_MEDIUM;
-    property public static int DISPLAY_SMALL;
-    property public static int LABEL_LARGE;
-    property public static int LABEL_MEDIUM;
-    property public static int LABEL_SMALL;
-    property public static int NUMERAL_EXTRA_LARGE;
-    property public static int NUMERAL_EXTRA_SMALL;
-    property public static int NUMERAL_LARGE;
-    property public static int NUMERAL_MEDIUM;
-    property public static int NUMERAL_SMALL;
-    property public static int TITLE_LARGE;
-    property public static int TITLE_MEDIUM;
-    property public static int TITLE_SMALL;
-    field public static final int BODY_EXTRA_SMALL = 2; // 0x2
-    field public static final int BODY_LARGE = 3; // 0x3
-    field public static final int BODY_MEDIUM = 4; // 0x4
-    field public static final int BODY_SMALL = 5; // 0x5
-    field public static final int DISPLAY_LARGE = 6; // 0x6
-    field public static final int DISPLAY_MEDIUM = 7; // 0x7
-    field public static final int DISPLAY_SMALL = 8; // 0x8
-    field public static final androidx.wear.protolayout.material3.Typography INSTANCE;
-    field public static final int LABEL_LARGE = 9; // 0x9
-    field public static final int LABEL_MEDIUM = 10; // 0xa
-    field public static final int LABEL_SMALL = 11; // 0xb
-    field public static final int NUMERAL_EXTRA_LARGE = 12; // 0xc
-    field public static final int NUMERAL_EXTRA_SMALL = 13; // 0xd
-    field public static final int NUMERAL_LARGE = 14; // 0xe
-    field public static final int NUMERAL_MEDIUM = 15; // 0xf
-    field public static final int NUMERAL_SMALL = 16; // 0x10
-    field public static final int TITLE_LARGE = 17; // 0x11
-    field public static final int TITLE_MEDIUM = 18; // 0x12
-    field public static final int TITLE_SMALL = 19; // 0x13
-  }
-
-}
-
diff --git a/wear/protolayout/protolayout-material3/api/res-1.3.0-beta01.txt b/wear/protolayout/protolayout-material3/api/res-1.3.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/wear/protolayout/protolayout-material3/api/res-1.3.0-beta01.txt
+++ /dev/null
diff --git a/wear/protolayout/protolayout-material3/api/restricted_1.3.0-beta01.txt b/wear/protolayout/protolayout-material3/api/restricted_1.3.0-beta01.txt
deleted file mode 100644
index 0f3c820..0000000
--- a/wear/protolayout/protolayout-material3/api/restricted_1.3.0-beta01.txt
+++ /dev/null
@@ -1,408 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.protolayout.material3 {
-
-  public final class AppCardStyle {
-    field public static final androidx.wear.protolayout.material3.AppCardStyle.Companion Companion;
-  }
-
-  public static final class AppCardStyle.Companion {
-    method public androidx.wear.protolayout.material3.AppCardStyle defaultAppCardStyle();
-    method public androidx.wear.protolayout.material3.AppCardStyle largeAppCardStyle();
-    method public androidx.wear.protolayout.material3.AppCardStyle smallAppCardStyle();
-  }
-
-  public final class AvatarButtonStyle {
-    field public static final androidx.wear.protolayout.material3.AvatarButtonStyle.Companion Companion;
-  }
-
-  public static final class AvatarButtonStyle.Companion {
-    method public androidx.wear.protolayout.material3.AvatarButtonStyle defaultAvatarButtonStyle();
-    method public androidx.wear.protolayout.material3.AvatarButtonStyle largeAvatarButtonStyle();
-  }
-
-  public final class ButtonColors {
-    ctor public ButtonColors();
-    ctor public ButtonColors(optional androidx.wear.protolayout.types.LayoutColor containerColor, optional androidx.wear.protolayout.types.LayoutColor iconColor, optional androidx.wear.protolayout.types.LayoutColor labelColor, optional androidx.wear.protolayout.types.LayoutColor secondaryLabelColor);
-    method public androidx.wear.protolayout.material3.ButtonColors copy(optional androidx.wear.protolayout.types.LayoutColor containerColor, optional androidx.wear.protolayout.types.LayoutColor iconColor, optional androidx.wear.protolayout.types.LayoutColor labelColor, optional androidx.wear.protolayout.types.LayoutColor secondaryLabelColor);
-    method public androidx.wear.protolayout.types.LayoutColor getContainerColor();
-    method public androidx.wear.protolayout.types.LayoutColor getIconColor();
-    method public androidx.wear.protolayout.types.LayoutColor getLabelColor();
-    method public androidx.wear.protolayout.types.LayoutColor getSecondaryLabelColor();
-    property public androidx.wear.protolayout.types.LayoutColor containerColor;
-    property public androidx.wear.protolayout.types.LayoutColor iconColor;
-    property public androidx.wear.protolayout.types.LayoutColor labelColor;
-    property public androidx.wear.protolayout.types.LayoutColor secondaryLabelColor;
-  }
-
-  public final class ButtonDefaults {
-    method public androidx.wear.protolayout.material3.ButtonColors filledButtonColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.material3.ButtonColors filledTonalButtonColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.material3.ButtonColors filledVariantButtonColors(androidx.wear.protolayout.material3.MaterialScope);
-    field public static final androidx.wear.protolayout.material3.ButtonDefaults INSTANCE;
-  }
-
-  public final class ButtonGroupDefaults {
-    property public androidx.wear.protolayout.LayoutElementBuilders.Spacer DEFAULT_SPACER_BETWEEN_BUTTON_GROUPS;
-    property @Dimension(unit=androidx.annotation.Dimension.Companion.DP) public static float DEFAULT_SPACER_WIDTH_DP;
-    field public static final androidx.wear.protolayout.LayoutElementBuilders.Spacer DEFAULT_SPACER_BETWEEN_BUTTON_GROUPS;
-    field @Dimension(unit=androidx.annotation.Dimension.Companion.DP) public static final float DEFAULT_SPACER_WIDTH_DP = 4.0f;
-    field public static final androidx.wear.protolayout.material3.ButtonGroupDefaults INSTANCE;
-  }
-
-  public final class ButtonGroupKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement buttonGroup(androidx.wear.protolayout.material3.MaterialScope, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float spacing, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.ButtonGroupScope,kotlin.Unit> content);
-  }
-
-  @androidx.wear.protolayout.material3.MaterialScopeMarker public final class ButtonGroupScope {
-    method public void buttonGroupItem(kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> content);
-  }
-
-  public final class ButtonKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement avatarButton(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> labelContent, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> avatarContent, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? secondaryLabelContent, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.ButtonColors colors, optional androidx.wear.protolayout.material3.AvatarButtonStyle style, optional int horizontalAlignment, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement button(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> labelContent, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? secondaryLabelContent, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? iconContent, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.ButtonColors colors, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? backgroundContent, optional androidx.wear.protolayout.material3.ButtonStyle style, optional int horizontalAlignment, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement compactButton(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? labelContent, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? iconContent, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.ButtonColors colors, optional int horizontalAlignment, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement iconButton(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> iconContent, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.ButtonColors colors, optional androidx.wear.protolayout.material3.IconButtonStyle style, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement imageButton(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> backgroundContent, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement textButton(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> labelContent, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.ButtonColors colors, optional androidx.wear.protolayout.material3.TextButtonStyle style, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-  }
-
-  public final class ButtonStyle {
-    field public static final androidx.wear.protolayout.material3.ButtonStyle.Companion Companion;
-  }
-
-  public static final class ButtonStyle.Companion {
-    method public androidx.wear.protolayout.material3.ButtonStyle defaultButtonStyle();
-    method public androidx.wear.protolayout.material3.ButtonStyle largeButtonStyle();
-    method public androidx.wear.protolayout.material3.ButtonStyle smallButtonStyle();
-  }
-
-  public final class CardColors {
-    ctor public CardColors();
-    ctor public CardColors(optional androidx.wear.protolayout.types.LayoutColor backgroundColor, optional androidx.wear.protolayout.types.LayoutColor titleColor, optional androidx.wear.protolayout.types.LayoutColor contentColor, optional androidx.wear.protolayout.types.LayoutColor timeColor, optional androidx.wear.protolayout.types.LayoutColor labelColor, optional androidx.wear.protolayout.types.LayoutColor secondaryIconColor, optional androidx.wear.protolayout.types.LayoutColor secondaryTextColor, optional androidx.wear.protolayout.material3.ProgressIndicatorColors? graphicProgressIndicatorColors, optional androidx.wear.protolayout.types.LayoutColor? graphicIconColor);
-    method public androidx.wear.protolayout.material3.CardColors copy(optional androidx.wear.protolayout.types.LayoutColor backgroundColor, optional androidx.wear.protolayout.types.LayoutColor titleColor, optional androidx.wear.protolayout.types.LayoutColor contentColor, optional androidx.wear.protolayout.types.LayoutColor timeColor, optional androidx.wear.protolayout.types.LayoutColor labelColor, optional androidx.wear.protolayout.types.LayoutColor secondaryIconColor, optional androidx.wear.protolayout.types.LayoutColor secondaryTextColor, optional androidx.wear.protolayout.material3.ProgressIndicatorColors? graphicProgressIndicatorColors, optional androidx.wear.protolayout.types.LayoutColor? graphicIconColor);
-    method public androidx.wear.protolayout.types.LayoutColor getBackgroundColor();
-    method public androidx.wear.protolayout.types.LayoutColor getContentColor();
-    method public androidx.wear.protolayout.types.LayoutColor? getGraphicIconColor();
-    method public androidx.wear.protolayout.material3.ProgressIndicatorColors? getGraphicProgressIndicatorColors();
-    method public androidx.wear.protolayout.types.LayoutColor getLabelColor();
-    method public androidx.wear.protolayout.types.LayoutColor getSecondaryIconColor();
-    method public androidx.wear.protolayout.types.LayoutColor getSecondaryTextColor();
-    method public androidx.wear.protolayout.types.LayoutColor getTimeColor();
-    method public androidx.wear.protolayout.types.LayoutColor getTitleColor();
-    property public androidx.wear.protolayout.types.LayoutColor backgroundColor;
-    property public androidx.wear.protolayout.types.LayoutColor contentColor;
-    property public androidx.wear.protolayout.types.LayoutColor? graphicIconColor;
-    property public androidx.wear.protolayout.material3.ProgressIndicatorColors? graphicProgressIndicatorColors;
-    property public androidx.wear.protolayout.types.LayoutColor labelColor;
-    property public androidx.wear.protolayout.types.LayoutColor secondaryIconColor;
-    property public androidx.wear.protolayout.types.LayoutColor secondaryTextColor;
-    property public androidx.wear.protolayout.types.LayoutColor timeColor;
-    property public androidx.wear.protolayout.types.LayoutColor titleColor;
-  }
-
-  public final class CardDefaults {
-    method public androidx.wear.protolayout.material3.CardColors filledCardColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.material3.CardColors filledTonalCardColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.material3.CardColors filledVariantCardColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.material3.CardColors imageBackgroundCardColors(androidx.wear.protolayout.material3.MaterialScope);
-    field public static final androidx.wear.protolayout.material3.CardDefaults INSTANCE;
-  }
-
-  public final class CardKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement appCard(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> title, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? content, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? avatar, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? label, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? time, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.CardColors colors, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? backgroundContent, optional androidx.wear.protolayout.material3.AppCardStyle style, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement card(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? backgroundContent, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> content);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement graphicDataCard(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> graphic, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> title, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? content, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.CardColors colors, optional androidx.wear.protolayout.material3.GraphicDataCardStyle style, optional int horizontalAlignment, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement iconDataCard(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> title, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? content, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? secondaryIcon, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.CardColors colors, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? backgroundContent, optional androidx.wear.protolayout.material3.DataCardStyle style, optional int titleContentPlacement, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement textDataCard(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> title, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? content, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? secondaryText, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension width, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.CardColors colors, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? backgroundContent, optional androidx.wear.protolayout.material3.DataCardStyle style, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement titleCard(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> title, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? content, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? time, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension height, optional androidx.wear.protolayout.ModifiersBuilders.Corner shape, optional androidx.wear.protolayout.material3.CardColors colors, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? backgroundContent, optional androidx.wear.protolayout.material3.TitleCardStyle style, optional androidx.wear.protolayout.ModifiersBuilders.Padding contentPadding, optional int horizontalAlignment);
-  }
-
-  public final class CircularProgressIndicatorDefaults {
-    method @Dimension(unit=androidx.annotation.Dimension.Companion.DP) public float calculateRecommendedGapSize(@Dimension(unit=androidx.annotation.Dimension.Companion.DP) float strokeWidth);
-    method public androidx.wear.protolayout.material3.ProgressIndicatorColors filledProgressIndicatorColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.material3.ProgressIndicatorColors filledTonalProgressIndicatorColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.material3.ProgressIndicatorColors filledVariantProgressIndicatorColors(androidx.wear.protolayout.material3.MaterialScope);
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec getRecommendedAnimationSpec();
-    property @Dimension(unit=androidx.annotation.Dimension.Companion.DP) public static float LARGE_STROKE_WIDTH;
-    property @Dimension(unit=androidx.annotation.Dimension.Companion.DP) public static float SMALL_STROKE_WIDTH;
-    property public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec recommendedAnimationSpec;
-    field public static final androidx.wear.protolayout.material3.CircularProgressIndicatorDefaults INSTANCE;
-    field @Dimension(unit=androidx.annotation.Dimension.Companion.DP) public static final float LARGE_STROKE_WIDTH = 8.0f;
-    field @Dimension(unit=androidx.annotation.Dimension.Companion.DP) public static final float SMALL_STROKE_WIDTH = 4.0f;
-  }
-
-  public final class CircularProgressIndicatorKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.Box circularProgressIndicator(androidx.wear.protolayout.material3.MaterialScope, optional float staticProgress, optional androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? dynamicProgress, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional float startAngleDegrees, optional float endAngleDegrees, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float strokeWidth, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float gapSize, optional androidx.wear.protolayout.material3.ProgressIndicatorColors colors, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension size);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.Box segmentedCircularProgressIndicator(androidx.wear.protolayout.material3.MaterialScope, @IntRange(from=1L) int segmentCount, optional float staticProgress, optional androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? dynamicProgress, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional float startAngleDegrees, optional float endAngleDegrees, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float strokeWidth, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float gapSize, optional androidx.wear.protolayout.material3.ProgressIndicatorColors colors, optional androidx.wear.protolayout.DimensionBuilders.ContainerDimension size);
-  }
-
-  public final class ColorScheme {
-    ctor public ColorScheme();
-    ctor public ColorScheme(optional androidx.wear.protolayout.types.LayoutColor primary, optional androidx.wear.protolayout.types.LayoutColor primaryDim, optional androidx.wear.protolayout.types.LayoutColor primaryContainer, optional androidx.wear.protolayout.types.LayoutColor onPrimary, optional androidx.wear.protolayout.types.LayoutColor onPrimaryContainer, optional androidx.wear.protolayout.types.LayoutColor secondary, optional androidx.wear.protolayout.types.LayoutColor secondaryDim, optional androidx.wear.protolayout.types.LayoutColor secondaryContainer, optional androidx.wear.protolayout.types.LayoutColor onSecondary, optional androidx.wear.protolayout.types.LayoutColor onSecondaryContainer, optional androidx.wear.protolayout.types.LayoutColor tertiary, optional androidx.wear.protolayout.types.LayoutColor tertiaryDim, optional androidx.wear.protolayout.types.LayoutColor tertiaryContainer, optional androidx.wear.protolayout.types.LayoutColor onTertiary, optional androidx.wear.protolayout.types.LayoutColor onTertiaryContainer, optional androidx.wear.protolayout.types.LayoutColor surfaceContainerLow, optional androidx.wear.protolayout.types.LayoutColor surfaceContainer, optional androidx.wear.protolayout.types.LayoutColor surfaceContainerHigh, optional androidx.wear.protolayout.types.LayoutColor onSurface, optional androidx.wear.protolayout.types.LayoutColor onSurfaceVariant, optional androidx.wear.protolayout.types.LayoutColor outline, optional androidx.wear.protolayout.types.LayoutColor outlineVariant, optional androidx.wear.protolayout.types.LayoutColor background, optional androidx.wear.protolayout.types.LayoutColor onBackground, optional androidx.wear.protolayout.types.LayoutColor error, optional androidx.wear.protolayout.types.LayoutColor errorDim, optional androidx.wear.protolayout.types.LayoutColor errorContainer, optional androidx.wear.protolayout.types.LayoutColor onError, optional androidx.wear.protolayout.types.LayoutColor onErrorContainer);
-    method public androidx.wear.protolayout.types.LayoutColor getBackground();
-    method public androidx.wear.protolayout.types.LayoutColor getError();
-    method public androidx.wear.protolayout.types.LayoutColor getErrorContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getErrorDim();
-    method public androidx.wear.protolayout.types.LayoutColor getOnBackground();
-    method public androidx.wear.protolayout.types.LayoutColor getOnError();
-    method public androidx.wear.protolayout.types.LayoutColor getOnErrorContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getOnPrimary();
-    method public androidx.wear.protolayout.types.LayoutColor getOnPrimaryContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getOnSecondary();
-    method public androidx.wear.protolayout.types.LayoutColor getOnSecondaryContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getOnSurface();
-    method public androidx.wear.protolayout.types.LayoutColor getOnSurfaceVariant();
-    method public androidx.wear.protolayout.types.LayoutColor getOnTertiary();
-    method public androidx.wear.protolayout.types.LayoutColor getOnTertiaryContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getOutline();
-    method public androidx.wear.protolayout.types.LayoutColor getOutlineVariant();
-    method public androidx.wear.protolayout.types.LayoutColor getPrimary();
-    method public androidx.wear.protolayout.types.LayoutColor getPrimaryContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getPrimaryDim();
-    method public androidx.wear.protolayout.types.LayoutColor getSecondary();
-    method public androidx.wear.protolayout.types.LayoutColor getSecondaryContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getSecondaryDim();
-    method public androidx.wear.protolayout.types.LayoutColor getSurfaceContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getSurfaceContainerHigh();
-    method public androidx.wear.protolayout.types.LayoutColor getSurfaceContainerLow();
-    method public androidx.wear.protolayout.types.LayoutColor getTertiary();
-    method public androidx.wear.protolayout.types.LayoutColor getTertiaryContainer();
-    method public androidx.wear.protolayout.types.LayoutColor getTertiaryDim();
-    property public androidx.wear.protolayout.types.LayoutColor background;
-    property public androidx.wear.protolayout.types.LayoutColor error;
-    property public androidx.wear.protolayout.types.LayoutColor errorContainer;
-    property public androidx.wear.protolayout.types.LayoutColor errorDim;
-    property public androidx.wear.protolayout.types.LayoutColor onBackground;
-    property public androidx.wear.protolayout.types.LayoutColor onError;
-    property public androidx.wear.protolayout.types.LayoutColor onErrorContainer;
-    property public androidx.wear.protolayout.types.LayoutColor onPrimary;
-    property public androidx.wear.protolayout.types.LayoutColor onPrimaryContainer;
-    property public androidx.wear.protolayout.types.LayoutColor onSecondary;
-    property public androidx.wear.protolayout.types.LayoutColor onSecondaryContainer;
-    property public androidx.wear.protolayout.types.LayoutColor onSurface;
-    property public androidx.wear.protolayout.types.LayoutColor onSurfaceVariant;
-    property public androidx.wear.protolayout.types.LayoutColor onTertiary;
-    property public androidx.wear.protolayout.types.LayoutColor onTertiaryContainer;
-    property public androidx.wear.protolayout.types.LayoutColor outline;
-    property public androidx.wear.protolayout.types.LayoutColor outlineVariant;
-    property public androidx.wear.protolayout.types.LayoutColor primary;
-    property public androidx.wear.protolayout.types.LayoutColor primaryContainer;
-    property public androidx.wear.protolayout.types.LayoutColor primaryDim;
-    property public androidx.wear.protolayout.types.LayoutColor secondary;
-    property public androidx.wear.protolayout.types.LayoutColor secondaryContainer;
-    property public androidx.wear.protolayout.types.LayoutColor secondaryDim;
-    property public androidx.wear.protolayout.types.LayoutColor surfaceContainer;
-    property public androidx.wear.protolayout.types.LayoutColor surfaceContainerHigh;
-    property public androidx.wear.protolayout.types.LayoutColor surfaceContainerLow;
-    property public androidx.wear.protolayout.types.LayoutColor tertiary;
-    property public androidx.wear.protolayout.types.LayoutColor tertiaryContainer;
-    property public androidx.wear.protolayout.types.LayoutColor tertiaryDim;
-  }
-
-  public final class DataCardStyle {
-    field public static final androidx.wear.protolayout.material3.DataCardStyle.Companion Companion;
-  }
-
-  public static final class DataCardStyle.Companion {
-    method public androidx.wear.protolayout.material3.DataCardStyle defaultCompactDataCardStyle();
-    method public androidx.wear.protolayout.material3.DataCardStyle defaultDataCardStyle();
-    method public androidx.wear.protolayout.material3.DataCardStyle extraLargeDataCardStyle();
-    method public androidx.wear.protolayout.material3.DataCardStyle largeCompactDataCardStyle();
-    method public androidx.wear.protolayout.material3.DataCardStyle largeDataCardStyle();
-    method public androidx.wear.protolayout.material3.DataCardStyle smallCompactDataCardStyle();
-    method public androidx.wear.protolayout.material3.DataCardStyle smallDataCardStyle();
-  }
-
-  public final class DynamicColorSchemeKt {
-    method public static androidx.wear.protolayout.material3.ColorScheme dynamicColorScheme(android.content.Context context, optional androidx.wear.protolayout.material3.ColorScheme defaultColorScheme);
-    method public static boolean isDynamicColorSchemeEnabled(android.content.Context context);
-  }
-
-  public final class EdgeButtonKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement iconEdgeButton(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional androidx.wear.protolayout.material3.ButtonColors colors, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> iconContent);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement textEdgeButton(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.ModifiersBuilders.Clickable onClick, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional androidx.wear.protolayout.material3.ButtonColors colors, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> labelContent);
-  }
-
-  public final class GraphicDataCardDefaults {
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement constructGraphic(androidx.wear.protolayout.material3.MaterialScope, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,androidx.wear.protolayout.LayoutElementBuilders.Box> mainContent, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> iconContent, optional float iconSizeRatio);
-    field public static final androidx.wear.protolayout.material3.GraphicDataCardDefaults INSTANCE;
-  }
-
-  public final class GraphicDataCardStyle {
-    field public static final androidx.wear.protolayout.material3.GraphicDataCardStyle.Companion Companion;
-  }
-
-  public static final class GraphicDataCardStyle.Companion {
-    method public androidx.wear.protolayout.material3.GraphicDataCardStyle defaultGraphicDataCardStyle();
-    method public androidx.wear.protolayout.material3.GraphicDataCardStyle largeGraphicDataCardStyle();
-  }
-
-  public final class IconButtonStyle {
-    field public static final androidx.wear.protolayout.material3.IconButtonStyle.Companion Companion;
-  }
-
-  public static final class IconButtonStyle.Companion {
-    method public androidx.wear.protolayout.material3.IconButtonStyle defaultIconButtonStyle();
-    method public androidx.wear.protolayout.material3.IconButtonStyle largeIconButtonStyle();
-  }
-
-  public final class IconKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement icon(androidx.wear.protolayout.material3.MaterialScope, String protoLayoutResourceId, optional androidx.wear.protolayout.DimensionBuilders.ImageDimension width, optional androidx.wear.protolayout.DimensionBuilders.ImageDimension height, optional androidx.wear.protolayout.types.LayoutColor tintColor);
-  }
-
-  public final class ImageKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement avatarImage(androidx.wear.protolayout.material3.MaterialScope, String protoLayoutResourceId, optional androidx.wear.protolayout.DimensionBuilders.ImageDimension width, optional androidx.wear.protolayout.DimensionBuilders.ImageDimension height, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional int contentScaleMode);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement backgroundImage(androidx.wear.protolayout.material3.MaterialScope, String protoLayoutResourceId, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional androidx.wear.protolayout.DimensionBuilders.ImageDimension width, optional androidx.wear.protolayout.DimensionBuilders.ImageDimension height, optional androidx.wear.protolayout.types.LayoutColor? overlayColor, optional int contentScaleMode);
-  }
-
-  @androidx.wear.protolayout.material3.MaterialScopeMarker public class MaterialScope {
-    method public final androidx.wear.protolayout.material3.ColorScheme getColorScheme();
-    method public final android.content.Context getContext();
-    method public final androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters getDeviceConfiguration();
-    method public final androidx.wear.protolayout.material3.Shapes getShapes();
-    property public final androidx.wear.protolayout.material3.ColorScheme colorScheme;
-    property public final android.content.Context context;
-    property public final androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters deviceConfiguration;
-    property public final androidx.wear.protolayout.material3.Shapes shapes;
-  }
-
-  public final class MaterialScopeKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement materialScope(android.content.Context context, androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters deviceConfiguration, optional boolean allowDynamicTheme, optional androidx.wear.protolayout.material3.ColorScheme defaultColorScheme, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> layout);
-  }
-
-  @kotlin.DslMarker public @interface MaterialScopeMarker {
-  }
-
-  public final class PrimaryLayoutKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement primaryLayout(androidx.wear.protolayout.material3.MaterialScope, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement> mainSlot, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? titleSlot, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? bottomSlot, optional kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.material3.MaterialScope,? extends androidx.wear.protolayout.LayoutElementBuilders.LayoutElement>? labelForBottomSlot, optional androidx.wear.protolayout.ModifiersBuilders.Clickable? onClick, optional androidx.wear.protolayout.material3.PrimaryLayoutMargins margins);
-  }
-
-  public abstract class PrimaryLayoutMargins {
-    field public static final androidx.wear.protolayout.material3.PrimaryLayoutMargins.Companion Companion;
-    field public static final androidx.wear.protolayout.material3.PrimaryLayoutMargins DEFAULT_PRIMARY_LAYOUT_MARGIN;
-    field public static final androidx.wear.protolayout.material3.PrimaryLayoutMargins MAX_PRIMARY_LAYOUT_MARGIN;
-    field public static final androidx.wear.protolayout.material3.PrimaryLayoutMargins MID_PRIMARY_LAYOUT_MARGIN;
-    field public static final androidx.wear.protolayout.material3.PrimaryLayoutMargins MIN_PRIMARY_LAYOUT_MARGIN;
-  }
-
-  public static final class PrimaryLayoutMargins.Companion {
-    method public androidx.wear.protolayout.material3.PrimaryLayoutMargins customizedPrimaryLayoutMargin(@FloatRange(from=0.0, to=1.0) float start, @FloatRange(from=0.0, to=1.0) float end);
-    method public androidx.wear.protolayout.material3.PrimaryLayoutMargins customizedPrimaryLayoutMargin(@FloatRange(from=0.0, to=1.0) float start, @FloatRange(from=0.0, to=1.0) float end, @FloatRange(from=0.0, to=1.0) float bottom);
-    property public androidx.wear.protolayout.material3.PrimaryLayoutMargins DEFAULT_PRIMARY_LAYOUT_MARGIN;
-    property public androidx.wear.protolayout.material3.PrimaryLayoutMargins MAX_PRIMARY_LAYOUT_MARGIN;
-    property public androidx.wear.protolayout.material3.PrimaryLayoutMargins MID_PRIMARY_LAYOUT_MARGIN;
-    property public androidx.wear.protolayout.material3.PrimaryLayoutMargins MIN_PRIMARY_LAYOUT_MARGIN;
-  }
-
-  public final class ProgressIndicatorColors {
-    ctor public ProgressIndicatorColors(androidx.wear.protolayout.types.LayoutColor indicatorColor, androidx.wear.protolayout.types.LayoutColor trackColor, optional androidx.wear.protolayout.types.LayoutColor trackOverflowColor);
-    method public androidx.wear.protolayout.material3.ProgressIndicatorColors copy(optional androidx.wear.protolayout.types.LayoutColor indicatorColor, optional androidx.wear.protolayout.types.LayoutColor trackColor, optional androidx.wear.protolayout.types.LayoutColor trackOverflowColor);
-    method public androidx.wear.protolayout.types.LayoutColor getIndicatorColor();
-    method public androidx.wear.protolayout.types.LayoutColor getTrackColor();
-    method public androidx.wear.protolayout.types.LayoutColor getTrackOverflowColor();
-    property public androidx.wear.protolayout.types.LayoutColor indicatorColor;
-    property public androidx.wear.protolayout.types.LayoutColor trackColor;
-    property public androidx.wear.protolayout.types.LayoutColor trackOverflowColor;
-  }
-
-  public final class Shapes {
-    ctor public Shapes();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner getExtraLarge();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner getExtraSmall();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner getFull();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner getLarge();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner getMedium();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner getNone();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner getSmall();
-    property public androidx.wear.protolayout.ModifiersBuilders.Corner extraLarge;
-    property public androidx.wear.protolayout.ModifiersBuilders.Corner extraSmall;
-    property public androidx.wear.protolayout.ModifiersBuilders.Corner full;
-    property public androidx.wear.protolayout.ModifiersBuilders.Corner large;
-    property public androidx.wear.protolayout.ModifiersBuilders.Corner medium;
-    property public androidx.wear.protolayout.ModifiersBuilders.Corner none;
-    property public androidx.wear.protolayout.ModifiersBuilders.Corner small;
-  }
-
-  public final class TextButtonStyle {
-    field public static final androidx.wear.protolayout.material3.TextButtonStyle.Companion Companion;
-  }
-
-  public static final class TextButtonStyle.Companion {
-    method public androidx.wear.protolayout.material3.TextButtonStyle defaultTextButtonStyle();
-    method public androidx.wear.protolayout.material3.TextButtonStyle extraLargeTextButtonStyle();
-    method public androidx.wear.protolayout.material3.TextButtonStyle largeTextButtonStyle();
-    method public androidx.wear.protolayout.material3.TextButtonStyle smallTextButtonStyle();
-  }
-
-  public final class TextKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.LayoutElement text(androidx.wear.protolayout.material3.MaterialScope, androidx.wear.protolayout.types.LayoutString text, optional androidx.wear.protolayout.modifiers.LayoutModifier modifier, optional int typography, optional androidx.wear.protolayout.types.LayoutColor color, optional boolean italic, optional boolean underline, optional boolean scalable, optional int maxLines, optional int alignment, optional int overflow, optional @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) java.util.List<? extends androidx.wear.protolayout.LayoutElementBuilders.FontSetting> settings);
-  }
-
-  public final class TitleCardDefaults {
-    field public static final androidx.wear.protolayout.material3.TitleCardDefaults INSTANCE;
-  }
-
-  public final class TitleCardStyle {
-    field public static final androidx.wear.protolayout.material3.TitleCardStyle.Companion Companion;
-  }
-
-  public static final class TitleCardStyle.Companion {
-    method public androidx.wear.protolayout.material3.TitleCardStyle defaultTitleCardStyle();
-    method public androidx.wear.protolayout.material3.TitleCardStyle extraLargeTitleCardStyle();
-    method public androidx.wear.protolayout.material3.TitleCardStyle largeTitleCardStyle();
-    method public androidx.wear.protolayout.material3.TitleCardStyle smallTitleCardStyle();
-  }
-
-  @kotlin.jvm.JvmInline public final value class TitleContentPlacementInDataCard {
-    field public static final androidx.wear.protolayout.material3.TitleContentPlacementInDataCard.Companion Companion;
-  }
-
-  public static final class TitleContentPlacementInDataCard.Companion {
-    method public int getBottom();
-    method public int getTop();
-    property public int Bottom;
-    property public int Top;
-  }
-
-  public final class Typography {
-    property public static int BODY_EXTRA_SMALL;
-    property public static int BODY_LARGE;
-    property public static int BODY_MEDIUM;
-    property public static int BODY_SMALL;
-    property public static int DISPLAY_LARGE;
-    property public static int DISPLAY_MEDIUM;
-    property public static int DISPLAY_SMALL;
-    property public static int LABEL_LARGE;
-    property public static int LABEL_MEDIUM;
-    property public static int LABEL_SMALL;
-    property public static int NUMERAL_EXTRA_LARGE;
-    property public static int NUMERAL_EXTRA_SMALL;
-    property public static int NUMERAL_LARGE;
-    property public static int NUMERAL_MEDIUM;
-    property public static int NUMERAL_SMALL;
-    property public static int TITLE_LARGE;
-    property public static int TITLE_MEDIUM;
-    property public static int TITLE_SMALL;
-    field public static final int BODY_EXTRA_SMALL = 2; // 0x2
-    field public static final int BODY_LARGE = 3; // 0x3
-    field public static final int BODY_MEDIUM = 4; // 0x4
-    field public static final int BODY_SMALL = 5; // 0x5
-    field public static final int DISPLAY_LARGE = 6; // 0x6
-    field public static final int DISPLAY_MEDIUM = 7; // 0x7
-    field public static final int DISPLAY_SMALL = 8; // 0x8
-    field public static final androidx.wear.protolayout.material3.Typography INSTANCE;
-    field public static final int LABEL_LARGE = 9; // 0x9
-    field public static final int LABEL_MEDIUM = 10; // 0xa
-    field public static final int LABEL_SMALL = 11; // 0xb
-    field public static final int NUMERAL_EXTRA_LARGE = 12; // 0xc
-    field public static final int NUMERAL_EXTRA_SMALL = 13; // 0xd
-    field public static final int NUMERAL_LARGE = 14; // 0xe
-    field public static final int NUMERAL_MEDIUM = 15; // 0xf
-    field public static final int NUMERAL_SMALL = 16; // 0x10
-    field public static final int TITLE_LARGE = 17; // 0x11
-    field public static final int TITLE_MEDIUM = 18; // 0x12
-    field public static final int TITLE_SMALL = 19; // 0x13
-  }
-
-}
-
diff --git a/wear/protolayout/protolayout-renderer/api/1.3.0-beta01.txt b/wear/protolayout/protolayout-renderer/api/1.3.0-beta01.txt
deleted file mode 100644
index e6f50d0..0000000
--- a/wear/protolayout/protolayout-renderer/api/1.3.0-beta01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 4.0
diff --git a/wear/protolayout/protolayout-renderer/api/res-1.3.0-beta01.txt b/wear/protolayout/protolayout-renderer/api/res-1.3.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/wear/protolayout/protolayout-renderer/api/res-1.3.0-beta01.txt
+++ /dev/null
diff --git a/wear/protolayout/protolayout-renderer/api/restricted_1.3.0-beta01.txt b/wear/protolayout/protolayout-renderer/api/restricted_1.3.0-beta01.txt
deleted file mode 100644
index 1997456..0000000
--- a/wear/protolayout/protolayout-renderer/api/restricted_1.3.0-beta01.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.protolayout.renderer.common {
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface LoggingUtils {
-    method public boolean canLogD(String);
-    method public void logD(String, String);
-    method @com.google.errorprone.annotations.FormatMethod public void logD(String, @com.google.errorprone.annotations.FormatString String, java.lang.Object!...);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class LoggingUtilsImpl implements androidx.wear.protolayout.renderer.common.LoggingUtils {
-    ctor public LoggingUtilsImpl(android.content.ComponentName);
-    method public boolean canLogD(String);
-    method public void logD(String, String);
-    method @com.google.errorprone.annotations.FormatMethod public void logD(String, @com.google.errorprone.annotations.FormatString String, java.lang.Object!...);
-  }
-
-}
-
-package androidx.wear.protolayout.renderer.impl {
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ProtoLayoutViewInstance implements java.lang.AutoCloseable {
-    ctor public ProtoLayoutViewInstance(androidx.wear.protolayout.renderer.impl.ProtoLayoutViewInstance.Config);
-    method public void close() throws java.lang.Exception;
-    method @UiThread public void detach(android.view.ViewGroup);
-    method public java.util.List<androidx.wear.protolayout.expression.pipeline.DynamicTypeAnimator!> getAnimations();
-    method public void invalidateCache();
-    method @UiThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> renderAndAttach(androidx.wear.protolayout.proto.LayoutElementProto.Layout, androidx.wear.protolayout.proto.ResourceProto.Resources, android.view.ViewGroup);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final class ProtoLayoutViewInstance.Config {
-    method public com.google.common.util.concurrent.ListeningExecutorService getBgExecutorService();
-    method public String getClickableIdExtra();
-    method public androidx.wear.protolayout.renderer.impl.ProtoLayoutViewInstance.LoadActionListener getLoadActionListener();
-    method public androidx.wear.protolayout.renderer.common.LoggingUtils? getLoggingUtils();
-    method public java.util.Map<androidx.wear.protolayout.expression.pipeline.PlatformDataProvider!,java.util.Set<androidx.wear.protolayout.expression.PlatformDataKey<? extends java.lang.Object!>!>!> getPlatformDataProviders();
-    method public androidx.wear.protolayout.expression.pipeline.StateStore? getStateStore();
-    method public android.content.Context getUiContext();
-    method public com.google.common.util.concurrent.ListeningExecutorService getUiExecutorService();
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final class ProtoLayoutViewInstance.Config.Builder {
-    ctor public ProtoLayoutViewInstance.Config.Builder(android.content.Context, com.google.common.util.concurrent.ListeningExecutorService, com.google.common.util.concurrent.ListeningExecutorService, String);
-    method public androidx.wear.protolayout.renderer.impl.ProtoLayoutViewInstance.Config.Builder addPlatformDataProvider(androidx.wear.protolayout.expression.pipeline.PlatformDataProvider, androidx.wear.protolayout.expression.PlatformDataKey<? extends java.lang.Object!>!...);
-    method public androidx.wear.protolayout.renderer.impl.ProtoLayoutViewInstance.Config build();
-    method public androidx.wear.protolayout.renderer.impl.ProtoLayoutViewInstance.Config.Builder setLoadActionListener(androidx.wear.protolayout.renderer.impl.ProtoLayoutViewInstance.LoadActionListener);
-    method public androidx.wear.protolayout.renderer.impl.ProtoLayoutViewInstance.Config.Builder setStateStore(androidx.wear.protolayout.expression.pipeline.StateStore);
-  }
-
-  public static interface ProtoLayoutViewInstance.LoadActionListener {
-    method public void onClick(androidx.wear.protolayout.proto.StateProto.State);
-  }
-
-}
-
diff --git a/wear/protolayout/protolayout-renderer/lint-baseline.xml b/wear/protolayout/protolayout-renderer/lint-baseline.xml
deleted file mode 100644
index 0862d5c..0000000
--- a/wear/protolayout/protolayout-renderer/lint-baseline.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.10.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (8.10.0-alpha07)" variant="all" version="8.10.0-alpha07">
-
-    <issue
-        id="WrongThread"
-        message="Constructor FrameLayout must be called from the UI thread, currently inferred thread is worker thread"
-        errorLine1="        inflateParent = new FrameLayout(uiContext);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/wear/protolayout/renderer/impl/ProtoLayoutViewInstance.java"/>
-    </issue>
-
-    <issue
-        id="WrongThread"
-        message="Method getChildCount must be called from the UI thread, currently inferred thread is worker thread"
-        errorLine1="        if (inflateParent.getChildCount() > 0) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/wear/protolayout/renderer/impl/ProtoLayoutViewInstance.java"/>
-    </issue>
-
-    <issue
-        id="WrongThread"
-        message="Method getChildAt must be called from the UI thread, currently inferred thread is worker thread"
-        errorLine1="            View firstChild = inflateParent.getChildAt(0);"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/wear/protolayout/renderer/impl/ProtoLayoutViewInstance.java"/>
-    </issue>
-
-    <issue
-        id="WrongThread"
-        message="Method getLayoutParams must be called from the UI thread, currently inferred thread is worker thread"
-        errorLine1="                    (FrameLayout.LayoutParams) firstChild.getLayoutParams();"
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/wear/protolayout/renderer/impl/ProtoLayoutViewInstance.java"/>
-    </issue>
-
-    <issue
-        id="WrongThread"
-        message="Method setLayoutParams must be called from the UI thread, currently inferred thread is worker thread"
-        errorLine1="            firstChild.setLayoutParams(childLp);"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/wear/protolayout/renderer/impl/ProtoLayoutViewInstance.java"/>
-    </issue>
-
-</issues>
diff --git a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/BackgroundDrawable.kt b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/BackgroundDrawable.kt
index 7f94a56..8baa73e 100644
--- a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/BackgroundDrawable.kt
+++ b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/BackgroundDrawable.kt
@@ -34,13 +34,13 @@
 internal class BackgroundDrawable : GradientDrawable() {
     private val customPaint = Paint(Paint.ANTI_ALIAS_FLAG)
     private var isStrokeUsed = false
-    private var isAsymmetricalCornerUsed = false
+    private var cornerRadiiUsed = false
     private var fillColor: Int? = null
 
     var linearGradientHelper: LinearGradientHelper? = null
 
     override fun setCornerRadii(radii: FloatArray?) {
-        isAsymmetricalCornerUsed = true
+        cornerRadiiUsed = true
         super.setCornerRadii(radii)
     }
 
@@ -58,15 +58,14 @@
         val width = bounds.width()
         val height = bounds.height()
 
-        if (linearGradientHelper == null && (isStrokeUsed || isAsymmetricalCornerUsed)) {
+        val isCircle = width == height && cornerRadius >= width * 0.5f && !cornerRadiiUsed
+        if (linearGradientHelper == null && (isStrokeUsed || !isCircle)) {
             // If the shape is not a circle or stroke is used, then use the default implementation
             // of draw();
             super.draw(canvas)
             return
         }
 
-        // Shape of the drawable will be clipped by using outline on the caller site to prevent
-        // aliasing. See b/357061501.
         if (fillColor != null || linearGradientHelper != null) {
             customPaint.apply {
                 reset()
diff --git a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/IgnorableSpace.java b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/IgnorableSpace.java
deleted file mode 100644
index 7349a7e..0000000
--- a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/IgnorableSpace.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package androidx.wear.protolayout.renderer.inflater;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.view.View;
-
-import org.jspecify.annotations.NonNull;
-
-/**
- * Space is a lightweight View subclass that may be used to create gaps between components in
- * general purpose layouts.
- */
-public final class IgnorableSpace extends View {
-    /** {@inheritDoc} */
-    public IgnorableSpace(@NonNull Context context) {
-        super(context, /* attrs= */ null, /* defStyleAttr= */ 0, /* defStyleRes= */ 0);
-        if (getVisibility() == VISIBLE) {
-            setVisibility(INVISIBLE);
-        }
-    }
-
-    /**
-     * Draw nothing.
-     *
-     * @param canvas an unused parameter.
-     */
-    @SuppressWarnings("MissingSuperCall") // android.widget.Space doesn't call it
-    @Override
-    public void draw(@NonNull Canvas canvas) {}
-
-    /**
-     * Compare to: {@link View#getDefaultSize(int, int)} If mode is AT_MOST, return the child size
-     * instead of the parent size (unless it is too big).
-     */
-    private static int getDefaultSize2(int size, int measureSpec) {
-        int result = size;
-        int specMode = MeasureSpec.getMode(measureSpec);
-        int specSize = MeasureSpec.getSize(measureSpec);
-        switch (specMode) {
-            case MeasureSpec.UNSPECIFIED:
-                result = size;
-                break;
-            case MeasureSpec.AT_MOST:
-                result = Math.min(size, specSize);
-                break;
-            case MeasureSpec.EXACTLY:
-                result = specSize;
-                break;
-        }
-        return result;
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        setMeasuredDimension(
-                getDefaultSize2(getSuggestedMinimumWidth(), widthMeasureSpec),
-                getDefaultSize2(getSuggestedMinimumHeight(), heightMeasureSpec));
-    }
-}
diff --git a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflater.java b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflater.java
index 8af0824..440fd79 100644
--- a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflater.java
+++ b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflater.java
@@ -44,7 +44,6 @@
 import android.content.res.Resources;
 import android.content.res.Resources.Theme;
 import android.graphics.Color;
-import android.graphics.Outline;
 import android.graphics.Paint.Cap;
 import android.graphics.PorterDuff.Mode;
 import android.graphics.Rect;
@@ -454,7 +453,7 @@
                 return false;
             }
             ViewGroup sourceGroup = (ViewGroup) source;
-            if (getEffectiveChildCount(sourceGroup) != mNumMissingChildren) {
+            if (sourceGroup.getChildCount() != mNumMissingChildren) {
                 Log.w(
                         TAG,
                         String.format(
@@ -482,20 +481,6 @@
             return true;
         }
 
-        /**
-         * Returns the number of children that the given {@link ViewGroup} has, ignoring the
-         * children that are {@link IgnorableSpace} type.
-         */
-        private static int getEffectiveChildCount(ViewGroup viewGroup) {
-            int nonIgnoredChildrenCnt = 0;
-            for (int i = 0; i < viewGroup.getChildCount(); i++) {
-                if (!(viewGroup.getChildAt(i) instanceof IgnorableSpace)) {
-                    nonIgnoredChildrenCnt++;
-                }
-            }
-            return nonIgnoredChildrenCnt;
-        }
-
         @Nullable String getTag() {
             return (String) mView.getTag();
         }
@@ -1664,8 +1649,6 @@
         // apply corner
         final Corner corner = background.getCorner();
         final int radiusPx = corner.hasRadius() ? safeDpToPx(corner.getRadius()) : 0;
-
-        // Sort out specific corner radii.
         float[] radii = new float[8];
         Arrays.fill(radii, radiusPx);
         if (corner.hasTopLeftRadius()) {
@@ -1681,33 +1664,19 @@
             setCornerRadiusToArray(corner.getBottomLeftRadius(), radii, /* index= */ 6);
         }
 
-        boolean isCornerWithEqualRadii = areAllEqual(radii, /* count= */ 8);
-        if (isCornerWithEqualRadii) {
+        if (areAllEqual(radii, /* count= */ 8)) {
             if (radii[0] == 0) {
                 return;
             }
-            // We will clip the drawable view with all equal corner radii by using outline, but we
-            // still
-            // need to set corners for cases when we use border.
+            // The implementation in BackgroundDrawable is more efficient by calling setCornerRadius
+            // than calling setCornerRadii with an array of all equal items.
             drawable.setCornerRadius(radii[0]);
-
-            // Set outline provider to correctly clip to the given corner, when it's some form of
-            // rounded
-            // rectangular (i.e. all equal corner radii). This can't be done automatically by the
-            // drawable
-            // due to the aliasing issues. See b/357061501 for more details.
-            view.setOutlineProvider(
-                    new ViewOutlineProvider() {
-                        @Override
-                        public void getOutline(View view, Outline outline) {
-                            outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), radii[0]);
-                            outline.setAlpha(0.0f);
-                        }
-                    });
-            view.setClipToOutline(true);
         } else {
             drawable.setCornerRadii(radii);
         }
+
+        view.setClipToOutline(true);
+        view.setOutlineProvider(ViewOutlineProvider.BACKGROUND);
     }
 
     private void setCornerRadiusToArray(
@@ -2534,11 +2503,10 @@
         // bottom of FrameLayout#onMeasure).
         //
         // To work around this (without copying the whole of FrameLayout just to change a "1" to
-        // "0"), we add a specific IgnorableSpace element in if there is one MATCH_PARENT child.
-        // This has a tiny cost to the measure pass, and negligible cost to layout/draw (since it
-        // doesn't take part in those passes).
-        // This element needs to be specific class that won't be counted towards the effective
-        // children of the parent when doing layout mutation. See b/345186544
+        // "0"),
+        // we add a Space element in if there is one MATCH_PARENT child. This has a tiny cost to the
+        // measure pass, and negligible cost to layout/draw (since it doesn't take part in those
+        // passes).
         int numMatchParentChildren = 0;
         for (int i = 0; i < frame.getChildCount(); i++) {
             LayoutParams lp = frame.getChildAt(i).getLayoutParams();
@@ -2548,7 +2516,7 @@
         }
 
         if (numMatchParentChildren == 1) {
-            IgnorableSpace hackSpace = new IgnorableSpace(mUiContext);
+            Space hackSpace = new Space(mUiContext);
             LayoutParams hackSpaceLp =
                     new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
             frame.addView(hackSpace, hackSpaceLp);
diff --git a/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflaterTest.java b/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflaterTest.java
index 9c2062d..e9e5582 100644
--- a/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflaterTest.java
+++ b/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflaterTest.java
@@ -760,75 +760,6 @@
     }
 
     @Test
-    public void inflate_expandableBox_withExpandChildWithWrapChild_appliesMutationCorrectly() {
-        // Box - Box - Text
-        Text.Builder text1 = Text.newBuilder().setText(StringProp.newBuilder().setValue("1"));
-        LayoutElement.Builder children1 =
-                LayoutElement.newBuilder()
-                        .setBox(
-                                Box.newBuilder()
-                                        .setWidth(expand())
-                                        .setHeight(expand())
-                                        .addContents(
-                                                LayoutElement.newBuilder().setText(text1).build())
-                                        .build());
-        Modifiers.Builder modifier1 =
-                Modifiers.newBuilder().setClickable(Clickable.newBuilder().setId("1").build());
-        LayoutElement layout1 =
-                LayoutElement.newBuilder()
-                        .setBox(
-                                Box.newBuilder()
-                                        .setModifiers(modifier1)
-                                        .setWidth(expand())
-                                        .setHeight(expand())
-                                        .addContents(children1))
-                        .build();
-
-        // Box (has diff for self) - Box - Text (has diff for self)
-        Text.Builder text2 = Text.newBuilder().setText(StringProp.newBuilder().setValue("2"));
-        LayoutElement.Builder children2 =
-                LayoutElement.newBuilder()
-                        .setBox(
-                                Box.newBuilder()
-                                        .setWidth(expand())
-                                        .setHeight(expand())
-                                        .addContents(
-                                                LayoutElement.newBuilder().setText(text2).build())
-                                        .build());
-        Modifiers.Builder modifier2 =
-                Modifiers.newBuilder().setClickable(Clickable.newBuilder().setId("2").build());
-        LayoutElement layout2 =
-                LayoutElement.newBuilder()
-                        .setBox(
-                                Box.newBuilder()
-                                        .setModifiers(modifier2)
-                                        .setWidth(expand())
-                                        .setHeight(expand())
-                                        .addContents(children2))
-                        .build();
-
-        // Add initial layout.
-        Renderer renderer = renderer(fingerprintedLayout(layout1));
-        ViewGroup inflatedViewParent = renderer.inflate();
-
-        // Check that there's a single element in the layout
-        assertThat(inflatedViewParent.getChildCount()).isEqualTo(1);
-
-        // Compute the mutation.
-        ViewGroupMutation mutation =
-                renderer.computeMutation(
-                        getRenderedMetadata(inflatedViewParent), fingerprintedLayout(layout2));
-        assertThat(mutation).isNotNull();
-        assertThat(mutation.isNoOp()).isFalse();
-
-        // Apply the mutation.
-        boolean mutationResult = renderer.applyMutation(inflatedViewParent, mutation);
-
-        // Make sure that mutation was successful.
-        assertThat(mutationResult).isTrue();
-    }
-
-    @Test
     public void inflate_spacerWithModifiers() {
         int width = 10;
         int height = 20;
diff --git a/wear/protolayout/protolayout-testing/api/1.3.0-beta01.txt b/wear/protolayout/protolayout-testing/api/1.3.0-beta01.txt
deleted file mode 100644
index 9689c33..0000000
--- a/wear/protolayout/protolayout-testing/api/1.3.0-beta01.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.protolayout.testing {
-
-  public final class Filters {
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher containsTag(String value);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasAllCorners(float radiusDp);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasBottomLeftCorner(float xRadiusDp, float yRadiusDp);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasBottomRightCorner(float xRadiusDp, float yRadiusDp);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasChild(androidx.wear.protolayout.testing.LayoutElementMatcher matcher);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasClickable();
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasClickable(optional androidx.wear.protolayout.ActionBuilders.Action action);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasClickable(optional androidx.wear.protolayout.ActionBuilders.Action action, optional String? id);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasClickable(optional androidx.wear.protolayout.ActionBuilders.Action action, optional String? id, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float minClickableWidth);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasClickable(optional androidx.wear.protolayout.ActionBuilders.Action action, optional String? id, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float minClickableWidth, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float minClickableHeight);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasColor(@ColorInt int argb);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasContentDescription(String value);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasContentDescription(kotlin.text.Regex pattern);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasDescendant(androidx.wear.protolayout.testing.LayoutElementMatcher matcher);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasHeight(androidx.wear.protolayout.DimensionBuilders.ContainerDimension height);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasHeight(androidx.wear.protolayout.DimensionBuilders.ProportionalDimensionProp height);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasImage(String protolayoutResId);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasTag(String value);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasText(String value);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasText(String value, optional boolean subString);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasText(String value, optional boolean subString, optional boolean ignoreCase);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasTopLeftCorner(float xRadiusDp, float yRadiusDp);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasTopRightCorner(float xRadiusDp, float yRadiusDp);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasWidth(androidx.wear.protolayout.DimensionBuilders.ContainerDimension width);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasWidth(androidx.wear.protolayout.DimensionBuilders.ProportionalDimensionProp width);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher isClickable();
-  }
-
-  public final class LayoutElementAssertion {
-    method public androidx.wear.protolayout.testing.LayoutElementAssertion assert(androidx.wear.protolayout.testing.LayoutElementMatcher matcher);
-    method public void assertDoesNotExist();
-    method public void assertExists();
-  }
-
-  public final class LayoutElementAssertionsProvider {
-    ctor public LayoutElementAssertionsProvider(androidx.wear.protolayout.LayoutElementBuilders.Layout layout);
-    ctor public LayoutElementAssertionsProvider(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement layoutRoot);
-    method public androidx.wear.protolayout.testing.LayoutElementAssertion onElement(androidx.wear.protolayout.testing.LayoutElementMatcher matcher);
-    method public androidx.wear.protolayout.testing.LayoutElementAssertion onRoot();
-    method public androidx.wear.protolayout.testing.LayoutElementAssertionsProvider withDynamicData(androidx.wear.protolayout.expression.DynamicDataPair<? extends java.lang.Object?>... dynamicDataPairs);
-  }
-
-  public final class LayoutElementMatcher {
-    ctor public LayoutElementMatcher(String description, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.LayoutElementBuilders.LayoutElement,java.lang.Boolean> matcher);
-    ctor public LayoutElementMatcher(String description, kotlin.jvm.functions.Function2<? super androidx.wear.protolayout.LayoutElementBuilders.LayoutElement,? super androidx.wear.protolayout.testing.TestContext,java.lang.Boolean> matcher);
-    method public infix androidx.wear.protolayout.testing.LayoutElementMatcher and(androidx.wear.protolayout.testing.LayoutElementMatcher other);
-    method public operator androidx.wear.protolayout.testing.LayoutElementMatcher not();
-    method public infix androidx.wear.protolayout.testing.LayoutElementMatcher or(androidx.wear.protolayout.testing.LayoutElementMatcher other);
-  }
-
-  public final class TestContext {
-    method public androidx.wear.protolayout.expression.DynamicDataMap getDynamicData();
-    property public androidx.wear.protolayout.expression.DynamicDataMap dynamicData;
-  }
-
-}
-
diff --git a/wear/protolayout/protolayout-testing/api/res-1.3.0-beta01.txt b/wear/protolayout/protolayout-testing/api/res-1.3.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/wear/protolayout/protolayout-testing/api/res-1.3.0-beta01.txt
+++ /dev/null
diff --git a/wear/protolayout/protolayout-testing/api/restricted_1.3.0-beta01.txt b/wear/protolayout/protolayout-testing/api/restricted_1.3.0-beta01.txt
deleted file mode 100644
index 9689c33..0000000
--- a/wear/protolayout/protolayout-testing/api/restricted_1.3.0-beta01.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.protolayout.testing {
-
-  public final class Filters {
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher containsTag(String value);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasAllCorners(float radiusDp);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasBottomLeftCorner(float xRadiusDp, float yRadiusDp);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasBottomRightCorner(float xRadiusDp, float yRadiusDp);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasChild(androidx.wear.protolayout.testing.LayoutElementMatcher matcher);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasClickable();
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasClickable(optional androidx.wear.protolayout.ActionBuilders.Action action);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasClickable(optional androidx.wear.protolayout.ActionBuilders.Action action, optional String? id);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasClickable(optional androidx.wear.protolayout.ActionBuilders.Action action, optional String? id, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float minClickableWidth);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasClickable(optional androidx.wear.protolayout.ActionBuilders.Action action, optional String? id, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float minClickableWidth, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float minClickableHeight);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasColor(@ColorInt int argb);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasContentDescription(String value);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasContentDescription(kotlin.text.Regex pattern);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasDescendant(androidx.wear.protolayout.testing.LayoutElementMatcher matcher);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasHeight(androidx.wear.protolayout.DimensionBuilders.ContainerDimension height);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasHeight(androidx.wear.protolayout.DimensionBuilders.ProportionalDimensionProp height);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasImage(String protolayoutResId);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasTag(String value);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasText(String value);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasText(String value, optional boolean subString);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasText(String value, optional boolean subString, optional boolean ignoreCase);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasTopLeftCorner(float xRadiusDp, float yRadiusDp);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasTopRightCorner(float xRadiusDp, float yRadiusDp);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasWidth(androidx.wear.protolayout.DimensionBuilders.ContainerDimension width);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher hasWidth(androidx.wear.protolayout.DimensionBuilders.ProportionalDimensionProp width);
-    method public static androidx.wear.protolayout.testing.LayoutElementMatcher isClickable();
-  }
-
-  public final class LayoutElementAssertion {
-    method public androidx.wear.protolayout.testing.LayoutElementAssertion assert(androidx.wear.protolayout.testing.LayoutElementMatcher matcher);
-    method public void assertDoesNotExist();
-    method public void assertExists();
-  }
-
-  public final class LayoutElementAssertionsProvider {
-    ctor public LayoutElementAssertionsProvider(androidx.wear.protolayout.LayoutElementBuilders.Layout layout);
-    ctor public LayoutElementAssertionsProvider(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement layoutRoot);
-    method public androidx.wear.protolayout.testing.LayoutElementAssertion onElement(androidx.wear.protolayout.testing.LayoutElementMatcher matcher);
-    method public androidx.wear.protolayout.testing.LayoutElementAssertion onRoot();
-    method public androidx.wear.protolayout.testing.LayoutElementAssertionsProvider withDynamicData(androidx.wear.protolayout.expression.DynamicDataPair<? extends java.lang.Object?>... dynamicDataPairs);
-  }
-
-  public final class LayoutElementMatcher {
-    ctor public LayoutElementMatcher(String description, kotlin.jvm.functions.Function1<? super androidx.wear.protolayout.LayoutElementBuilders.LayoutElement,java.lang.Boolean> matcher);
-    ctor public LayoutElementMatcher(String description, kotlin.jvm.functions.Function2<? super androidx.wear.protolayout.LayoutElementBuilders.LayoutElement,? super androidx.wear.protolayout.testing.TestContext,java.lang.Boolean> matcher);
-    method public infix androidx.wear.protolayout.testing.LayoutElementMatcher and(androidx.wear.protolayout.testing.LayoutElementMatcher other);
-    method public operator androidx.wear.protolayout.testing.LayoutElementMatcher not();
-    method public infix androidx.wear.protolayout.testing.LayoutElementMatcher or(androidx.wear.protolayout.testing.LayoutElementMatcher other);
-  }
-
-  public final class TestContext {
-    method public androidx.wear.protolayout.expression.DynamicDataMap getDynamicData();
-    property public androidx.wear.protolayout.expression.DynamicDataMap dynamicData;
-  }
-
-}
-
diff --git a/wear/protolayout/protolayout/api/1.3.0-beta01.txt b/wear/protolayout/protolayout/api/1.3.0-beta01.txt
deleted file mode 100644
index c7d1618..0000000
--- a/wear/protolayout/protolayout/api/1.3.0-beta01.txt
+++ /dev/null
@@ -1,1662 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.protolayout {
-
-  public final class ActionBuilders {
-    method public static androidx.wear.protolayout.ActionBuilders.AndroidBooleanExtra booleanExtra(boolean);
-    method public static androidx.wear.protolayout.ActionBuilders.AndroidDoubleExtra doubleExtra(double);
-    method public static androidx.wear.protolayout.ActionBuilders.AndroidIntExtra intExtra(int);
-    method public static androidx.wear.protolayout.ActionBuilders.LaunchAction launchAction(android.content.ComponentName);
-    method public static androidx.wear.protolayout.ActionBuilders.LaunchAction launchAction(android.content.ComponentName, java.util.Map<java.lang.String!,androidx.wear.protolayout.ActionBuilders.AndroidExtra!>);
-    method public static androidx.wear.protolayout.ActionBuilders.AndroidLongExtra longExtra(long);
-    method public static androidx.wear.protolayout.ActionBuilders.AndroidStringExtra stringExtra(String);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface ActionBuilders.Action {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.AndroidActivity {
-    method public String getClassName();
-    method public java.util.Map<java.lang.String!,androidx.wear.protolayout.ActionBuilders.AndroidExtra!> getKeyToExtraMapping();
-    method public String getPackageName();
-  }
-
-  public static final class ActionBuilders.AndroidActivity.Builder {
-    ctor public ActionBuilders.AndroidActivity.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidActivity.Builder addKeyToExtraMapping(String, androidx.wear.protolayout.ActionBuilders.AndroidExtra);
-    method public androidx.wear.protolayout.ActionBuilders.AndroidActivity build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidActivity.Builder setClassName(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidActivity.Builder setPackageName(String);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.AndroidBooleanExtra implements androidx.wear.protolayout.ActionBuilders.AndroidExtra {
-    method public boolean getValue();
-  }
-
-  public static final class ActionBuilders.AndroidBooleanExtra.Builder {
-    ctor public ActionBuilders.AndroidBooleanExtra.Builder();
-    method public androidx.wear.protolayout.ActionBuilders.AndroidBooleanExtra build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidBooleanExtra.Builder setValue(boolean);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.AndroidDoubleExtra implements androidx.wear.protolayout.ActionBuilders.AndroidExtra {
-    method public double getValue();
-  }
-
-  public static final class ActionBuilders.AndroidDoubleExtra.Builder {
-    ctor public ActionBuilders.AndroidDoubleExtra.Builder();
-    method public androidx.wear.protolayout.ActionBuilders.AndroidDoubleExtra build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidDoubleExtra.Builder setValue(double);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface ActionBuilders.AndroidExtra {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.AndroidIntExtra implements androidx.wear.protolayout.ActionBuilders.AndroidExtra {
-    method public int getValue();
-  }
-
-  public static final class ActionBuilders.AndroidIntExtra.Builder {
-    ctor public ActionBuilders.AndroidIntExtra.Builder();
-    method public androidx.wear.protolayout.ActionBuilders.AndroidIntExtra build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidIntExtra.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.AndroidLongExtra implements androidx.wear.protolayout.ActionBuilders.AndroidExtra {
-    method public long getValue();
-  }
-
-  public static final class ActionBuilders.AndroidLongExtra.Builder {
-    ctor public ActionBuilders.AndroidLongExtra.Builder();
-    method public androidx.wear.protolayout.ActionBuilders.AndroidLongExtra build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidLongExtra.Builder setValue(long);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.AndroidStringExtra implements androidx.wear.protolayout.ActionBuilders.AndroidExtra {
-    method public String getValue();
-  }
-
-  public static final class ActionBuilders.AndroidStringExtra.Builder {
-    ctor public ActionBuilders.AndroidStringExtra.Builder();
-    method public androidx.wear.protolayout.ActionBuilders.AndroidStringExtra build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidStringExtra.Builder setValue(String);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.LaunchAction implements androidx.wear.protolayout.ActionBuilders.Action {
-    method public androidx.wear.protolayout.ActionBuilders.AndroidActivity? getAndroidActivity();
-  }
-
-  public static final class ActionBuilders.LaunchAction.Builder {
-    ctor public ActionBuilders.LaunchAction.Builder();
-    method public androidx.wear.protolayout.ActionBuilders.LaunchAction build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.LaunchAction.Builder setAndroidActivity(androidx.wear.protolayout.ActionBuilders.AndroidActivity);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.LoadAction implements androidx.wear.protolayout.ActionBuilders.Action {
-    method public androidx.wear.protolayout.StateBuilders.State? getRequestState();
-  }
-
-  public static final class ActionBuilders.LoadAction.Builder {
-    ctor public ActionBuilders.LoadAction.Builder();
-    method public androidx.wear.protolayout.ActionBuilders.LoadAction build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.LoadAction.Builder setRequestState(androidx.wear.protolayout.StateBuilders.State);
-  }
-
-  public final class ColorBuilders {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.ColorBuilders.ColorProp argb(@ColorInt int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static interface ColorBuilders.Brush {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ColorBuilders.ColorProp {
-    method @ColorInt public int getArgb();
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor? getDynamicValue();
-  }
-
-  public static final class ColorBuilders.ColorProp.Builder {
-    ctor @Deprecated public ColorBuilders.ColorProp.Builder();
-    ctor public ColorBuilders.ColorProp.Builder(@ColorInt int);
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ColorBuilders.ColorProp.Builder setArgb(@ColorInt int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ColorBuilders.ColorProp.Builder setDynamicValue(androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static final class ColorBuilders.ColorStop {
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getColor();
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp? getOffset();
-  }
-
-  public static final class ColorBuilders.ColorStop.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public ColorBuilders.ColorStop.Builder(androidx.wear.protolayout.ColorBuilders.ColorProp, androidx.wear.protolayout.TypeBuilders.FloatProp);
-    method public androidx.wear.protolayout.ColorBuilders.ColorStop build();
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static final class ColorBuilders.LinearGradient implements androidx.wear.protolayout.ColorBuilders.Brush {
-    method public java.util.List<androidx.wear.protolayout.ColorBuilders.ColorStop!> getColorStops();
-    method public androidx.wear.protolayout.DimensionBuilders.OffsetDimension? getEndX();
-    method public androidx.wear.protolayout.DimensionBuilders.OffsetDimension? getEndY();
-    method public androidx.wear.protolayout.DimensionBuilders.OffsetDimension? getStartX();
-    method public androidx.wear.protolayout.DimensionBuilders.OffsetDimension? getStartY();
-  }
-
-  public static final class ColorBuilders.LinearGradient.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) @java.lang.SafeVarargs public ColorBuilders.LinearGradient.Builder(androidx.wear.protolayout.ColorBuilders.ColorProp!...);
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) @java.lang.SafeVarargs public ColorBuilders.LinearGradient.Builder(androidx.wear.protolayout.ColorBuilders.ColorStop!...);
-    method public androidx.wear.protolayout.ColorBuilders.LinearGradient build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ColorBuilders.LinearGradient.Builder setEndX(androidx.wear.protolayout.DimensionBuilders.OffsetDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ColorBuilders.LinearGradient.Builder setEndY(androidx.wear.protolayout.DimensionBuilders.OffsetDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ColorBuilders.LinearGradient.Builder setStartX(androidx.wear.protolayout.DimensionBuilders.OffsetDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ColorBuilders.LinearGradient.Builder setStartY(androidx.wear.protolayout.DimensionBuilders.OffsetDimension);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static final class ColorBuilders.SweepGradient implements androidx.wear.protolayout.ColorBuilders.Brush {
-    method public java.util.List<androidx.wear.protolayout.ColorBuilders.ColorStop!> getColorStops();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getEndAngle();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getStartAngle();
-  }
-
-  public static final class ColorBuilders.SweepGradient.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) @java.lang.SafeVarargs public ColorBuilders.SweepGradient.Builder(androidx.wear.protolayout.ColorBuilders.ColorProp!...);
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) @java.lang.SafeVarargs public ColorBuilders.SweepGradient.Builder(androidx.wear.protolayout.ColorBuilders.ColorStop!...);
-    method public androidx.wear.protolayout.ColorBuilders.SweepGradient build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.ColorBuilders.SweepGradient.Builder setEndAngle(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.ColorBuilders.SweepGradient.Builder setStartAngle(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
-  }
-
-  public final class DeviceParametersBuilders {
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int DEVICE_PLATFORM_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int DEVICE_PLATFORM_WEAR_OS = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int SCREEN_SHAPE_RECT = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int SCREEN_SHAPE_ROUND = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int SCREEN_SHAPE_UNDEFINED = 0; // 0x0
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class DeviceParametersBuilders.Capabilities {
-    method public long getMinimumFreshnessLimitMillis();
-  }
-
-  public static final class DeviceParametersBuilders.Capabilities.Builder {
-    ctor public DeviceParametersBuilders.Capabilities.Builder();
-    method public androidx.wear.protolayout.DeviceParametersBuilders.Capabilities build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DeviceParametersBuilders.Capabilities.Builder setMinimumFreshnessLimitMillis(long);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DeviceParametersBuilders.DeviceParameters {
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.DeviceParametersBuilders.Capabilities? getCapabilities();
-    method public int getDevicePlatform();
-    method @FloatRange(from=0.0, fromInclusive=false, toInclusive=false) public float getFontScale();
-    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo getRendererSchemaVersion();
-    method @FloatRange(from=0.0, fromInclusive=false, toInclusive=false) public float getScreenDensity();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getScreenHeightDp();
-    method public int getScreenShape();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getScreenWidthDp();
-  }
-
-  public static final class DeviceParametersBuilders.DeviceParameters.Builder {
-    ctor public DeviceParametersBuilders.DeviceParameters.Builder();
-    method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters build();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setCapabilities(androidx.wear.protolayout.DeviceParametersBuilders.Capabilities);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setDevicePlatform(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setFontScale(@FloatRange(from=0.0, fromInclusive=false, toInclusive=false) float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setRendererSchemaVersion(androidx.wear.protolayout.expression.VersionBuilders.VersionInfo);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenDensity(@FloatRange(from=0.0, fromInclusive=false, toInclusive=false) float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenHeightDp(@Dimension(unit=androidx.annotation.Dimension.DP) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenShape(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenWidthDp(@Dimension(unit=androidx.annotation.Dimension.DP) int);
-  }
-
-  public final class DimensionBuilders {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.DimensionBuilders.DegreesProp degrees(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.DimensionBuilders.DpProp dp(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.DimensionBuilders.EmProp em(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.DimensionBuilders.EmProp em(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.DimensionBuilders.ExpandedDimensionProp expand();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.DimensionBuilders.SpProp sp(@Dimension(unit=androidx.annotation.Dimension.SP) float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static androidx.wear.protolayout.DimensionBuilders.ExpandedDimensionProp weight(@FloatRange(from=0.0) float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.DimensionBuilders.WrappedDimensionProp wrap();
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static interface DimensionBuilders.AngularDimension {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class DimensionBuilders.AngularLayoutConstraint {
-    method public int getAngularAlignment();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getValue();
-  }
-
-  public static final class DimensionBuilders.AngularLayoutConstraint.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public DimensionBuilders.AngularLayoutConstraint.Builder(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method public androidx.wear.protolayout.DimensionBuilders.AngularLayoutConstraint build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DimensionBuilders.AngularLayoutConstraint.Builder setAngularAlignment(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static final class DimensionBuilders.BoundingBoxRatio implements androidx.wear.protolayout.DimensionBuilders.OffsetDimension androidx.wear.protolayout.DimensionBuilders.PivotDimension {
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp getRatio();
-  }
-
-  public static final class DimensionBuilders.BoundingBoxRatio.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public DimensionBuilders.BoundingBoxRatio.Builder(androidx.wear.protolayout.TypeBuilders.FloatProp);
-    method public androidx.wear.protolayout.DimensionBuilders.BoundingBoxRatio build();
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface DimensionBuilders.ContainerDimension {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DimensionBuilders.DegreesProp implements androidx.wear.protolayout.DimensionBuilders.AngularDimension {
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? getDynamicValue();
-    method public float getValue();
-  }
-
-  public static final class DimensionBuilders.DegreesProp.Builder {
-    ctor @Deprecated public DimensionBuilders.DegreesProp.Builder();
-    ctor public DimensionBuilders.DegreesProp.Builder(float);
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DimensionBuilders.DegreesProp.Builder setDynamicValue(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DimensionBuilders.DegreesProp.Builder setValue(float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DimensionBuilders.DpProp implements androidx.wear.protolayout.DimensionBuilders.AngularDimension androidx.wear.protolayout.DimensionBuilders.ContainerDimension androidx.wear.protolayout.DimensionBuilders.ExtensionDimension androidx.wear.protolayout.DimensionBuilders.ImageDimension androidx.wear.protolayout.DimensionBuilders.OffsetDimension androidx.wear.protolayout.DimensionBuilders.PivotDimension androidx.wear.protolayout.DimensionBuilders.SpacerDimension {
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? getDynamicValue();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getValue();
-  }
-
-  public static final class DimensionBuilders.DpProp.Builder {
-    ctor @Deprecated public DimensionBuilders.DpProp.Builder();
-    ctor public DimensionBuilders.DpProp.Builder(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DimensionBuilders.DpProp.Builder setDynamicValue(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DimensionBuilders.DpProp.Builder setValue(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DimensionBuilders.EmProp {
-    method public float getValue();
-  }
-
-  public static final class DimensionBuilders.EmProp.Builder {
-    ctor public DimensionBuilders.EmProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.EmProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DimensionBuilders.EmProp.Builder setValue(float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DimensionBuilders.ExpandedDimensionProp implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension androidx.wear.protolayout.DimensionBuilders.ImageDimension androidx.wear.protolayout.DimensionBuilders.SpacerDimension {
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp? getLayoutWeight();
-  }
-
-  public static final class DimensionBuilders.ExpandedDimensionProp.Builder {
-    ctor public DimensionBuilders.ExpandedDimensionProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.ExpandedDimensionProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DimensionBuilders.ExpandedDimensionProp.Builder setLayoutWeight(androidx.wear.protolayout.TypeBuilders.FloatProp);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ExperimentalProtoLayoutExtensionApi @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface DimensionBuilders.ExtensionDimension {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class DimensionBuilders.HorizontalLayoutConstraint {
-    method public int getHorizontalAlignment();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getValue();
-  }
-
-  public static final class DimensionBuilders.HorizontalLayoutConstraint.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public DimensionBuilders.HorizontalLayoutConstraint.Builder(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method public androidx.wear.protolayout.DimensionBuilders.HorizontalLayoutConstraint build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DimensionBuilders.HorizontalLayoutConstraint.Builder setHorizontalAlignment(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface DimensionBuilders.ImageDimension {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static interface DimensionBuilders.OffsetDimension {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static interface DimensionBuilders.PivotDimension {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DimensionBuilders.ProportionalDimensionProp implements androidx.wear.protolayout.DimensionBuilders.ImageDimension {
-    method @IntRange(from=0) public int getAspectRatioHeight();
-    method @IntRange(from=0) public int getAspectRatioWidth();
-  }
-
-  public static final class DimensionBuilders.ProportionalDimensionProp.Builder {
-    ctor public DimensionBuilders.ProportionalDimensionProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.ProportionalDimensionProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DimensionBuilders.ProportionalDimensionProp.Builder setAspectRatioHeight(@IntRange(from=0) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DimensionBuilders.ProportionalDimensionProp.Builder setAspectRatioWidth(@IntRange(from=0) int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DimensionBuilders.SpProp {
-    method @Dimension(unit=androidx.annotation.Dimension.SP) public float getValue();
-  }
-
-  public static final class DimensionBuilders.SpProp.Builder {
-    ctor public DimensionBuilders.SpProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.SpProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DimensionBuilders.SpProp.Builder setValue(@Dimension(unit=androidx.annotation.Dimension.SP) float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface DimensionBuilders.SpacerDimension {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class DimensionBuilders.VerticalLayoutConstraint {
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getValue();
-    method public int getVerticalAlignment();
-  }
-
-  public static final class DimensionBuilders.VerticalLayoutConstraint.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public DimensionBuilders.VerticalLayoutConstraint.Builder(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method public androidx.wear.protolayout.DimensionBuilders.VerticalLayoutConstraint build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DimensionBuilders.VerticalLayoutConstraint.Builder setVerticalAlignment(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DimensionBuilders.WrappedDimensionProp implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension {
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getMinimumSize();
-  }
-
-  public static final class DimensionBuilders.WrappedDimensionProp.Builder {
-    ctor public DimensionBuilders.WrappedDimensionProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.WrappedDimensionProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DimensionBuilders.WrappedDimensionProp.Builder setMinimumSize(androidx.wear.protolayout.DimensionBuilders.DpProp);
-  }
-
-  public final class LayoutElementBuilders {
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int ANGULAR_ALIGNMENT_CENTER = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int ANGULAR_ALIGNMENT_END = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int ANGULAR_ALIGNMENT_START = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int ANGULAR_ALIGNMENT_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int ARC_ANCHOR_CENTER = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int ARC_ANCHOR_END = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int ARC_ANCHOR_START = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int ARC_ANCHOR_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int CONTENT_SCALE_MODE_CROP = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int CONTENT_SCALE_MODE_FILL_BOUNDS = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int CONTENT_SCALE_MODE_FIT = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int CONTENT_SCALE_MODE_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int FONT_VARIANT_BODY = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int FONT_VARIANT_TITLE = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int FONT_VARIANT_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int FONT_WEIGHT_BOLD = 700; // 0x2bc
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int FONT_WEIGHT_MEDIUM = 500; // 0x1f4
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int FONT_WEIGHT_NORMAL = 400; // 0x190
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int FONT_WEIGHT_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int HORIZONTAL_ALIGN_CENTER = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int HORIZONTAL_ALIGN_END = 5; // 0x5
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int HORIZONTAL_ALIGN_LEFT = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int HORIZONTAL_ALIGN_RIGHT = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int HORIZONTAL_ALIGN_START = 4; // 0x4
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int HORIZONTAL_ALIGN_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int SPAN_VERTICAL_ALIGN_BOTTOM = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int SPAN_VERTICAL_ALIGN_TEXT_BASELINE = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int SPAN_VERTICAL_ALIGN_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int STROKE_CAP_BUTT = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int STROKE_CAP_ROUND = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int STROKE_CAP_SQUARE = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int STROKE_CAP_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int TEXT_ALIGN_CENTER = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int TEXT_ALIGN_END = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int TEXT_ALIGN_START = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int TEXT_ALIGN_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static final int TEXT_OVERFLOW_ELLIPSIZE = 4; // 0x4
-    field @Deprecated @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int TEXT_OVERFLOW_ELLIPSIZE_END = 2; // 0x2
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int TEXT_OVERFLOW_MARQUEE = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int TEXT_OVERFLOW_TRUNCATE = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int TEXT_OVERFLOW_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int VERTICAL_ALIGN_BOTTOM = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int VERTICAL_ALIGN_CENTER = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int VERTICAL_ALIGN_TOP = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int VERTICAL_ALIGN_UNDEFINED = 0; // 0x0
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Arc implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp? getAnchorAngle();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcAnchorTypeProp? getAnchorType();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp? getArcDirection();
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.ArcLayoutElement!> getContents();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp? getVerticalAlign();
-  }
-
-  public static final class LayoutElementBuilders.Arc.Builder {
-    ctor public LayoutElementBuilders.Arc.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder addContent(androidx.wear.protolayout.LayoutElementBuilders.ArcLayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Arc build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setAnchorAngle(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setAnchorType(androidx.wear.protolayout.LayoutElementBuilders.ArcAnchorTypeProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setAnchorType(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setArcDirection(androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setArcDirection(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setVerticalAlign(androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setVerticalAlign(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.ArcAdapter implements androidx.wear.protolayout.LayoutElementBuilders.ArcLayoutElement {
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getContent();
-    method public androidx.wear.protolayout.TypeBuilders.BoolProp? getRotateContents();
-  }
-
-  public static final class LayoutElementBuilders.ArcAdapter.Builder {
-    ctor public LayoutElementBuilders.ArcAdapter.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcAdapter build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcAdapter.Builder setContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcAdapter.Builder setRotateContents(androidx.wear.protolayout.TypeBuilders.BoolProp);
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcAdapter.Builder setRotateContents(boolean);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.ArcAnchorTypeProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.ArcAnchorTypeProp.Builder {
-    ctor public LayoutElementBuilders.ArcAnchorTypeProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcAnchorTypeProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcAnchorTypeProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static final class LayoutElementBuilders.ArcDirectionProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.ArcDirectionProp.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public LayoutElementBuilders.ArcDirectionProp.Builder(int);
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp build();
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface LayoutElementBuilders.ArcLayoutElement {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.ArcLine implements androidx.wear.protolayout.LayoutElementBuilders.ArcLayoutElement {
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp? getArcDirection();
-    method public androidx.wear.protolayout.ColorBuilders.Brush? getBrush();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp? getColor();
-    method public androidx.wear.protolayout.DimensionBuilders.AngularLayoutConstraint? getLayoutConstraintsForDynamicLength();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp? getLength();
-    method public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers? getModifiers();
-    method public androidx.wear.protolayout.LayoutElementBuilders.StrokeCapProp? getStrokeCap();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getThickness();
-  }
-
-  public static final class LayoutElementBuilders.ArcLine.Builder {
-    ctor public LayoutElementBuilders.ArcLine.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcLine build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setArcDirection(androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setArcDirection(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setBrush(androidx.wear.protolayout.ColorBuilders.Brush);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setColor(androidx.wear.protolayout.ColorBuilders.ColorProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setLayoutConstraintsForDynamicLength(androidx.wear.protolayout.DimensionBuilders.AngularLayoutConstraint);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setLength(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.ArcModifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setStrokeCap(androidx.wear.protolayout.LayoutElementBuilders.StrokeCapProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setStrokeCap(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setThickness(androidx.wear.protolayout.DimensionBuilders.DpProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.ArcSpacer implements androidx.wear.protolayout.LayoutElementBuilders.ArcLayoutElement {
-    method public androidx.wear.protolayout.DimensionBuilders.AngularDimension? getAngularLength();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp? getLength();
-    method public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers? getModifiers();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getThickness();
-  }
-
-  public static final class LayoutElementBuilders.ArcSpacer.Builder {
-    ctor public LayoutElementBuilders.ArcSpacer.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcSpacer build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.ArcSpacer.Builder setAngularLength(androidx.wear.protolayout.DimensionBuilders.AngularDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcSpacer.Builder setLength(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcSpacer.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.ArcModifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcSpacer.Builder setThickness(androidx.wear.protolayout.DimensionBuilders.DpProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.ArcText implements androidx.wear.protolayout.LayoutElementBuilders.ArcLayoutElement {
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp? getArcDirection();
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle? getFontStyle();
-    method public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers? getModifiers();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getText();
-  }
-
-  public static final class LayoutElementBuilders.ArcText.Builder {
-    ctor public LayoutElementBuilders.ArcText.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcText build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.ArcText.Builder setArcDirection(androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.ArcText.Builder setArcDirection(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcText.Builder setFontStyle(androidx.wear.protolayout.LayoutElementBuilders.FontStyle);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcText.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.ArcModifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcText.Builder setText(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcText.Builder setText(String);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Box implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.LayoutElement!> getContents();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension? getHeight();
-    method public androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp? getHorizontalAlignment();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp? getVerticalAlignment();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension? getWidth();
-  }
-
-  public static final class LayoutElementBuilders.Box.Builder {
-    ctor public LayoutElementBuilders.Box.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder addContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Box build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder setHeight(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder setHorizontalAlignment(androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder setHorizontalAlignment(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder setVerticalAlignment(androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder setVerticalAlignment(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.ColorFilter {
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp? getTint();
-  }
-
-  public static final class LayoutElementBuilders.ColorFilter.Builder {
-    ctor public LayoutElementBuilders.ColorFilter.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ColorFilter build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ColorFilter.Builder setTint(androidx.wear.protolayout.ColorBuilders.ColorProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Column implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.LayoutElement!> getContents();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension? getHeight();
-    method public androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp? getHorizontalAlignment();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension? getWidth();
-  }
-
-  public static final class LayoutElementBuilders.Column.Builder {
-    ctor public LayoutElementBuilders.Column.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Column.Builder addContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Column build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Column.Builder setHeight(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Column.Builder setHorizontalAlignment(androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Column.Builder setHorizontalAlignment(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Column.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Column.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.ContentScaleModeProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.ContentScaleModeProp.Builder {
-    ctor public LayoutElementBuilders.ContentScaleModeProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ContentScaleModeProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ContentScaleModeProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static final class LayoutElementBuilders.DashedArcLine implements androidx.wear.protolayout.LayoutElementBuilders.ArcLayoutElement {
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp? getArcDirection();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp? getColor();
-    method public androidx.wear.protolayout.DimensionBuilders.AngularLayoutConstraint? getLayoutConstraintsForDynamicLength();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp? getLength();
-    method public androidx.wear.protolayout.LayoutElementBuilders.DashedLinePattern? getLinePattern();
-    method public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers? getModifiers();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getThickness();
-  }
-
-  public static final class LayoutElementBuilders.DashedArcLine.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public LayoutElementBuilders.DashedArcLine.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setArcDirection(androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setArcDirection(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setColor(androidx.wear.protolayout.ColorBuilders.ColorProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setLayoutConstraintsForDynamicLength(androidx.wear.protolayout.DimensionBuilders.AngularLayoutConstraint);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setLength(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setLinePattern(androidx.wear.protolayout.LayoutElementBuilders.DashedLinePattern);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.ArcModifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setThickness(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static final class LayoutElementBuilders.DashedLinePattern {
-    method public java.util.List<androidx.wear.protolayout.DimensionBuilders.DegreesProp!> getGapLocations();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getGapSize();
-  }
-
-  public static final class LayoutElementBuilders.DashedLinePattern.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public LayoutElementBuilders.DashedLinePattern.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.DashedLinePattern build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedLinePattern.Builder setGapInterval(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedLinePattern.Builder setGapLocations(float...);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedLinePattern.Builder setGapSize(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ExperimentalProtoLayoutExtensionApi @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class LayoutElementBuilders.ExtensionLayoutElement implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public String getExtensionId();
-    method public androidx.wear.protolayout.DimensionBuilders.ExtensionDimension? getHeight();
-    method public byte[] getPayload();
-    method public androidx.wear.protolayout.DimensionBuilders.ExtensionDimension? getWidth();
-  }
-
-  public static final class LayoutElementBuilders.ExtensionLayoutElement.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public LayoutElementBuilders.ExtensionLayoutElement.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ExtensionLayoutElement build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.ExtensionLayoutElement.Builder setExtensionId(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.ExtensionLayoutElement.Builder setHeight(androidx.wear.protolayout.DimensionBuilders.ExtensionDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.ExtensionLayoutElement.Builder setPayload(byte[]);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.ExtensionLayoutElement.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.ExtensionDimension);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static interface LayoutElementBuilders.FontSetting {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.LayoutElementBuilders.FontSetting roundness(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.LayoutElementBuilders.FontSetting tabularNum();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.LayoutElementBuilders.FontSetting weight(@IntRange(from=1, to=1000) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.LayoutElementBuilders.FontSetting width(@FloatRange(from=25, to=200) float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.FontStyle {
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp? getColor();
-    method public androidx.wear.protolayout.TypeBuilders.BoolProp? getItalic();
-    method public androidx.wear.protolayout.DimensionBuilders.EmProp? getLetterSpacing();
-    method public java.util.List<java.lang.String!> getPreferredFontFamilies();
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.FontSetting!> getSettings();
-    method public androidx.wear.protolayout.DimensionBuilders.SpProp? getSize();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public java.util.List<androidx.wear.protolayout.DimensionBuilders.SpProp!> getSizes();
-    method public androidx.wear.protolayout.TypeBuilders.BoolProp? getUnderline();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.LayoutElementBuilders.FontVariantProp? getVariant();
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontWeightProp? getWeight();
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static final String ROBOTO_FLEX_FONT = "roboto-flex";
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static final String ROBOTO_FONT = "roboto";
-  }
-
-  public static final class LayoutElementBuilders.FontStyle.Builder {
-    ctor public LayoutElementBuilders.FontStyle.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setColor(androidx.wear.protolayout.ColorBuilders.ColorProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setItalic(androidx.wear.protolayout.TypeBuilders.BoolProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setItalic(boolean);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setLetterSpacing(androidx.wear.protolayout.DimensionBuilders.EmProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setPreferredFontFamilies(String, java.lang.String!...);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setSettings(androidx.wear.protolayout.LayoutElementBuilders.FontSetting!...);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setSize(androidx.wear.protolayout.DimensionBuilders.SpProp);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setSizes(@Dimension(unit=androidx.annotation.Dimension.SP) @IntRange(from=1) int...);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setUnderline(androidx.wear.protolayout.TypeBuilders.BoolProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setUnderline(boolean);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setVariant(androidx.wear.protolayout.LayoutElementBuilders.FontVariantProp);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setVariant(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setWeight(androidx.wear.protolayout.LayoutElementBuilders.FontWeightProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setWeight(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.FontStyles {
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder body1(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder body2(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder button(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder caption1(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder caption2(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder display1(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder display2(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder display3(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder title1(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder title2(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder title3(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.FontVariantProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.FontVariantProp.Builder {
-    ctor public LayoutElementBuilders.FontVariantProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontVariantProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontVariantProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.FontWeightProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.FontWeightProp.Builder {
-    ctor public LayoutElementBuilders.FontWeightProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontWeightProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontWeightProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.HorizontalAlignmentProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.HorizontalAlignmentProp.Builder {
-    ctor public LayoutElementBuilders.HorizontalAlignmentProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Image implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public androidx.wear.protolayout.LayoutElementBuilders.ColorFilter? getColorFilter();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ContentScaleModeProp? getContentScaleMode();
-    method public androidx.wear.protolayout.DimensionBuilders.ImageDimension? getHeight();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getResourceId();
-    method public androidx.wear.protolayout.DimensionBuilders.ImageDimension? getWidth();
-  }
-
-  public static final class LayoutElementBuilders.Image.Builder {
-    ctor public LayoutElementBuilders.Image.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.Image build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setColorFilter(androidx.wear.protolayout.LayoutElementBuilders.ColorFilter);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setContentScaleMode(androidx.wear.protolayout.LayoutElementBuilders.ContentScaleModeProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setContentScaleMode(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setHeight(androidx.wear.protolayout.DimensionBuilders.ImageDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setResourceId(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setResourceId(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.ImageDimension);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Layout {
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public static androidx.wear.protolayout.LayoutElementBuilders.Layout? fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.Layout fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getRoot();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public byte[] toByteArray();
-  }
-
-  public static final class LayoutElementBuilders.Layout.Builder {
-    ctor public LayoutElementBuilders.Layout.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.Layout build();
-    method public androidx.wear.protolayout.LayoutElementBuilders.Layout.Builder setRoot(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface LayoutElementBuilders.LayoutElement {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Row implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.LayoutElement!> getContents();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension? getHeight();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp? getVerticalAlignment();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension? getWidth();
-  }
-
-  public static final class LayoutElementBuilders.Row.Builder {
-    ctor public LayoutElementBuilders.Row.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Row.Builder addContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Row build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Row.Builder setHeight(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Row.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Row.Builder setVerticalAlignment(androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Row.Builder setVerticalAlignment(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Row.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Spacer implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public androidx.wear.protolayout.DimensionBuilders.SpacerDimension? getHeight();
-    method public androidx.wear.protolayout.DimensionBuilders.VerticalLayoutConstraint? getLayoutConstraintsForDynamicHeight();
-    method public androidx.wear.protolayout.DimensionBuilders.HorizontalLayoutConstraint? getLayoutConstraintsForDynamicWidth();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.DimensionBuilders.SpacerDimension? getWidth();
-  }
-
-  public static final class LayoutElementBuilders.Spacer.Builder {
-    ctor public LayoutElementBuilders.Spacer.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.Spacer build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spacer.Builder setHeight(androidx.wear.protolayout.DimensionBuilders.SpacerDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.Spacer.Builder setLayoutConstraintsForDynamicHeight(androidx.wear.protolayout.DimensionBuilders.VerticalLayoutConstraint);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.Spacer.Builder setLayoutConstraintsForDynamicWidth(androidx.wear.protolayout.DimensionBuilders.HorizontalLayoutConstraint);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spacer.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spacer.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.SpacerDimension);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface LayoutElementBuilders.Span {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.SpanImage implements androidx.wear.protolayout.LayoutElementBuilders.Span {
-    method public androidx.wear.protolayout.LayoutElementBuilders.SpanVerticalAlignmentProp? getAlignment();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getHeight();
-    method public androidx.wear.protolayout.ModifiersBuilders.SpanModifiers? getModifiers();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getResourceId();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getWidth();
-  }
-
-  public static final class LayoutElementBuilders.SpanImage.Builder {
-    ctor public LayoutElementBuilders.SpanImage.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.SpanImage build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanImage.Builder setAlignment(androidx.wear.protolayout.LayoutElementBuilders.SpanVerticalAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanImage.Builder setAlignment(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanImage.Builder setHeight(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanImage.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.SpanModifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanImage.Builder setResourceId(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanImage.Builder setResourceId(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanImage.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.DpProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.SpanText implements androidx.wear.protolayout.LayoutElementBuilders.Span {
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle? getFontStyle();
-    method public androidx.wear.protolayout.ModifiersBuilders.SpanModifiers? getModifiers();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getText();
-  }
-
-  public static final class LayoutElementBuilders.SpanText.Builder {
-    ctor public LayoutElementBuilders.SpanText.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.SpanText build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanText.Builder setFontStyle(androidx.wear.protolayout.LayoutElementBuilders.FontStyle);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanText.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.SpanModifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanText.Builder setText(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanText.Builder setText(String);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.SpanVerticalAlignmentProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.SpanVerticalAlignmentProp.Builder {
-    ctor public LayoutElementBuilders.SpanVerticalAlignmentProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.SpanVerticalAlignmentProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanVerticalAlignmentProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Spannable implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public androidx.wear.protolayout.DimensionBuilders.SpProp? getLineHeight();
-    method @SuppressCompatibility @IntRange(from=0xffffffff) @androidx.wear.protolayout.expression.ProtoLayoutExperimental public int getMarqueeIterations();
-    method public androidx.wear.protolayout.TypeBuilders.Int32Prop? getMaxLines();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp? getMultilineAlignment();
-    method public androidx.wear.protolayout.LayoutElementBuilders.TextOverflowProp? getOverflow();
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.Span!> getSpans();
-  }
-
-  public static final class LayoutElementBuilders.Spannable.Builder {
-    ctor public LayoutElementBuilders.Spannable.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder addSpan(androidx.wear.protolayout.LayoutElementBuilders.Span);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Spannable build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setLineHeight(androidx.wear.protolayout.DimensionBuilders.SpProp);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setMarqueeIterations(@IntRange(from=0xffffffff) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setMaxLines(androidx.wear.protolayout.TypeBuilders.Int32Prop);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setMaxLines(@IntRange(from=1) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setMultilineAlignment(androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setMultilineAlignment(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setOverflow(androidx.wear.protolayout.LayoutElementBuilders.TextOverflowProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setOverflow(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class LayoutElementBuilders.StrokeCapProp {
-    method public androidx.wear.protolayout.ModifiersBuilders.Shadow? getShadow();
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.StrokeCapProp.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public LayoutElementBuilders.StrokeCapProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.StrokeCapProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.StrokeCapProp.Builder setShadow(androidx.wear.protolayout.ModifiersBuilders.Shadow);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.StrokeCapProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Text implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle? getFontStyle();
-    method public androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint? getLayoutConstraintsForDynamicText();
-    method public androidx.wear.protolayout.DimensionBuilders.SpProp? getLineHeight();
-    method @SuppressCompatibility @IntRange(from=0xffffffff) @androidx.wear.protolayout.expression.ProtoLayoutExperimental public int getMarqueeIterations();
-    method public androidx.wear.protolayout.TypeBuilders.Int32Prop? getMaxLines();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.LayoutElementBuilders.TextAlignmentProp? getMultilineAlignment();
-    method public androidx.wear.protolayout.LayoutElementBuilders.TextOverflowProp? getOverflow();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getText();
-  }
-
-  public static final class LayoutElementBuilders.Text.Builder {
-    ctor public LayoutElementBuilders.Text.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.Text build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setFontStyle(androidx.wear.protolayout.LayoutElementBuilders.FontStyle);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setLayoutConstraintsForDynamicText(androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setLineHeight(androidx.wear.protolayout.DimensionBuilders.SpProp);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setMarqueeIterations(@IntRange(from=0xffffffff) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setMaxLines(androidx.wear.protolayout.TypeBuilders.Int32Prop);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setMaxLines(@IntRange(from=1) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setMultilineAlignment(androidx.wear.protolayout.LayoutElementBuilders.TextAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setMultilineAlignment(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setOverflow(androidx.wear.protolayout.LayoutElementBuilders.TextOverflowProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setOverflow(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setText(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setText(String);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.TextAlignmentProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.TextAlignmentProp.Builder {
-    ctor public LayoutElementBuilders.TextAlignmentProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.TextAlignmentProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.TextAlignmentProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.TextOverflowProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.TextOverflowProp.Builder {
-    ctor public LayoutElementBuilders.TextOverflowProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.TextOverflowProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.TextOverflowProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.VerticalAlignmentProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.VerticalAlignmentProp.Builder {
-    ctor public LayoutElementBuilders.VerticalAlignmentProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp.Builder setValue(int);
-  }
-
-  public final class ModifiersBuilders {
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SEMANTICS_ROLE_BUTTON = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SEMANTICS_ROLE_CHECKBOX = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SEMANTICS_ROLE_IMAGE = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SEMANTICS_ROLE_NONE = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SEMANTICS_ROLE_RADIOBUTTON = 5; // 0x5
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SEMANTICS_ROLE_SWITCH = 4; // 0x4
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_DIRECTION_BOTTOM_TO_TOP = 4; // 0x4
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_DIRECTION_LEFT_TO_RIGHT = 1; // 0x1
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_DIRECTION_RIGHT_TO_LEFT = 2; // 0x2
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_DIRECTION_TOP_TO_BOTTOM = 3; // 0x3
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_DIRECTION_UNDEFINED = 0; // 0x0
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_PARENT_SNAP_TO_INSIDE = 1; // 0x1
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_PARENT_SNAP_TO_OUTSIDE = 2; // 0x2
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_PARENT_SNAP_UNDEFINED = 0; // 0x0
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.AnimatedVisibility {
-    method public androidx.wear.protolayout.ModifiersBuilders.EnterTransition? getEnterTransition();
-    method public androidx.wear.protolayout.ModifiersBuilders.ExitTransition? getExitTransition();
-  }
-
-  public static final class ModifiersBuilders.AnimatedVisibility.Builder {
-    ctor public ModifiersBuilders.AnimatedVisibility.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.AnimatedVisibility build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.AnimatedVisibility.Builder setEnterTransition(androidx.wear.protolayout.ModifiersBuilders.EnterTransition);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.AnimatedVisibility.Builder setExitTransition(androidx.wear.protolayout.ModifiersBuilders.ExitTransition);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.ArcModifiers {
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable? getClickable();
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp? getOpacity();
-    method public androidx.wear.protolayout.ModifiersBuilders.Semantics? getSemantics();
-  }
-
-  public static final class ModifiersBuilders.ArcModifiers.Builder {
-    ctor public ModifiersBuilders.ArcModifiers.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers.Builder setClickable(androidx.wear.protolayout.ModifiersBuilders.Clickable);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers.Builder setOpacity(androidx.wear.protolayout.TypeBuilders.FloatProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers.Builder setSemantics(androidx.wear.protolayout.ModifiersBuilders.Semantics);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.Background {
-    method public androidx.wear.protolayout.ColorBuilders.Brush? getBrush();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp? getColor();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner? getCorner();
-  }
-
-  public static final class ModifiersBuilders.Background.Builder {
-    ctor public ModifiersBuilders.Background.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Background build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ModifiersBuilders.Background.Builder setBrush(androidx.wear.protolayout.ColorBuilders.Brush);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Background.Builder setColor(androidx.wear.protolayout.ColorBuilders.ColorProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Background.Builder setCorner(androidx.wear.protolayout.ModifiersBuilders.Corner);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.Border {
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp? getColor();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getWidth();
-  }
-
-  public static final class ModifiersBuilders.Border.Builder {
-    ctor public ModifiersBuilders.Border.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Border build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Border.Builder setColor(androidx.wear.protolayout.ColorBuilders.ColorProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Border.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.DpProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.Clickable {
-    method public String getId();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getMinimumClickableHeight();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getMinimumClickableWidth();
-    method public androidx.wear.protolayout.ActionBuilders.Action? getOnClick();
-    method public boolean isVisualFeedbackEnabled();
-  }
-
-  public static final class ModifiersBuilders.Clickable.Builder {
-    ctor public ModifiersBuilders.Clickable.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Clickable.Builder setId(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.ModifiersBuilders.Clickable.Builder setMinimumClickableHeight(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.ModifiersBuilders.Clickable.Builder setMinimumClickableWidth(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Clickable.Builder setOnClick(androidx.wear.protolayout.ActionBuilders.Action);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Clickable.Builder setVisualFeedbackEnabled(boolean);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.Corner {
-    method public androidx.wear.protolayout.ModifiersBuilders.CornerRadius getBottomLeftRadius();
-    method public androidx.wear.protolayout.ModifiersBuilders.CornerRadius getBottomRightRadius();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getRadius();
-    method public androidx.wear.protolayout.ModifiersBuilders.CornerRadius getTopLeftRadius();
-    method public androidx.wear.protolayout.ModifiersBuilders.CornerRadius getTopRightRadius();
-  }
-
-  public static final class ModifiersBuilders.Corner.Builder {
-    ctor public ModifiersBuilders.Corner.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setBottomLeftRadius(androidx.wear.protolayout.DimensionBuilders.DpProp, androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setBottomLeftRadius(androidx.wear.protolayout.ModifiersBuilders.CornerRadius);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setBottomRightRadius(androidx.wear.protolayout.DimensionBuilders.DpProp, androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setBottomRightRadius(androidx.wear.protolayout.ModifiersBuilders.CornerRadius);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setRadius(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setTopLeftRadius(androidx.wear.protolayout.DimensionBuilders.DpProp, androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setTopLeftRadius(androidx.wear.protolayout.ModifiersBuilders.CornerRadius);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setTopRightRadius(androidx.wear.protolayout.DimensionBuilders.DpProp, androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setTopRightRadius(androidx.wear.protolayout.ModifiersBuilders.CornerRadius);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static final class ModifiersBuilders.CornerRadius {
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getX();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getY();
-  }
-
-  public static final class ModifiersBuilders.CornerRadius.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public ModifiersBuilders.CornerRadius.Builder(androidx.wear.protolayout.DimensionBuilders.DpProp, androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method public androidx.wear.protolayout.ModifiersBuilders.CornerRadius build();
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public static final class ModifiersBuilders.DefaultContentTransitions {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.ModifiersBuilders.EnterTransition fadeIn();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.ModifiersBuilders.EnterTransition fadeInSlideIn(@SuppressCompatibility int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.ModifiersBuilders.ExitTransition fadeOut();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.ModifiersBuilders.ExitTransition fadeOutSlideOut(@SuppressCompatibility int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.ModifiersBuilders.EnterTransition slideIn(@SuppressCompatibility int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.ModifiersBuilders.ExitTransition slideOut(@SuppressCompatibility int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.ElementMetadata {
-    method public byte[] getTagData();
-  }
-
-  public static final class ModifiersBuilders.ElementMetadata.Builder {
-    ctor public ModifiersBuilders.ElementMetadata.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.ElementMetadata build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.ElementMetadata.Builder setTagData(byte[]);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.EnterTransition {
-    method public androidx.wear.protolayout.ModifiersBuilders.FadeInTransition? getFadeIn();
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideInTransition? getSlideIn();
-  }
-
-  public static final class ModifiersBuilders.EnterTransition.Builder {
-    ctor public ModifiersBuilders.EnterTransition.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.EnterTransition build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.EnterTransition.Builder setFadeIn(androidx.wear.protolayout.ModifiersBuilders.FadeInTransition);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.EnterTransition.Builder setSlideIn(androidx.wear.protolayout.ModifiersBuilders.SlideInTransition);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.ExitTransition {
-    method public androidx.wear.protolayout.ModifiersBuilders.FadeOutTransition? getFadeOut();
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideOutTransition? getSlideOut();
-  }
-
-  public static final class ModifiersBuilders.ExitTransition.Builder {
-    ctor public ModifiersBuilders.ExitTransition.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.ExitTransition build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.ExitTransition.Builder setFadeOut(androidx.wear.protolayout.ModifiersBuilders.FadeOutTransition);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.ExitTransition.Builder setSlideOut(androidx.wear.protolayout.ModifiersBuilders.SlideOutTransition);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.FadeInTransition {
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec? getAnimationSpec();
-    method @FloatRange(from=0.0, to=1.0) public float getInitialAlpha();
-  }
-
-  public static final class ModifiersBuilders.FadeInTransition.Builder {
-    ctor public ModifiersBuilders.FadeInTransition.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.FadeInTransition build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.FadeInTransition.Builder setAnimationSpec(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.FadeInTransition.Builder setInitialAlpha(@FloatRange(from=0.0, to=1.0) float);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.FadeOutTransition {
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec? getAnimationSpec();
-    method @FloatRange(from=0.0, to=1.0) public float getTargetAlpha();
-  }
-
-  public static final class ModifiersBuilders.FadeOutTransition.Builder {
-    ctor public ModifiersBuilders.FadeOutTransition.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.FadeOutTransition build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.FadeOutTransition.Builder setAnimationSpec(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method public androidx.wear.protolayout.ModifiersBuilders.FadeOutTransition.Builder setTargetAlpha(@FloatRange(from=0.0, to=1.0) float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.Modifiers {
-    method public androidx.wear.protolayout.ModifiersBuilders.Background? getBackground();
-    method public androidx.wear.protolayout.ModifiersBuilders.Border? getBorder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable? getClickable();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.ModifiersBuilders.AnimatedVisibility? getContentUpdateAnimation();
-    method public androidx.wear.protolayout.ModifiersBuilders.ElementMetadata? getMetadata();
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp? getOpacity();
-    method public androidx.wear.protolayout.ModifiersBuilders.Padding? getPadding();
-    method public androidx.wear.protolayout.ModifiersBuilders.Semantics? getSemantics();
-    method public androidx.wear.protolayout.ModifiersBuilders.Transformation? getTransformation();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.TypeBuilders.BoolProp isVisible();
-  }
-
-  public static final class ModifiersBuilders.Modifiers.Builder {
-    ctor public ModifiersBuilders.Modifiers.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setBackground(androidx.wear.protolayout.ModifiersBuilders.Background);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setBorder(androidx.wear.protolayout.ModifiersBuilders.Border);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setClickable(androidx.wear.protolayout.ModifiersBuilders.Clickable);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setContentUpdateAnimation(androidx.wear.protolayout.ModifiersBuilders.AnimatedVisibility);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setMetadata(androidx.wear.protolayout.ModifiersBuilders.ElementMetadata);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setOpacity(androidx.wear.protolayout.TypeBuilders.FloatProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setPadding(androidx.wear.protolayout.ModifiersBuilders.Padding);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setSemantics(androidx.wear.protolayout.ModifiersBuilders.Semantics);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setTransformation(androidx.wear.protolayout.ModifiersBuilders.Transformation);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setVisible(androidx.wear.protolayout.TypeBuilders.BoolProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.Padding {
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getBottom();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getEnd();
-    method public androidx.wear.protolayout.TypeBuilders.BoolProp? getRtlAware();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getStart();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getTop();
-  }
-
-  public static final class ModifiersBuilders.Padding.Builder {
-    ctor public ModifiersBuilders.Padding.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Padding build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Padding.Builder setAll(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Padding.Builder setBottom(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Padding.Builder setEnd(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Padding.Builder setRtlAware(androidx.wear.protolayout.TypeBuilders.BoolProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Padding.Builder setRtlAware(boolean);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Padding.Builder setStart(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Padding.Builder setTop(androidx.wear.protolayout.DimensionBuilders.DpProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.Semantics {
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getContentDescription();
-    method public int getRole();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getStateDescription();
-  }
-
-  public static final class ModifiersBuilders.Semantics.Builder {
-    ctor public ModifiersBuilders.Semantics.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Semantics build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Semantics.Builder setContentDescription(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Semantics.Builder setContentDescription(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.Semantics.Builder setRole(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.Semantics.Builder setStateDescription(androidx.wear.protolayout.TypeBuilders.StringProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static final class ModifiersBuilders.Shadow {
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getBlurRadius();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getColor();
-  }
-
-  public static final class ModifiersBuilders.Shadow.Builder {
-    ctor public ModifiersBuilders.Shadow.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Shadow build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.ModifiersBuilders.Shadow.Builder setBlurRadius(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.ModifiersBuilders.Shadow.Builder setColor(androidx.wear.protolayout.ColorBuilders.ColorProp);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface ModifiersBuilders.SlideBound {
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.SlideInTransition {
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec? getAnimationSpec();
-    method @SuppressCompatibility public int getDirection();
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideBound? getInitialSlideBound();
-  }
-
-  public static final class ModifiersBuilders.SlideInTransition.Builder {
-    ctor public ModifiersBuilders.SlideInTransition.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideInTransition build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.SlideInTransition.Builder setAnimationSpec(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.SlideInTransition.Builder setDirection(@SuppressCompatibility int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.SlideInTransition.Builder setInitialSlideBound(androidx.wear.protolayout.ModifiersBuilders.SlideBound);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.SlideOutTransition {
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec? getAnimationSpec();
-    method @SuppressCompatibility public int getDirection();
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideBound? getTargetSlideBound();
-  }
-
-  public static final class ModifiersBuilders.SlideOutTransition.Builder {
-    ctor public ModifiersBuilders.SlideOutTransition.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideOutTransition build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.SlideOutTransition.Builder setAnimationSpec(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.SlideOutTransition.Builder setDirection(@SuppressCompatibility int);
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideOutTransition.Builder setTargetSlideBound(androidx.wear.protolayout.ModifiersBuilders.SlideBound);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.SlideParentBound implements androidx.wear.protolayout.ModifiersBuilders.SlideBound {
-    method @SuppressCompatibility public int getSnapTo();
-  }
-
-  public static final class ModifiersBuilders.SlideParentBound.Builder {
-    ctor public ModifiersBuilders.SlideParentBound.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideParentBound build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.SlideParentBound.Builder setSnapTo(@SuppressCompatibility int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.SpanModifiers {
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable? getClickable();
-  }
-
-  public static final class ModifiersBuilders.SpanModifiers.Builder {
-    ctor public ModifiersBuilders.SpanModifiers.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.SpanModifiers build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.SpanModifiers.Builder setClickable(androidx.wear.protolayout.ModifiersBuilders.Clickable);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static final class ModifiersBuilders.Transformation {
-    method public androidx.wear.protolayout.DimensionBuilders.PivotDimension getPivotX();
-    method public androidx.wear.protolayout.DimensionBuilders.PivotDimension getPivotY();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getRotation();
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp getScaleX();
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp getScaleY();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getTranslationX();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getTranslationY();
-  }
-
-  public static final class ModifiersBuilders.Transformation.Builder {
-    ctor public ModifiersBuilders.Transformation.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Transformation build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Transformation.Builder setPivotX(androidx.wear.protolayout.DimensionBuilders.PivotDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Transformation.Builder setPivotY(androidx.wear.protolayout.DimensionBuilders.PivotDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Transformation.Builder setRotation(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Transformation.Builder setScaleX(androidx.wear.protolayout.TypeBuilders.FloatProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Transformation.Builder setScaleY(androidx.wear.protolayout.TypeBuilders.FloatProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Transformation.Builder setTranslationX(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Transformation.Builder setTranslationY(androidx.wear.protolayout.DimensionBuilders.DpProp);
-  }
-
-  public final class ResourceBuilders {
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int ANIMATED_IMAGE_FORMAT_AVD = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int ANIMATED_IMAGE_FORMAT_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int IMAGE_FORMAT_ARGB_8888 = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int IMAGE_FORMAT_RGB_565 = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int IMAGE_FORMAT_UNDEFINED = 0; // 0x0
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ResourceBuilders.AndroidAnimatedImageResourceByResId {
-    method public int getAnimatedImageFormat();
-    method @DrawableRes public int getResourceId();
-    method public androidx.wear.protolayout.TriggerBuilders.Trigger? getStartTrigger();
-  }
-
-  public static final class ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder {
-    ctor public ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder();
-    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder setAnimatedImageFormat(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder setResourceId(@DrawableRes int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder setStartTrigger(androidx.wear.protolayout.TriggerBuilders.Trigger);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ResourceBuilders.AndroidImageResourceByResId {
-    method @DrawableRes public int getResourceId();
-  }
-
-  public static final class ResourceBuilders.AndroidImageResourceByResId.Builder {
-    ctor public ResourceBuilders.AndroidImageResourceByResId.Builder();
-    method public androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId.Builder setResourceId(@DrawableRes int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static final class ResourceBuilders.AndroidLottieResourceByResId {
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? getProgress();
-    method @RawRes public int getRawResourceId();
-    method public androidx.wear.protolayout.TriggerBuilders.Trigger? getStartTrigger();
-  }
-
-  public static final class ResourceBuilders.AndroidLottieResourceByResId.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public ResourceBuilders.AndroidLottieResourceByResId.Builder(@RawRes int);
-    method public androidx.wear.protolayout.ResourceBuilders.AndroidLottieResourceByResId build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ResourceBuilders.AndroidLottieResourceByResId.Builder setProgress(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ResourceBuilders.AndroidLottieResourceByResId.Builder setStartTrigger(androidx.wear.protolayout.TriggerBuilders.Trigger);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId {
-    method public int getAnimatedImageFormat();
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? getProgress();
-    method @DrawableRes public int getResourceId();
-  }
-
-  public static final class ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder {
-    ctor public ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder();
-    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder setAnimatedImageFormat(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder setProgress(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder setResourceId(@DrawableRes int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ResourceBuilders.ImageResource {
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId? getAndroidAnimatedResourceByResId();
-    method public androidx.wear.protolayout.ResourceBuilders.AndroidLottieResourceByResId? getAndroidLottieResourceByResId();
-    method public androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId? getAndroidResourceByResId();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId? getAndroidSeekableAnimatedResourceByResId();
-    method public androidx.wear.protolayout.ResourceBuilders.InlineImageResource? getInlineResource();
-  }
-
-  public static final class ResourceBuilders.ImageResource.Builder {
-    ctor public ResourceBuilders.ImageResource.Builder();
-    method public androidx.wear.protolayout.ResourceBuilders.ImageResource build();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidAnimatedResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidLottieResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidLottieResourceByResId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidSeekableAnimatedResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setInlineResource(androidx.wear.protolayout.ResourceBuilders.InlineImageResource);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ResourceBuilders.InlineImageResource {
-    method public byte[] getData();
-    method public int getFormat();
-    method @Dimension(unit=androidx.annotation.Dimension.PX) public int getHeightPx();
-    method @Dimension(unit=androidx.annotation.Dimension.PX) public int getWidthPx();
-  }
-
-  public static final class ResourceBuilders.InlineImageResource.Builder {
-    ctor public ResourceBuilders.InlineImageResource.Builder();
-    method public androidx.wear.protolayout.ResourceBuilders.InlineImageResource build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.InlineImageResource.Builder setData(byte[]);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.InlineImageResource.Builder setFormat(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.InlineImageResource.Builder setHeightPx(@Dimension(unit=androidx.annotation.Dimension.PX) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.InlineImageResource.Builder setWidthPx(@Dimension(unit=androidx.annotation.Dimension.PX) int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ResourceBuilders.Resources {
-    method public java.util.Map<java.lang.String!,androidx.wear.protolayout.ResourceBuilders.ImageResource!> getIdToImageMapping();
-    method public String getVersion();
-  }
-
-  public static final class ResourceBuilders.Resources.Builder {
-    ctor public ResourceBuilders.Resources.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.Resources.Builder addIdToImageMapping(String, androidx.wear.protolayout.ResourceBuilders.ImageResource);
-    method public androidx.wear.protolayout.ResourceBuilders.Resources build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.Resources.Builder setVersion(String);
-  }
-
-  public final class StateBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class StateBuilders.State {
-    method public java.util.Map<androidx.wear.protolayout.expression.AppDataKey<? extends java.lang.Object!>!,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends java.lang.Object!>!> getKeyToValueMapping();
-    method public String getLastClickableId();
-    method public static int getMaxStateEntryCount();
-    method public androidx.wear.protolayout.expression.DynamicDataMap getStateMap();
-  }
-
-  public static final class StateBuilders.State.Builder {
-    ctor public StateBuilders.State.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public <T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> androidx.wear.protolayout.StateBuilders.State.Builder addKeyToValueMapping(androidx.wear.protolayout.expression.AppDataKey<T!>, androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T!>);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.StateBuilders.State.Builder addToStateMap(androidx.wear.protolayout.expression.DynamicDataPair<? extends java.lang.Object!>...);
-    method public androidx.wear.protolayout.StateBuilders.State build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.StateBuilders.State.Builder setStateMap(androidx.wear.protolayout.expression.DynamicDataMap);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.StateBuilders.State.Builder setStateMap(androidx.wear.protolayout.expression.DynamicDataPair<? extends java.lang.Object!>...);
-  }
-
-  public final class TimelineBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TimelineBuilders.TimeInterval {
-    method public long getEndMillis();
-    method public long getStartMillis();
-  }
-
-  public static final class TimelineBuilders.TimeInterval.Builder {
-    ctor public TimelineBuilders.TimeInterval.Builder();
-    method public androidx.wear.protolayout.TimelineBuilders.TimeInterval build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TimelineBuilders.TimeInterval.Builder setEndMillis(long);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TimelineBuilders.TimeInterval.Builder setStartMillis(long);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TimelineBuilders.Timeline {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.TimelineBuilders.Timeline fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public java.util.List<androidx.wear.protolayout.TimelineBuilders.TimelineEntry!> getTimelineEntries();
-  }
-
-  public static final class TimelineBuilders.Timeline.Builder {
-    ctor public TimelineBuilders.Timeline.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TimelineBuilders.Timeline.Builder addTimelineEntry(androidx.wear.protolayout.TimelineBuilders.TimelineEntry);
-    method public androidx.wear.protolayout.TimelineBuilders.Timeline build();
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TimelineBuilders.TimelineEntry {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.TimelineBuilders.TimelineEntry fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Layout? getLayout();
-    method public androidx.wear.protolayout.TimelineBuilders.TimeInterval? getValidity();
-  }
-
-  public static final class TimelineBuilders.TimelineEntry.Builder {
-    ctor public TimelineBuilders.TimelineEntry.Builder();
-    method public androidx.wear.protolayout.TimelineBuilders.TimelineEntry build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TimelineBuilders.TimelineEntry.Builder setLayout(androidx.wear.protolayout.LayoutElementBuilders.Layout);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TimelineBuilders.TimelineEntry.Builder setValidity(androidx.wear.protolayout.TimelineBuilders.TimeInterval);
-  }
-
-  public final class TriggerBuilders {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.TriggerBuilders.Trigger createOnConditionMetTrigger(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.TriggerBuilders.Trigger createOnLoadTrigger();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.TriggerBuilders.Trigger createOnVisibleOnceTrigger();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.TriggerBuilders.Trigger createOnVisibleTrigger();
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class TriggerBuilders.OnVisibleOnceTrigger implements androidx.wear.protolayout.TriggerBuilders.Trigger {
-  }
-
-  public static final class TriggerBuilders.OnVisibleOnceTrigger.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public TriggerBuilders.OnVisibleOnceTrigger.Builder();
-    method public androidx.wear.protolayout.TriggerBuilders.OnVisibleOnceTrigger build();
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class TriggerBuilders.OnVisibleTrigger implements androidx.wear.protolayout.TriggerBuilders.Trigger {
-  }
-
-  public static final class TriggerBuilders.OnVisibleTrigger.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public TriggerBuilders.OnVisibleTrigger.Builder();
-    method public androidx.wear.protolayout.TriggerBuilders.OnVisibleTrigger build();
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface TriggerBuilders.Trigger {
-  }
-
-  public final class TypeBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TypeBuilders.BoolProp {
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool? getDynamicValue();
-    method public boolean getValue();
-  }
-
-  public static final class TypeBuilders.BoolProp.Builder {
-    ctor @Deprecated public TypeBuilders.BoolProp.Builder();
-    ctor public TypeBuilders.BoolProp.Builder(boolean);
-    method public androidx.wear.protolayout.TypeBuilders.BoolProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.TypeBuilders.BoolProp.Builder setDynamicValue(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TypeBuilders.BoolProp.Builder setValue(boolean);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TypeBuilders.FloatProp {
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? getDynamicValue();
-    method public float getValue();
-  }
-
-  public static final class TypeBuilders.FloatProp.Builder {
-    ctor @Deprecated public TypeBuilders.FloatProp.Builder();
-    ctor public TypeBuilders.FloatProp.Builder(float);
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.TypeBuilders.FloatProp.Builder setDynamicValue(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TypeBuilders.FloatProp.Builder setValue(float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TypeBuilders.Int32Prop {
-    method public int getValue();
-  }
-
-  public static final class TypeBuilders.Int32Prop.Builder {
-    ctor public TypeBuilders.Int32Prop.Builder();
-    method public androidx.wear.protolayout.TypeBuilders.Int32Prop build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TypeBuilders.Int32Prop.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class TypeBuilders.StringLayoutConstraint {
-    method public int getAlignment();
-    method public String getPatternForLayout();
-  }
-
-  public static final class TypeBuilders.StringLayoutConstraint.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public TypeBuilders.StringLayoutConstraint.Builder(String);
-    method public androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint.Builder setAlignment(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TypeBuilders.StringProp {
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicString? getDynamicValue();
-    method public String getValue();
-  }
-
-  public static final class TypeBuilders.StringProp.Builder {
-    ctor @Deprecated public TypeBuilders.StringProp.Builder();
-    ctor public TypeBuilders.StringProp.Builder(String);
-    method public androidx.wear.protolayout.TypeBuilders.StringProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.TypeBuilders.StringProp.Builder setDynamicValue(androidx.wear.protolayout.expression.DynamicBuilders.DynamicString);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TypeBuilders.StringProp.Builder setValue(String);
-  }
-
-}
-
-package androidx.wear.protolayout.layout {
-
-  public final class TextKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.Text basicText(androidx.wear.protolayout.types.LayoutString text, optional androidx.wear.protolayout.LayoutElementBuilders.FontStyle? fontStyle, optional androidx.wear.protolayout.modifiers.LayoutModifier? modifier, optional int maxLines, optional int alignment, optional int overflow, optional @Dimension(unit=androidx.annotation.Dimension.Companion.SP) float lineHeight);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle fontStyle(optional @Dimension(unit=androidx.annotation.Dimension.Companion.SP) float size, optional boolean italic, optional boolean underline, optional androidx.wear.protolayout.types.LayoutColor? color, optional int weight, optional float letterSpacingEm, optional @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) java.util.List<java.lang.Float> additionalSizesSp, optional @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) java.util.List<? extends androidx.wear.protolayout.LayoutElementBuilders.FontSetting> settings, optional @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) java.util.List<java.lang.String> preferredFontFamilies);
-  }
-
-}
-
-package androidx.wear.protolayout.modifiers {
-
-  public final class BackgroundKt {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static androidx.wear.protolayout.modifiers.LayoutModifier background(androidx.wear.protolayout.modifiers.LayoutModifier, androidx.wear.protolayout.ColorBuilders.Brush brush);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier background(androidx.wear.protolayout.modifiers.LayoutModifier, androidx.wear.protolayout.types.LayoutColor color);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier clip(androidx.wear.protolayout.modifiers.LayoutModifier, androidx.wear.protolayout.ModifiersBuilders.Corner corner);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier clip(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float cornerRadius);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.modifiers.LayoutModifier clip(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float x, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float y);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.modifiers.LayoutModifier clipBottomLeft(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float x, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float y);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.modifiers.LayoutModifier clipBottomRight(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float x, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float y);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.modifiers.LayoutModifier clipTopLeft(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float x, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float y);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.modifiers.LayoutModifier clipTopRight(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float x, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float y);
-  }
-
-  public final class BorderKt {
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier border(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float width, androidx.wear.protolayout.types.LayoutColor color);
-  }
-
-  public final class ClickableKt {
-    method public static androidx.wear.protolayout.ModifiersBuilders.Clickable clickable();
-    method public static androidx.wear.protolayout.ModifiersBuilders.Clickable clickable(optional androidx.wear.protolayout.ActionBuilders.Action action);
-    method public static androidx.wear.protolayout.ModifiersBuilders.Clickable clickable(optional androidx.wear.protolayout.ActionBuilders.Action action, optional String? id);
-    method public static androidx.wear.protolayout.ModifiersBuilders.Clickable clickable(optional androidx.wear.protolayout.ActionBuilders.Action action, optional String? id, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) float minClickableWidth);
-    method public static androidx.wear.protolayout.ModifiersBuilders.Clickable clickable(optional androidx.wear.protolayout.ActionBuilders.Action action, optional String? id, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) float minClickableWidth, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) float minClickableHeight);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier clickable(androidx.wear.protolayout.modifiers.LayoutModifier, optional androidx.wear.protolayout.ActionBuilders.Action action, optional String? id);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier clickable(androidx.wear.protolayout.modifiers.LayoutModifier, androidx.wear.protolayout.ModifiersBuilders.Clickable clickable);
-    method public static androidx.wear.protolayout.ActionBuilders.LoadAction loadAction(optional @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) androidx.wear.protolayout.expression.DynamicDataMap? requestedStateMap);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static androidx.wear.protolayout.modifiers.LayoutModifier minimumTouchTargetSize(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float minWidth, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float minHeight);
-  }
-
-  public interface LayoutModifier {
-    method public <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
-    method public default infix androidx.wear.protolayout.modifiers.LayoutModifier then(androidx.wear.protolayout.modifiers.LayoutModifier other);
-    field public static final androidx.wear.protolayout.modifiers.LayoutModifier.Companion Companion;
-  }
-
-  public static final class LayoutModifier.Companion implements androidx.wear.protolayout.modifiers.LayoutModifier {
-    method public <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
-  }
-
-  public static interface LayoutModifier.Element extends androidx.wear.protolayout.modifiers.LayoutModifier {
-    method public default <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
-  }
-
-  public final class ModifierAppliersKt {
-    method public static androidx.wear.protolayout.ModifiersBuilders.Modifiers toProtoLayoutModifiers(androidx.wear.protolayout.modifiers.LayoutModifier);
-  }
-
-  public final class OpacityKt {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.modifiers.LayoutModifier opacity(androidx.wear.protolayout.modifiers.LayoutModifier, @FloatRange(from=0.0, to=1.0) float staticValue, optional androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? dynamicValue);
-  }
-
-  public final class PaddingKt {
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier padding(androidx.wear.protolayout.modifiers.LayoutModifier, androidx.wear.protolayout.ModifiersBuilders.Padding padding);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier padding(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float all);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier padding(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float horizontal, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float vertical);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier padding(androidx.wear.protolayout.modifiers.LayoutModifier, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float start, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float top, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float end, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float bottom, optional boolean rtlAware);
-    method public static androidx.wear.protolayout.ModifiersBuilders.Padding padding(@Dimension(unit=androidx.annotation.Dimension.Companion.DP) float all);
-    method public static androidx.wear.protolayout.ModifiersBuilders.Padding padding(@Dimension(unit=androidx.annotation.Dimension.Companion.DP) float horizontal, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float vertical);
-    method public static androidx.wear.protolayout.ModifiersBuilders.Padding padding(optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float start, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float top, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float end, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float bottom, optional boolean rtlAware);
-  }
-
-  public final class SemanticsKt {
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier clearSemantics(androidx.wear.protolayout.modifiers.LayoutModifier);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier contentDescription(androidx.wear.protolayout.modifiers.LayoutModifier, String staticValue, optional @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) androidx.wear.protolayout.expression.DynamicBuilders.DynamicString? dynamicValue);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier semanticsRole(androidx.wear.protolayout.modifiers.LayoutModifier, int semanticsRole);
-  }
-
-  public final class TransitionKt {
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.modifiers.LayoutModifier enterTransition(androidx.wear.protolayout.modifiers.LayoutModifier, androidx.wear.protolayout.ModifiersBuilders.EnterTransition transition);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.modifiers.LayoutModifier enterTransition(androidx.wear.protolayout.modifiers.LayoutModifier, optional androidx.wear.protolayout.ModifiersBuilders.FadeInTransition? fadeIn, optional androidx.wear.protolayout.ModifiersBuilders.SlideInTransition? slideIn);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.modifiers.LayoutModifier exitTransition(androidx.wear.protolayout.modifiers.LayoutModifier, androidx.wear.protolayout.ModifiersBuilders.ExitTransition transition);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.modifiers.LayoutModifier exitTransition(androidx.wear.protolayout.modifiers.LayoutModifier, optional androidx.wear.protolayout.ModifiersBuilders.FadeOutTransition? fadeOut, optional androidx.wear.protolayout.ModifiersBuilders.SlideOutTransition? slideOut);
-  }
-
-  public final class VisibilityKt {
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static androidx.wear.protolayout.modifiers.LayoutModifier visibility(androidx.wear.protolayout.modifiers.LayoutModifier, boolean staticVisibility, optional androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool? dynamicVisibility);
-  }
-
-}
-
-package androidx.wear.protolayout.types {
-
-  public final class LayoutColor {
-    ctor public LayoutColor(@ColorInt int staticArgb, optional @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor? dynamicArgb);
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor? getDynamicArgb();
-    method public int getStaticArgb();
-    property @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor? dynamicArgb;
-    property @ColorInt public int staticArgb;
-  }
-
-  public final class LayoutColorUtil {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.types.LayoutColor createLayoutColor(androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor, @ColorInt int staticArgb);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.types.LayoutColor createLayoutColor(androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor, @ColorInt long staticArgb);
-    method public static androidx.wear.protolayout.types.LayoutColor createLayoutColor(int);
-    method public static androidx.wear.protolayout.types.LayoutColor createLayoutColor(long);
-    property public static androidx.wear.protolayout.types.LayoutColor int.argb;
-    property public static androidx.wear.protolayout.types.LayoutColor long.argb;
-  }
-
-  public final class LayoutString {
-    ctor public LayoutString(String staticValue);
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public LayoutString(String staticValue, androidx.wear.protolayout.expression.DynamicBuilders.DynamicString dynamicValue, androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint layoutConstraint);
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicString? getDynamicValue();
-    method public androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint? getLayoutConstraint();
-    method public String getStaticValue();
-    property public androidx.wear.protolayout.expression.DynamicBuilders.DynamicString? dynamicValue;
-    property public androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint? layoutConstraint;
-    property public String staticValue;
-  }
-
-  public final class LayoutStringUtil {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint asLayoutConstraint(String, optional int alignment);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.types.LayoutString createLayoutString(androidx.wear.protolayout.expression.DynamicBuilders.DynamicString, String staticValue, androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint layoutConstraint);
-    method public static androidx.wear.protolayout.types.LayoutString createLayoutString(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint stringLayoutConstraint(String longestPattern);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint stringLayoutConstraint(String longestPattern, optional int alignment);
-    property public static androidx.wear.protolayout.types.LayoutString String.layoutString;
-  }
-
-}
-
diff --git a/wear/protolayout/protolayout/api/res-1.3.0-beta01.txt b/wear/protolayout/protolayout/api/res-1.3.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/wear/protolayout/protolayout/api/res-1.3.0-beta01.txt
+++ /dev/null
diff --git a/wear/protolayout/protolayout/api/restricted_1.3.0-beta01.txt b/wear/protolayout/protolayout/api/restricted_1.3.0-beta01.txt
deleted file mode 100644
index c7d1618..0000000
--- a/wear/protolayout/protolayout/api/restricted_1.3.0-beta01.txt
+++ /dev/null
@@ -1,1662 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.protolayout {
-
-  public final class ActionBuilders {
-    method public static androidx.wear.protolayout.ActionBuilders.AndroidBooleanExtra booleanExtra(boolean);
-    method public static androidx.wear.protolayout.ActionBuilders.AndroidDoubleExtra doubleExtra(double);
-    method public static androidx.wear.protolayout.ActionBuilders.AndroidIntExtra intExtra(int);
-    method public static androidx.wear.protolayout.ActionBuilders.LaunchAction launchAction(android.content.ComponentName);
-    method public static androidx.wear.protolayout.ActionBuilders.LaunchAction launchAction(android.content.ComponentName, java.util.Map<java.lang.String!,androidx.wear.protolayout.ActionBuilders.AndroidExtra!>);
-    method public static androidx.wear.protolayout.ActionBuilders.AndroidLongExtra longExtra(long);
-    method public static androidx.wear.protolayout.ActionBuilders.AndroidStringExtra stringExtra(String);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface ActionBuilders.Action {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.AndroidActivity {
-    method public String getClassName();
-    method public java.util.Map<java.lang.String!,androidx.wear.protolayout.ActionBuilders.AndroidExtra!> getKeyToExtraMapping();
-    method public String getPackageName();
-  }
-
-  public static final class ActionBuilders.AndroidActivity.Builder {
-    ctor public ActionBuilders.AndroidActivity.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidActivity.Builder addKeyToExtraMapping(String, androidx.wear.protolayout.ActionBuilders.AndroidExtra);
-    method public androidx.wear.protolayout.ActionBuilders.AndroidActivity build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidActivity.Builder setClassName(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidActivity.Builder setPackageName(String);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.AndroidBooleanExtra implements androidx.wear.protolayout.ActionBuilders.AndroidExtra {
-    method public boolean getValue();
-  }
-
-  public static final class ActionBuilders.AndroidBooleanExtra.Builder {
-    ctor public ActionBuilders.AndroidBooleanExtra.Builder();
-    method public androidx.wear.protolayout.ActionBuilders.AndroidBooleanExtra build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidBooleanExtra.Builder setValue(boolean);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.AndroidDoubleExtra implements androidx.wear.protolayout.ActionBuilders.AndroidExtra {
-    method public double getValue();
-  }
-
-  public static final class ActionBuilders.AndroidDoubleExtra.Builder {
-    ctor public ActionBuilders.AndroidDoubleExtra.Builder();
-    method public androidx.wear.protolayout.ActionBuilders.AndroidDoubleExtra build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidDoubleExtra.Builder setValue(double);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface ActionBuilders.AndroidExtra {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.AndroidIntExtra implements androidx.wear.protolayout.ActionBuilders.AndroidExtra {
-    method public int getValue();
-  }
-
-  public static final class ActionBuilders.AndroidIntExtra.Builder {
-    ctor public ActionBuilders.AndroidIntExtra.Builder();
-    method public androidx.wear.protolayout.ActionBuilders.AndroidIntExtra build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidIntExtra.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.AndroidLongExtra implements androidx.wear.protolayout.ActionBuilders.AndroidExtra {
-    method public long getValue();
-  }
-
-  public static final class ActionBuilders.AndroidLongExtra.Builder {
-    ctor public ActionBuilders.AndroidLongExtra.Builder();
-    method public androidx.wear.protolayout.ActionBuilders.AndroidLongExtra build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidLongExtra.Builder setValue(long);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.AndroidStringExtra implements androidx.wear.protolayout.ActionBuilders.AndroidExtra {
-    method public String getValue();
-  }
-
-  public static final class ActionBuilders.AndroidStringExtra.Builder {
-    ctor public ActionBuilders.AndroidStringExtra.Builder();
-    method public androidx.wear.protolayout.ActionBuilders.AndroidStringExtra build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.AndroidStringExtra.Builder setValue(String);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.LaunchAction implements androidx.wear.protolayout.ActionBuilders.Action {
-    method public androidx.wear.protolayout.ActionBuilders.AndroidActivity? getAndroidActivity();
-  }
-
-  public static final class ActionBuilders.LaunchAction.Builder {
-    ctor public ActionBuilders.LaunchAction.Builder();
-    method public androidx.wear.protolayout.ActionBuilders.LaunchAction build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.LaunchAction.Builder setAndroidActivity(androidx.wear.protolayout.ActionBuilders.AndroidActivity);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ActionBuilders.LoadAction implements androidx.wear.protolayout.ActionBuilders.Action {
-    method public androidx.wear.protolayout.StateBuilders.State? getRequestState();
-  }
-
-  public static final class ActionBuilders.LoadAction.Builder {
-    ctor public ActionBuilders.LoadAction.Builder();
-    method public androidx.wear.protolayout.ActionBuilders.LoadAction build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ActionBuilders.LoadAction.Builder setRequestState(androidx.wear.protolayout.StateBuilders.State);
-  }
-
-  public final class ColorBuilders {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.ColorBuilders.ColorProp argb(@ColorInt int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static interface ColorBuilders.Brush {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ColorBuilders.ColorProp {
-    method @ColorInt public int getArgb();
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor? getDynamicValue();
-  }
-
-  public static final class ColorBuilders.ColorProp.Builder {
-    ctor @Deprecated public ColorBuilders.ColorProp.Builder();
-    ctor public ColorBuilders.ColorProp.Builder(@ColorInt int);
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ColorBuilders.ColorProp.Builder setArgb(@ColorInt int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ColorBuilders.ColorProp.Builder setDynamicValue(androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static final class ColorBuilders.ColorStop {
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getColor();
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp? getOffset();
-  }
-
-  public static final class ColorBuilders.ColorStop.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public ColorBuilders.ColorStop.Builder(androidx.wear.protolayout.ColorBuilders.ColorProp, androidx.wear.protolayout.TypeBuilders.FloatProp);
-    method public androidx.wear.protolayout.ColorBuilders.ColorStop build();
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static final class ColorBuilders.LinearGradient implements androidx.wear.protolayout.ColorBuilders.Brush {
-    method public java.util.List<androidx.wear.protolayout.ColorBuilders.ColorStop!> getColorStops();
-    method public androidx.wear.protolayout.DimensionBuilders.OffsetDimension? getEndX();
-    method public androidx.wear.protolayout.DimensionBuilders.OffsetDimension? getEndY();
-    method public androidx.wear.protolayout.DimensionBuilders.OffsetDimension? getStartX();
-    method public androidx.wear.protolayout.DimensionBuilders.OffsetDimension? getStartY();
-  }
-
-  public static final class ColorBuilders.LinearGradient.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) @java.lang.SafeVarargs public ColorBuilders.LinearGradient.Builder(androidx.wear.protolayout.ColorBuilders.ColorProp!...);
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) @java.lang.SafeVarargs public ColorBuilders.LinearGradient.Builder(androidx.wear.protolayout.ColorBuilders.ColorStop!...);
-    method public androidx.wear.protolayout.ColorBuilders.LinearGradient build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ColorBuilders.LinearGradient.Builder setEndX(androidx.wear.protolayout.DimensionBuilders.OffsetDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ColorBuilders.LinearGradient.Builder setEndY(androidx.wear.protolayout.DimensionBuilders.OffsetDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ColorBuilders.LinearGradient.Builder setStartX(androidx.wear.protolayout.DimensionBuilders.OffsetDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ColorBuilders.LinearGradient.Builder setStartY(androidx.wear.protolayout.DimensionBuilders.OffsetDimension);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static final class ColorBuilders.SweepGradient implements androidx.wear.protolayout.ColorBuilders.Brush {
-    method public java.util.List<androidx.wear.protolayout.ColorBuilders.ColorStop!> getColorStops();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getEndAngle();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getStartAngle();
-  }
-
-  public static final class ColorBuilders.SweepGradient.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) @java.lang.SafeVarargs public ColorBuilders.SweepGradient.Builder(androidx.wear.protolayout.ColorBuilders.ColorProp!...);
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) @java.lang.SafeVarargs public ColorBuilders.SweepGradient.Builder(androidx.wear.protolayout.ColorBuilders.ColorStop!...);
-    method public androidx.wear.protolayout.ColorBuilders.SweepGradient build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.ColorBuilders.SweepGradient.Builder setEndAngle(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.ColorBuilders.SweepGradient.Builder setStartAngle(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
-  }
-
-  public final class DeviceParametersBuilders {
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int DEVICE_PLATFORM_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int DEVICE_PLATFORM_WEAR_OS = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int SCREEN_SHAPE_RECT = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int SCREEN_SHAPE_ROUND = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int SCREEN_SHAPE_UNDEFINED = 0; // 0x0
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class DeviceParametersBuilders.Capabilities {
-    method public long getMinimumFreshnessLimitMillis();
-  }
-
-  public static final class DeviceParametersBuilders.Capabilities.Builder {
-    ctor public DeviceParametersBuilders.Capabilities.Builder();
-    method public androidx.wear.protolayout.DeviceParametersBuilders.Capabilities build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DeviceParametersBuilders.Capabilities.Builder setMinimumFreshnessLimitMillis(long);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DeviceParametersBuilders.DeviceParameters {
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.DeviceParametersBuilders.Capabilities? getCapabilities();
-    method public int getDevicePlatform();
-    method @FloatRange(from=0.0, fromInclusive=false, toInclusive=false) public float getFontScale();
-    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo getRendererSchemaVersion();
-    method @FloatRange(from=0.0, fromInclusive=false, toInclusive=false) public float getScreenDensity();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getScreenHeightDp();
-    method public int getScreenShape();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getScreenWidthDp();
-  }
-
-  public static final class DeviceParametersBuilders.DeviceParameters.Builder {
-    ctor public DeviceParametersBuilders.DeviceParameters.Builder();
-    method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters build();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setCapabilities(androidx.wear.protolayout.DeviceParametersBuilders.Capabilities);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setDevicePlatform(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setFontScale(@FloatRange(from=0.0, fromInclusive=false, toInclusive=false) float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setRendererSchemaVersion(androidx.wear.protolayout.expression.VersionBuilders.VersionInfo);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenDensity(@FloatRange(from=0.0, fromInclusive=false, toInclusive=false) float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenHeightDp(@Dimension(unit=androidx.annotation.Dimension.DP) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenShape(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenWidthDp(@Dimension(unit=androidx.annotation.Dimension.DP) int);
-  }
-
-  public final class DimensionBuilders {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.DimensionBuilders.DegreesProp degrees(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.DimensionBuilders.DpProp dp(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.DimensionBuilders.EmProp em(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.DimensionBuilders.EmProp em(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.DimensionBuilders.ExpandedDimensionProp expand();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.DimensionBuilders.SpProp sp(@Dimension(unit=androidx.annotation.Dimension.SP) float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static androidx.wear.protolayout.DimensionBuilders.ExpandedDimensionProp weight(@FloatRange(from=0.0) float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.DimensionBuilders.WrappedDimensionProp wrap();
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static interface DimensionBuilders.AngularDimension {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class DimensionBuilders.AngularLayoutConstraint {
-    method public int getAngularAlignment();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getValue();
-  }
-
-  public static final class DimensionBuilders.AngularLayoutConstraint.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public DimensionBuilders.AngularLayoutConstraint.Builder(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method public androidx.wear.protolayout.DimensionBuilders.AngularLayoutConstraint build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DimensionBuilders.AngularLayoutConstraint.Builder setAngularAlignment(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static final class DimensionBuilders.BoundingBoxRatio implements androidx.wear.protolayout.DimensionBuilders.OffsetDimension androidx.wear.protolayout.DimensionBuilders.PivotDimension {
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp getRatio();
-  }
-
-  public static final class DimensionBuilders.BoundingBoxRatio.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public DimensionBuilders.BoundingBoxRatio.Builder(androidx.wear.protolayout.TypeBuilders.FloatProp);
-    method public androidx.wear.protolayout.DimensionBuilders.BoundingBoxRatio build();
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface DimensionBuilders.ContainerDimension {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DimensionBuilders.DegreesProp implements androidx.wear.protolayout.DimensionBuilders.AngularDimension {
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? getDynamicValue();
-    method public float getValue();
-  }
-
-  public static final class DimensionBuilders.DegreesProp.Builder {
-    ctor @Deprecated public DimensionBuilders.DegreesProp.Builder();
-    ctor public DimensionBuilders.DegreesProp.Builder(float);
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DimensionBuilders.DegreesProp.Builder setDynamicValue(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DimensionBuilders.DegreesProp.Builder setValue(float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DimensionBuilders.DpProp implements androidx.wear.protolayout.DimensionBuilders.AngularDimension androidx.wear.protolayout.DimensionBuilders.ContainerDimension androidx.wear.protolayout.DimensionBuilders.ExtensionDimension androidx.wear.protolayout.DimensionBuilders.ImageDimension androidx.wear.protolayout.DimensionBuilders.OffsetDimension androidx.wear.protolayout.DimensionBuilders.PivotDimension androidx.wear.protolayout.DimensionBuilders.SpacerDimension {
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? getDynamicValue();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getValue();
-  }
-
-  public static final class DimensionBuilders.DpProp.Builder {
-    ctor @Deprecated public DimensionBuilders.DpProp.Builder();
-    ctor public DimensionBuilders.DpProp.Builder(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DimensionBuilders.DpProp.Builder setDynamicValue(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DimensionBuilders.DpProp.Builder setValue(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DimensionBuilders.EmProp {
-    method public float getValue();
-  }
-
-  public static final class DimensionBuilders.EmProp.Builder {
-    ctor public DimensionBuilders.EmProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.EmProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DimensionBuilders.EmProp.Builder setValue(float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DimensionBuilders.ExpandedDimensionProp implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension androidx.wear.protolayout.DimensionBuilders.ImageDimension androidx.wear.protolayout.DimensionBuilders.SpacerDimension {
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp? getLayoutWeight();
-  }
-
-  public static final class DimensionBuilders.ExpandedDimensionProp.Builder {
-    ctor public DimensionBuilders.ExpandedDimensionProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.ExpandedDimensionProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DimensionBuilders.ExpandedDimensionProp.Builder setLayoutWeight(androidx.wear.protolayout.TypeBuilders.FloatProp);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ExperimentalProtoLayoutExtensionApi @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface DimensionBuilders.ExtensionDimension {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class DimensionBuilders.HorizontalLayoutConstraint {
-    method public int getHorizontalAlignment();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getValue();
-  }
-
-  public static final class DimensionBuilders.HorizontalLayoutConstraint.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public DimensionBuilders.HorizontalLayoutConstraint.Builder(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method public androidx.wear.protolayout.DimensionBuilders.HorizontalLayoutConstraint build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DimensionBuilders.HorizontalLayoutConstraint.Builder setHorizontalAlignment(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface DimensionBuilders.ImageDimension {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static interface DimensionBuilders.OffsetDimension {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static interface DimensionBuilders.PivotDimension {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DimensionBuilders.ProportionalDimensionProp implements androidx.wear.protolayout.DimensionBuilders.ImageDimension {
-    method @IntRange(from=0) public int getAspectRatioHeight();
-    method @IntRange(from=0) public int getAspectRatioWidth();
-  }
-
-  public static final class DimensionBuilders.ProportionalDimensionProp.Builder {
-    ctor public DimensionBuilders.ProportionalDimensionProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.ProportionalDimensionProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DimensionBuilders.ProportionalDimensionProp.Builder setAspectRatioHeight(@IntRange(from=0) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DimensionBuilders.ProportionalDimensionProp.Builder setAspectRatioWidth(@IntRange(from=0) int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DimensionBuilders.SpProp {
-    method @Dimension(unit=androidx.annotation.Dimension.SP) public float getValue();
-  }
-
-  public static final class DimensionBuilders.SpProp.Builder {
-    ctor public DimensionBuilders.SpProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.SpProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.DimensionBuilders.SpProp.Builder setValue(@Dimension(unit=androidx.annotation.Dimension.SP) float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface DimensionBuilders.SpacerDimension {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class DimensionBuilders.VerticalLayoutConstraint {
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getValue();
-    method public int getVerticalAlignment();
-  }
-
-  public static final class DimensionBuilders.VerticalLayoutConstraint.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public DimensionBuilders.VerticalLayoutConstraint.Builder(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method public androidx.wear.protolayout.DimensionBuilders.VerticalLayoutConstraint build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DimensionBuilders.VerticalLayoutConstraint.Builder setVerticalAlignment(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class DimensionBuilders.WrappedDimensionProp implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension {
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getMinimumSize();
-  }
-
-  public static final class DimensionBuilders.WrappedDimensionProp.Builder {
-    ctor public DimensionBuilders.WrappedDimensionProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.WrappedDimensionProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.DimensionBuilders.WrappedDimensionProp.Builder setMinimumSize(androidx.wear.protolayout.DimensionBuilders.DpProp);
-  }
-
-  public final class LayoutElementBuilders {
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int ANGULAR_ALIGNMENT_CENTER = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int ANGULAR_ALIGNMENT_END = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int ANGULAR_ALIGNMENT_START = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int ANGULAR_ALIGNMENT_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int ARC_ANCHOR_CENTER = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int ARC_ANCHOR_END = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int ARC_ANCHOR_START = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int ARC_ANCHOR_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int CONTENT_SCALE_MODE_CROP = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int CONTENT_SCALE_MODE_FILL_BOUNDS = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int CONTENT_SCALE_MODE_FIT = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int CONTENT_SCALE_MODE_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int FONT_VARIANT_BODY = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int FONT_VARIANT_TITLE = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int FONT_VARIANT_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int FONT_WEIGHT_BOLD = 700; // 0x2bc
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int FONT_WEIGHT_MEDIUM = 500; // 0x1f4
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int FONT_WEIGHT_NORMAL = 400; // 0x190
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int FONT_WEIGHT_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int HORIZONTAL_ALIGN_CENTER = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int HORIZONTAL_ALIGN_END = 5; // 0x5
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int HORIZONTAL_ALIGN_LEFT = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int HORIZONTAL_ALIGN_RIGHT = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int HORIZONTAL_ALIGN_START = 4; // 0x4
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int HORIZONTAL_ALIGN_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int SPAN_VERTICAL_ALIGN_BOTTOM = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int SPAN_VERTICAL_ALIGN_TEXT_BASELINE = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int SPAN_VERTICAL_ALIGN_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int STROKE_CAP_BUTT = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int STROKE_CAP_ROUND = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int STROKE_CAP_SQUARE = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int STROKE_CAP_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int TEXT_ALIGN_CENTER = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int TEXT_ALIGN_END = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int TEXT_ALIGN_START = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int TEXT_ALIGN_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static final int TEXT_OVERFLOW_ELLIPSIZE = 4; // 0x4
-    field @Deprecated @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int TEXT_OVERFLOW_ELLIPSIZE_END = 2; // 0x2
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int TEXT_OVERFLOW_MARQUEE = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int TEXT_OVERFLOW_TRUNCATE = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int TEXT_OVERFLOW_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int VERTICAL_ALIGN_BOTTOM = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int VERTICAL_ALIGN_CENTER = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int VERTICAL_ALIGN_TOP = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int VERTICAL_ALIGN_UNDEFINED = 0; // 0x0
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Arc implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp? getAnchorAngle();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcAnchorTypeProp? getAnchorType();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp? getArcDirection();
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.ArcLayoutElement!> getContents();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp? getVerticalAlign();
-  }
-
-  public static final class LayoutElementBuilders.Arc.Builder {
-    ctor public LayoutElementBuilders.Arc.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder addContent(androidx.wear.protolayout.LayoutElementBuilders.ArcLayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Arc build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setAnchorAngle(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setAnchorType(androidx.wear.protolayout.LayoutElementBuilders.ArcAnchorTypeProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setAnchorType(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setArcDirection(androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setArcDirection(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setVerticalAlign(androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Arc.Builder setVerticalAlign(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.ArcAdapter implements androidx.wear.protolayout.LayoutElementBuilders.ArcLayoutElement {
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getContent();
-    method public androidx.wear.protolayout.TypeBuilders.BoolProp? getRotateContents();
-  }
-
-  public static final class LayoutElementBuilders.ArcAdapter.Builder {
-    ctor public LayoutElementBuilders.ArcAdapter.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcAdapter build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcAdapter.Builder setContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcAdapter.Builder setRotateContents(androidx.wear.protolayout.TypeBuilders.BoolProp);
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcAdapter.Builder setRotateContents(boolean);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.ArcAnchorTypeProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.ArcAnchorTypeProp.Builder {
-    ctor public LayoutElementBuilders.ArcAnchorTypeProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcAnchorTypeProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcAnchorTypeProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static final class LayoutElementBuilders.ArcDirectionProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.ArcDirectionProp.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public LayoutElementBuilders.ArcDirectionProp.Builder(int);
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp build();
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface LayoutElementBuilders.ArcLayoutElement {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.ArcLine implements androidx.wear.protolayout.LayoutElementBuilders.ArcLayoutElement {
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp? getArcDirection();
-    method public androidx.wear.protolayout.ColorBuilders.Brush? getBrush();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp? getColor();
-    method public androidx.wear.protolayout.DimensionBuilders.AngularLayoutConstraint? getLayoutConstraintsForDynamicLength();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp? getLength();
-    method public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers? getModifiers();
-    method public androidx.wear.protolayout.LayoutElementBuilders.StrokeCapProp? getStrokeCap();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getThickness();
-  }
-
-  public static final class LayoutElementBuilders.ArcLine.Builder {
-    ctor public LayoutElementBuilders.ArcLine.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcLine build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setArcDirection(androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setArcDirection(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setBrush(androidx.wear.protolayout.ColorBuilders.Brush);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setColor(androidx.wear.protolayout.ColorBuilders.ColorProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setLayoutConstraintsForDynamicLength(androidx.wear.protolayout.DimensionBuilders.AngularLayoutConstraint);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setLength(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.ArcModifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setStrokeCap(androidx.wear.protolayout.LayoutElementBuilders.StrokeCapProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setStrokeCap(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcLine.Builder setThickness(androidx.wear.protolayout.DimensionBuilders.DpProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.ArcSpacer implements androidx.wear.protolayout.LayoutElementBuilders.ArcLayoutElement {
-    method public androidx.wear.protolayout.DimensionBuilders.AngularDimension? getAngularLength();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp? getLength();
-    method public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers? getModifiers();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getThickness();
-  }
-
-  public static final class LayoutElementBuilders.ArcSpacer.Builder {
-    ctor public LayoutElementBuilders.ArcSpacer.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcSpacer build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.ArcSpacer.Builder setAngularLength(androidx.wear.protolayout.DimensionBuilders.AngularDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcSpacer.Builder setLength(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcSpacer.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.ArcModifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcSpacer.Builder setThickness(androidx.wear.protolayout.DimensionBuilders.DpProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.ArcText implements androidx.wear.protolayout.LayoutElementBuilders.ArcLayoutElement {
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp? getArcDirection();
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle? getFontStyle();
-    method public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers? getModifiers();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getText();
-  }
-
-  public static final class LayoutElementBuilders.ArcText.Builder {
-    ctor public LayoutElementBuilders.ArcText.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcText build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.ArcText.Builder setArcDirection(androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.ArcText.Builder setArcDirection(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcText.Builder setFontStyle(androidx.wear.protolayout.LayoutElementBuilders.FontStyle);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcText.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.ArcModifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ArcText.Builder setText(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcText.Builder setText(String);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Box implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.LayoutElement!> getContents();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension? getHeight();
-    method public androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp? getHorizontalAlignment();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp? getVerticalAlignment();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension? getWidth();
-  }
-
-  public static final class LayoutElementBuilders.Box.Builder {
-    ctor public LayoutElementBuilders.Box.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder addContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Box build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder setHeight(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder setHorizontalAlignment(androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder setHorizontalAlignment(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder setVerticalAlignment(androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder setVerticalAlignment(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Box.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.ColorFilter {
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp? getTint();
-  }
-
-  public static final class LayoutElementBuilders.ColorFilter.Builder {
-    ctor public LayoutElementBuilders.ColorFilter.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ColorFilter build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ColorFilter.Builder setTint(androidx.wear.protolayout.ColorBuilders.ColorProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Column implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.LayoutElement!> getContents();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension? getHeight();
-    method public androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp? getHorizontalAlignment();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension? getWidth();
-  }
-
-  public static final class LayoutElementBuilders.Column.Builder {
-    ctor public LayoutElementBuilders.Column.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Column.Builder addContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Column build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Column.Builder setHeight(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Column.Builder setHorizontalAlignment(androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Column.Builder setHorizontalAlignment(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Column.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Column.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.ContentScaleModeProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.ContentScaleModeProp.Builder {
-    ctor public LayoutElementBuilders.ContentScaleModeProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ContentScaleModeProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.ContentScaleModeProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static final class LayoutElementBuilders.DashedArcLine implements androidx.wear.protolayout.LayoutElementBuilders.ArcLayoutElement {
-    method public androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp? getArcDirection();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp? getColor();
-    method public androidx.wear.protolayout.DimensionBuilders.AngularLayoutConstraint? getLayoutConstraintsForDynamicLength();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp? getLength();
-    method public androidx.wear.protolayout.LayoutElementBuilders.DashedLinePattern? getLinePattern();
-    method public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers? getModifiers();
-    method @Dimension(unit=androidx.annotation.Dimension.DP) public float getThickness();
-  }
-
-  public static final class LayoutElementBuilders.DashedArcLine.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public LayoutElementBuilders.DashedArcLine.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setArcDirection(androidx.wear.protolayout.LayoutElementBuilders.ArcDirectionProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setArcDirection(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setColor(androidx.wear.protolayout.ColorBuilders.ColorProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setLayoutConstraintsForDynamicLength(androidx.wear.protolayout.DimensionBuilders.AngularLayoutConstraint);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setLength(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setLinePattern(androidx.wear.protolayout.LayoutElementBuilders.DashedLinePattern);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.ArcModifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine.Builder setThickness(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static final class LayoutElementBuilders.DashedLinePattern {
-    method public java.util.List<androidx.wear.protolayout.DimensionBuilders.DegreesProp!> getGapLocations();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getGapSize();
-  }
-
-  public static final class LayoutElementBuilders.DashedLinePattern.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public LayoutElementBuilders.DashedLinePattern.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.DashedLinePattern build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedLinePattern.Builder setGapInterval(float);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedLinePattern.Builder setGapLocations(float...);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.LayoutElementBuilders.DashedLinePattern.Builder setGapSize(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ExperimentalProtoLayoutExtensionApi @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class LayoutElementBuilders.ExtensionLayoutElement implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public String getExtensionId();
-    method public androidx.wear.protolayout.DimensionBuilders.ExtensionDimension? getHeight();
-    method public byte[] getPayload();
-    method public androidx.wear.protolayout.DimensionBuilders.ExtensionDimension? getWidth();
-  }
-
-  public static final class LayoutElementBuilders.ExtensionLayoutElement.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public LayoutElementBuilders.ExtensionLayoutElement.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ExtensionLayoutElement build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.ExtensionLayoutElement.Builder setExtensionId(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.ExtensionLayoutElement.Builder setHeight(androidx.wear.protolayout.DimensionBuilders.ExtensionDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.ExtensionLayoutElement.Builder setPayload(byte[]);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.ExtensionLayoutElement.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.ExtensionDimension);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static interface LayoutElementBuilders.FontSetting {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.LayoutElementBuilders.FontSetting roundness(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.LayoutElementBuilders.FontSetting tabularNum();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.LayoutElementBuilders.FontSetting weight(@IntRange(from=1, to=1000) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.LayoutElementBuilders.FontSetting width(@FloatRange(from=25, to=200) float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.FontStyle {
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp? getColor();
-    method public androidx.wear.protolayout.TypeBuilders.BoolProp? getItalic();
-    method public androidx.wear.protolayout.DimensionBuilders.EmProp? getLetterSpacing();
-    method public java.util.List<java.lang.String!> getPreferredFontFamilies();
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.FontSetting!> getSettings();
-    method public androidx.wear.protolayout.DimensionBuilders.SpProp? getSize();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public java.util.List<androidx.wear.protolayout.DimensionBuilders.SpProp!> getSizes();
-    method public androidx.wear.protolayout.TypeBuilders.BoolProp? getUnderline();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.LayoutElementBuilders.FontVariantProp? getVariant();
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontWeightProp? getWeight();
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static final String ROBOTO_FLEX_FONT = "roboto-flex";
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static final String ROBOTO_FONT = "roboto";
-  }
-
-  public static final class LayoutElementBuilders.FontStyle.Builder {
-    ctor public LayoutElementBuilders.FontStyle.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setColor(androidx.wear.protolayout.ColorBuilders.ColorProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setItalic(androidx.wear.protolayout.TypeBuilders.BoolProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setItalic(boolean);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setLetterSpacing(androidx.wear.protolayout.DimensionBuilders.EmProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setPreferredFontFamilies(String, java.lang.String!...);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setSettings(androidx.wear.protolayout.LayoutElementBuilders.FontSetting!...);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setSize(androidx.wear.protolayout.DimensionBuilders.SpProp);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setSizes(@Dimension(unit=androidx.annotation.Dimension.SP) @IntRange(from=1) int...);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setUnderline(androidx.wear.protolayout.TypeBuilders.BoolProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setUnderline(boolean);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setVariant(androidx.wear.protolayout.LayoutElementBuilders.FontVariantProp);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setVariant(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setWeight(androidx.wear.protolayout.LayoutElementBuilders.FontWeightProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setWeight(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.FontStyles {
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder body1(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder body2(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder button(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder caption1(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder caption2(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder display1(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder display2(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder display3(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder title1(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder title2(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder title3(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.FontVariantProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.FontVariantProp.Builder {
-    ctor public LayoutElementBuilders.FontVariantProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontVariantProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontVariantProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.FontWeightProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.FontWeightProp.Builder {
-    ctor public LayoutElementBuilders.FontWeightProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontWeightProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.FontWeightProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.HorizontalAlignmentProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.HorizontalAlignmentProp.Builder {
-    ctor public LayoutElementBuilders.HorizontalAlignmentProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Image implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public androidx.wear.protolayout.LayoutElementBuilders.ColorFilter? getColorFilter();
-    method public androidx.wear.protolayout.LayoutElementBuilders.ContentScaleModeProp? getContentScaleMode();
-    method public androidx.wear.protolayout.DimensionBuilders.ImageDimension? getHeight();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getResourceId();
-    method public androidx.wear.protolayout.DimensionBuilders.ImageDimension? getWidth();
-  }
-
-  public static final class LayoutElementBuilders.Image.Builder {
-    ctor public LayoutElementBuilders.Image.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.Image build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setColorFilter(androidx.wear.protolayout.LayoutElementBuilders.ColorFilter);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setContentScaleMode(androidx.wear.protolayout.LayoutElementBuilders.ContentScaleModeProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setContentScaleMode(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setHeight(androidx.wear.protolayout.DimensionBuilders.ImageDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setResourceId(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setResourceId(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Image.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.ImageDimension);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Layout {
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public static androidx.wear.protolayout.LayoutElementBuilders.Layout? fromByteArray(byte[]);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.Layout fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.LayoutElement? getRoot();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public byte[] toByteArray();
-  }
-
-  public static final class LayoutElementBuilders.Layout.Builder {
-    ctor public LayoutElementBuilders.Layout.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.Layout build();
-    method public androidx.wear.protolayout.LayoutElementBuilders.Layout.Builder setRoot(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface LayoutElementBuilders.LayoutElement {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Row implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.LayoutElement!> getContents();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension? getHeight();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp? getVerticalAlignment();
-    method public androidx.wear.protolayout.DimensionBuilders.ContainerDimension? getWidth();
-  }
-
-  public static final class LayoutElementBuilders.Row.Builder {
-    ctor public LayoutElementBuilders.Row.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Row.Builder addContent(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Row build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Row.Builder setHeight(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Row.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Row.Builder setVerticalAlignment(androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Row.Builder setVerticalAlignment(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Row.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.ContainerDimension);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Spacer implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public androidx.wear.protolayout.DimensionBuilders.SpacerDimension? getHeight();
-    method public androidx.wear.protolayout.DimensionBuilders.VerticalLayoutConstraint? getLayoutConstraintsForDynamicHeight();
-    method public androidx.wear.protolayout.DimensionBuilders.HorizontalLayoutConstraint? getLayoutConstraintsForDynamicWidth();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.DimensionBuilders.SpacerDimension? getWidth();
-  }
-
-  public static final class LayoutElementBuilders.Spacer.Builder {
-    ctor public LayoutElementBuilders.Spacer.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.Spacer build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spacer.Builder setHeight(androidx.wear.protolayout.DimensionBuilders.SpacerDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.Spacer.Builder setLayoutConstraintsForDynamicHeight(androidx.wear.protolayout.DimensionBuilders.VerticalLayoutConstraint);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.Spacer.Builder setLayoutConstraintsForDynamicWidth(androidx.wear.protolayout.DimensionBuilders.HorizontalLayoutConstraint);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spacer.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spacer.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.SpacerDimension);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static interface LayoutElementBuilders.Span {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.SpanImage implements androidx.wear.protolayout.LayoutElementBuilders.Span {
-    method public androidx.wear.protolayout.LayoutElementBuilders.SpanVerticalAlignmentProp? getAlignment();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getHeight();
-    method public androidx.wear.protolayout.ModifiersBuilders.SpanModifiers? getModifiers();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getResourceId();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getWidth();
-  }
-
-  public static final class LayoutElementBuilders.SpanImage.Builder {
-    ctor public LayoutElementBuilders.SpanImage.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.SpanImage build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanImage.Builder setAlignment(androidx.wear.protolayout.LayoutElementBuilders.SpanVerticalAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanImage.Builder setAlignment(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanImage.Builder setHeight(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanImage.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.SpanModifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanImage.Builder setResourceId(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanImage.Builder setResourceId(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanImage.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.DpProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.SpanText implements androidx.wear.protolayout.LayoutElementBuilders.Span {
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle? getFontStyle();
-    method public androidx.wear.protolayout.ModifiersBuilders.SpanModifiers? getModifiers();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getText();
-  }
-
-  public static final class LayoutElementBuilders.SpanText.Builder {
-    ctor public LayoutElementBuilders.SpanText.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.SpanText build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanText.Builder setFontStyle(androidx.wear.protolayout.LayoutElementBuilders.FontStyle);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanText.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.SpanModifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanText.Builder setText(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanText.Builder setText(String);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.SpanVerticalAlignmentProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.SpanVerticalAlignmentProp.Builder {
-    ctor public LayoutElementBuilders.SpanVerticalAlignmentProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.SpanVerticalAlignmentProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.SpanVerticalAlignmentProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Spannable implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public androidx.wear.protolayout.DimensionBuilders.SpProp? getLineHeight();
-    method @SuppressCompatibility @IntRange(from=0xffffffff) @androidx.wear.protolayout.expression.ProtoLayoutExperimental public int getMarqueeIterations();
-    method public androidx.wear.protolayout.TypeBuilders.Int32Prop? getMaxLines();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp? getMultilineAlignment();
-    method public androidx.wear.protolayout.LayoutElementBuilders.TextOverflowProp? getOverflow();
-    method public java.util.List<androidx.wear.protolayout.LayoutElementBuilders.Span!> getSpans();
-  }
-
-  public static final class LayoutElementBuilders.Spannable.Builder {
-    ctor public LayoutElementBuilders.Spannable.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder addSpan(androidx.wear.protolayout.LayoutElementBuilders.Span);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Spannable build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setLineHeight(androidx.wear.protolayout.DimensionBuilders.SpProp);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setMarqueeIterations(@IntRange(from=0xffffffff) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setMaxLines(androidx.wear.protolayout.TypeBuilders.Int32Prop);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setMaxLines(@IntRange(from=1) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setMultilineAlignment(androidx.wear.protolayout.LayoutElementBuilders.HorizontalAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setMultilineAlignment(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setOverflow(androidx.wear.protolayout.LayoutElementBuilders.TextOverflowProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Spannable.Builder setOverflow(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class LayoutElementBuilders.StrokeCapProp {
-    method public androidx.wear.protolayout.ModifiersBuilders.Shadow? getShadow();
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.StrokeCapProp.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public LayoutElementBuilders.StrokeCapProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.StrokeCapProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.LayoutElementBuilders.StrokeCapProp.Builder setShadow(androidx.wear.protolayout.ModifiersBuilders.Shadow);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.StrokeCapProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.Text implements androidx.wear.protolayout.LayoutElementBuilders.LayoutElement {
-    method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle? getFontStyle();
-    method public androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint? getLayoutConstraintsForDynamicText();
-    method public androidx.wear.protolayout.DimensionBuilders.SpProp? getLineHeight();
-    method @SuppressCompatibility @IntRange(from=0xffffffff) @androidx.wear.protolayout.expression.ProtoLayoutExperimental public int getMarqueeIterations();
-    method public androidx.wear.protolayout.TypeBuilders.Int32Prop? getMaxLines();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers? getModifiers();
-    method public androidx.wear.protolayout.LayoutElementBuilders.TextAlignmentProp? getMultilineAlignment();
-    method public androidx.wear.protolayout.LayoutElementBuilders.TextOverflowProp? getOverflow();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getText();
-  }
-
-  public static final class LayoutElementBuilders.Text.Builder {
-    ctor public LayoutElementBuilders.Text.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.Text build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setFontStyle(androidx.wear.protolayout.LayoutElementBuilders.FontStyle);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setLayoutConstraintsForDynamicText(androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setLineHeight(androidx.wear.protolayout.DimensionBuilders.SpProp);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setMarqueeIterations(@IntRange(from=0xffffffff) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setMaxLines(androidx.wear.protolayout.TypeBuilders.Int32Prop);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setMaxLines(@IntRange(from=1) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setModifiers(androidx.wear.protolayout.ModifiersBuilders.Modifiers);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setMultilineAlignment(androidx.wear.protolayout.LayoutElementBuilders.TextAlignmentProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setMultilineAlignment(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setOverflow(androidx.wear.protolayout.LayoutElementBuilders.TextOverflowProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setOverflow(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setText(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.Text.Builder setText(String);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.TextAlignmentProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.TextAlignmentProp.Builder {
-    ctor public LayoutElementBuilders.TextAlignmentProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.TextAlignmentProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.TextAlignmentProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.TextOverflowProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.TextOverflowProp.Builder {
-    ctor public LayoutElementBuilders.TextOverflowProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.TextOverflowProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.TextOverflowProp.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class LayoutElementBuilders.VerticalAlignmentProp {
-    method public int getValue();
-  }
-
-  public static final class LayoutElementBuilders.VerticalAlignmentProp.Builder {
-    ctor public LayoutElementBuilders.VerticalAlignmentProp.Builder();
-    method public androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.LayoutElementBuilders.VerticalAlignmentProp.Builder setValue(int);
-  }
-
-  public final class ModifiersBuilders {
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SEMANTICS_ROLE_BUTTON = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SEMANTICS_ROLE_CHECKBOX = 3; // 0x3
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SEMANTICS_ROLE_IMAGE = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SEMANTICS_ROLE_NONE = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SEMANTICS_ROLE_RADIOBUTTON = 5; // 0x5
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SEMANTICS_ROLE_SWITCH = 4; // 0x4
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_DIRECTION_BOTTOM_TO_TOP = 4; // 0x4
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_DIRECTION_LEFT_TO_RIGHT = 1; // 0x1
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_DIRECTION_RIGHT_TO_LEFT = 2; // 0x2
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_DIRECTION_TOP_TO_BOTTOM = 3; // 0x3
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_DIRECTION_UNDEFINED = 0; // 0x0
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_PARENT_SNAP_TO_INSIDE = 1; // 0x1
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_PARENT_SNAP_TO_OUTSIDE = 2; // 0x2
-    field @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int SLIDE_PARENT_SNAP_UNDEFINED = 0; // 0x0
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.AnimatedVisibility {
-    method public androidx.wear.protolayout.ModifiersBuilders.EnterTransition? getEnterTransition();
-    method public androidx.wear.protolayout.ModifiersBuilders.ExitTransition? getExitTransition();
-  }
-
-  public static final class ModifiersBuilders.AnimatedVisibility.Builder {
-    ctor public ModifiersBuilders.AnimatedVisibility.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.AnimatedVisibility build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.AnimatedVisibility.Builder setEnterTransition(androidx.wear.protolayout.ModifiersBuilders.EnterTransition);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.AnimatedVisibility.Builder setExitTransition(androidx.wear.protolayout.ModifiersBuilders.ExitTransition);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.ArcModifiers {
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable? getClickable();
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp? getOpacity();
-    method public androidx.wear.protolayout.ModifiersBuilders.Semantics? getSemantics();
-  }
-
-  public static final class ModifiersBuilders.ArcModifiers.Builder {
-    ctor public ModifiersBuilders.ArcModifiers.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers.Builder setClickable(androidx.wear.protolayout.ModifiersBuilders.Clickable);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers.Builder setOpacity(androidx.wear.protolayout.TypeBuilders.FloatProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.ArcModifiers.Builder setSemantics(androidx.wear.protolayout.ModifiersBuilders.Semantics);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.Background {
-    method public androidx.wear.protolayout.ColorBuilders.Brush? getBrush();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp? getColor();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner? getCorner();
-  }
-
-  public static final class ModifiersBuilders.Background.Builder {
-    ctor public ModifiersBuilders.Background.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Background build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ModifiersBuilders.Background.Builder setBrush(androidx.wear.protolayout.ColorBuilders.Brush);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Background.Builder setColor(androidx.wear.protolayout.ColorBuilders.ColorProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Background.Builder setCorner(androidx.wear.protolayout.ModifiersBuilders.Corner);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.Border {
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp? getColor();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getWidth();
-  }
-
-  public static final class ModifiersBuilders.Border.Builder {
-    ctor public ModifiersBuilders.Border.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Border build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Border.Builder setColor(androidx.wear.protolayout.ColorBuilders.ColorProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Border.Builder setWidth(androidx.wear.protolayout.DimensionBuilders.DpProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.Clickable {
-    method public String getId();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getMinimumClickableHeight();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getMinimumClickableWidth();
-    method public androidx.wear.protolayout.ActionBuilders.Action? getOnClick();
-    method public boolean isVisualFeedbackEnabled();
-  }
-
-  public static final class ModifiersBuilders.Clickable.Builder {
-    ctor public ModifiersBuilders.Clickable.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Clickable.Builder setId(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.ModifiersBuilders.Clickable.Builder setMinimumClickableHeight(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.ModifiersBuilders.Clickable.Builder setMinimumClickableWidth(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Clickable.Builder setOnClick(androidx.wear.protolayout.ActionBuilders.Action);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Clickable.Builder setVisualFeedbackEnabled(boolean);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.Corner {
-    method public androidx.wear.protolayout.ModifiersBuilders.CornerRadius getBottomLeftRadius();
-    method public androidx.wear.protolayout.ModifiersBuilders.CornerRadius getBottomRightRadius();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getRadius();
-    method public androidx.wear.protolayout.ModifiersBuilders.CornerRadius getTopLeftRadius();
-    method public androidx.wear.protolayout.ModifiersBuilders.CornerRadius getTopRightRadius();
-  }
-
-  public static final class ModifiersBuilders.Corner.Builder {
-    ctor public ModifiersBuilders.Corner.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Corner build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setBottomLeftRadius(androidx.wear.protolayout.DimensionBuilders.DpProp, androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setBottomLeftRadius(androidx.wear.protolayout.ModifiersBuilders.CornerRadius);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setBottomRightRadius(androidx.wear.protolayout.DimensionBuilders.DpProp, androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setBottomRightRadius(androidx.wear.protolayout.ModifiersBuilders.CornerRadius);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setRadius(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setTopLeftRadius(androidx.wear.protolayout.DimensionBuilders.DpProp, androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setTopLeftRadius(androidx.wear.protolayout.ModifiersBuilders.CornerRadius);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setTopRightRadius(androidx.wear.protolayout.DimensionBuilders.DpProp, androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Corner.Builder setTopRightRadius(androidx.wear.protolayout.ModifiersBuilders.CornerRadius);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static final class ModifiersBuilders.CornerRadius {
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getX();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getY();
-  }
-
-  public static final class ModifiersBuilders.CornerRadius.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public ModifiersBuilders.CornerRadius.Builder(androidx.wear.protolayout.DimensionBuilders.DpProp, androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method public androidx.wear.protolayout.ModifiersBuilders.CornerRadius build();
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public static final class ModifiersBuilders.DefaultContentTransitions {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.ModifiersBuilders.EnterTransition fadeIn();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.ModifiersBuilders.EnterTransition fadeInSlideIn(@SuppressCompatibility int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.ModifiersBuilders.ExitTransition fadeOut();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.ModifiersBuilders.ExitTransition fadeOutSlideOut(@SuppressCompatibility int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.ModifiersBuilders.EnterTransition slideIn(@SuppressCompatibility int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.ModifiersBuilders.ExitTransition slideOut(@SuppressCompatibility int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.ElementMetadata {
-    method public byte[] getTagData();
-  }
-
-  public static final class ModifiersBuilders.ElementMetadata.Builder {
-    ctor public ModifiersBuilders.ElementMetadata.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.ElementMetadata build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.ElementMetadata.Builder setTagData(byte[]);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.EnterTransition {
-    method public androidx.wear.protolayout.ModifiersBuilders.FadeInTransition? getFadeIn();
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideInTransition? getSlideIn();
-  }
-
-  public static final class ModifiersBuilders.EnterTransition.Builder {
-    ctor public ModifiersBuilders.EnterTransition.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.EnterTransition build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.EnterTransition.Builder setFadeIn(androidx.wear.protolayout.ModifiersBuilders.FadeInTransition);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.EnterTransition.Builder setSlideIn(androidx.wear.protolayout.ModifiersBuilders.SlideInTransition);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.ExitTransition {
-    method public androidx.wear.protolayout.ModifiersBuilders.FadeOutTransition? getFadeOut();
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideOutTransition? getSlideOut();
-  }
-
-  public static final class ModifiersBuilders.ExitTransition.Builder {
-    ctor public ModifiersBuilders.ExitTransition.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.ExitTransition build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.ExitTransition.Builder setFadeOut(androidx.wear.protolayout.ModifiersBuilders.FadeOutTransition);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.ExitTransition.Builder setSlideOut(androidx.wear.protolayout.ModifiersBuilders.SlideOutTransition);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.FadeInTransition {
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec? getAnimationSpec();
-    method @FloatRange(from=0.0, to=1.0) public float getInitialAlpha();
-  }
-
-  public static final class ModifiersBuilders.FadeInTransition.Builder {
-    ctor public ModifiersBuilders.FadeInTransition.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.FadeInTransition build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.FadeInTransition.Builder setAnimationSpec(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.FadeInTransition.Builder setInitialAlpha(@FloatRange(from=0.0, to=1.0) float);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.FadeOutTransition {
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec? getAnimationSpec();
-    method @FloatRange(from=0.0, to=1.0) public float getTargetAlpha();
-  }
-
-  public static final class ModifiersBuilders.FadeOutTransition.Builder {
-    ctor public ModifiersBuilders.FadeOutTransition.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.FadeOutTransition build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.FadeOutTransition.Builder setAnimationSpec(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method public androidx.wear.protolayout.ModifiersBuilders.FadeOutTransition.Builder setTargetAlpha(@FloatRange(from=0.0, to=1.0) float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.Modifiers {
-    method public androidx.wear.protolayout.ModifiersBuilders.Background? getBackground();
-    method public androidx.wear.protolayout.ModifiersBuilders.Border? getBorder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable? getClickable();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.ModifiersBuilders.AnimatedVisibility? getContentUpdateAnimation();
-    method public androidx.wear.protolayout.ModifiersBuilders.ElementMetadata? getMetadata();
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp? getOpacity();
-    method public androidx.wear.protolayout.ModifiersBuilders.Padding? getPadding();
-    method public androidx.wear.protolayout.ModifiersBuilders.Semantics? getSemantics();
-    method public androidx.wear.protolayout.ModifiersBuilders.Transformation? getTransformation();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.TypeBuilders.BoolProp isVisible();
-  }
-
-  public static final class ModifiersBuilders.Modifiers.Builder {
-    ctor public ModifiersBuilders.Modifiers.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Modifiers build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setBackground(androidx.wear.protolayout.ModifiersBuilders.Background);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setBorder(androidx.wear.protolayout.ModifiersBuilders.Border);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setClickable(androidx.wear.protolayout.ModifiersBuilders.Clickable);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setContentUpdateAnimation(androidx.wear.protolayout.ModifiersBuilders.AnimatedVisibility);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setMetadata(androidx.wear.protolayout.ModifiersBuilders.ElementMetadata);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setOpacity(androidx.wear.protolayout.TypeBuilders.FloatProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setPadding(androidx.wear.protolayout.ModifiersBuilders.Padding);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setSemantics(androidx.wear.protolayout.ModifiersBuilders.Semantics);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setTransformation(androidx.wear.protolayout.ModifiersBuilders.Transformation);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.ModifiersBuilders.Modifiers.Builder setVisible(androidx.wear.protolayout.TypeBuilders.BoolProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.Padding {
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getBottom();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getEnd();
-    method public androidx.wear.protolayout.TypeBuilders.BoolProp? getRtlAware();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getStart();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp? getTop();
-  }
-
-  public static final class ModifiersBuilders.Padding.Builder {
-    ctor public ModifiersBuilders.Padding.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Padding build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Padding.Builder setAll(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Padding.Builder setBottom(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Padding.Builder setEnd(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Padding.Builder setRtlAware(androidx.wear.protolayout.TypeBuilders.BoolProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Padding.Builder setRtlAware(boolean);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Padding.Builder setStart(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Padding.Builder setTop(androidx.wear.protolayout.DimensionBuilders.DpProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.Semantics {
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getContentDescription();
-    method public int getRole();
-    method public androidx.wear.protolayout.TypeBuilders.StringProp? getStateDescription();
-  }
-
-  public static final class ModifiersBuilders.Semantics.Builder {
-    ctor public ModifiersBuilders.Semantics.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Semantics build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Semantics.Builder setContentDescription(androidx.wear.protolayout.TypeBuilders.StringProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.Semantics.Builder setContentDescription(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.Semantics.Builder setRole(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.Semantics.Builder setStateDescription(androidx.wear.protolayout.TypeBuilders.StringProp);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static final class ModifiersBuilders.Shadow {
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getBlurRadius();
-    method public androidx.wear.protolayout.ColorBuilders.ColorProp getColor();
-  }
-
-  public static final class ModifiersBuilders.Shadow.Builder {
-    ctor public ModifiersBuilders.Shadow.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Shadow build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.ModifiersBuilders.Shadow.Builder setBlurRadius(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public androidx.wear.protolayout.ModifiersBuilders.Shadow.Builder setColor(androidx.wear.protolayout.ColorBuilders.ColorProp);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface ModifiersBuilders.SlideBound {
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.SlideInTransition {
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec? getAnimationSpec();
-    method @SuppressCompatibility public int getDirection();
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideBound? getInitialSlideBound();
-  }
-
-  public static final class ModifiersBuilders.SlideInTransition.Builder {
-    ctor public ModifiersBuilders.SlideInTransition.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideInTransition build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.SlideInTransition.Builder setAnimationSpec(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.SlideInTransition.Builder setDirection(@SuppressCompatibility int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.SlideInTransition.Builder setInitialSlideBound(androidx.wear.protolayout.ModifiersBuilders.SlideBound);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.SlideOutTransition {
-    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec? getAnimationSpec();
-    method @SuppressCompatibility public int getDirection();
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideBound? getTargetSlideBound();
-  }
-
-  public static final class ModifiersBuilders.SlideOutTransition.Builder {
-    ctor public ModifiersBuilders.SlideOutTransition.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideOutTransition build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.SlideOutTransition.Builder setAnimationSpec(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.SlideOutTransition.Builder setDirection(@SuppressCompatibility int);
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideOutTransition.Builder setTargetSlideBound(androidx.wear.protolayout.ModifiersBuilders.SlideBound);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ModifiersBuilders.SlideParentBound implements androidx.wear.protolayout.ModifiersBuilders.SlideBound {
-    method @SuppressCompatibility public int getSnapTo();
-  }
-
-  public static final class ModifiersBuilders.SlideParentBound.Builder {
-    ctor public ModifiersBuilders.SlideParentBound.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.SlideParentBound build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ModifiersBuilders.SlideParentBound.Builder setSnapTo(@SuppressCompatibility int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ModifiersBuilders.SpanModifiers {
-    method public androidx.wear.protolayout.ModifiersBuilders.Clickable? getClickable();
-  }
-
-  public static final class ModifiersBuilders.SpanModifiers.Builder {
-    ctor public ModifiersBuilders.SpanModifiers.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.SpanModifiers build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ModifiersBuilders.SpanModifiers.Builder setClickable(androidx.wear.protolayout.ModifiersBuilders.Clickable);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static final class ModifiersBuilders.Transformation {
-    method public androidx.wear.protolayout.DimensionBuilders.PivotDimension getPivotX();
-    method public androidx.wear.protolayout.DimensionBuilders.PivotDimension getPivotY();
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getRotation();
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp getScaleX();
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp getScaleY();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getTranslationX();
-    method public androidx.wear.protolayout.DimensionBuilders.DpProp getTranslationY();
-  }
-
-  public static final class ModifiersBuilders.Transformation.Builder {
-    ctor public ModifiersBuilders.Transformation.Builder();
-    method public androidx.wear.protolayout.ModifiersBuilders.Transformation build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Transformation.Builder setPivotX(androidx.wear.protolayout.DimensionBuilders.PivotDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Transformation.Builder setPivotY(androidx.wear.protolayout.DimensionBuilders.PivotDimension);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Transformation.Builder setRotation(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Transformation.Builder setScaleX(androidx.wear.protolayout.TypeBuilders.FloatProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Transformation.Builder setScaleY(androidx.wear.protolayout.TypeBuilders.FloatProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Transformation.Builder setTranslationX(androidx.wear.protolayout.DimensionBuilders.DpProp);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.protolayout.ModifiersBuilders.Transformation.Builder setTranslationY(androidx.wear.protolayout.DimensionBuilders.DpProp);
-  }
-
-  public final class ResourceBuilders {
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int ANIMATED_IMAGE_FORMAT_AVD = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int ANIMATED_IMAGE_FORMAT_UNDEFINED = 0; // 0x0
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final int IMAGE_FORMAT_ARGB_8888 = 2; // 0x2
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int IMAGE_FORMAT_RGB_565 = 1; // 0x1
-    field @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final int IMAGE_FORMAT_UNDEFINED = 0; // 0x0
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ResourceBuilders.AndroidAnimatedImageResourceByResId {
-    method public int getAnimatedImageFormat();
-    method @DrawableRes public int getResourceId();
-    method public androidx.wear.protolayout.TriggerBuilders.Trigger? getStartTrigger();
-  }
-
-  public static final class ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder {
-    ctor public ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder();
-    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder setAnimatedImageFormat(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder setResourceId(@DrawableRes int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder setStartTrigger(androidx.wear.protolayout.TriggerBuilders.Trigger);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ResourceBuilders.AndroidImageResourceByResId {
-    method @DrawableRes public int getResourceId();
-  }
-
-  public static final class ResourceBuilders.AndroidImageResourceByResId.Builder {
-    ctor public ResourceBuilders.AndroidImageResourceByResId.Builder();
-    method public androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId.Builder setResourceId(@DrawableRes int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static final class ResourceBuilders.AndroidLottieResourceByResId {
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? getProgress();
-    method @RawRes public int getRawResourceId();
-    method public androidx.wear.protolayout.TriggerBuilders.Trigger? getStartTrigger();
-  }
-
-  public static final class ResourceBuilders.AndroidLottieResourceByResId.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public ResourceBuilders.AndroidLottieResourceByResId.Builder(@RawRes int);
-    method public androidx.wear.protolayout.ResourceBuilders.AndroidLottieResourceByResId build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ResourceBuilders.AndroidLottieResourceByResId.Builder setProgress(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ResourceBuilders.AndroidLottieResourceByResId.Builder setStartTrigger(androidx.wear.protolayout.TriggerBuilders.Trigger);
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId {
-    method public int getAnimatedImageFormat();
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? getProgress();
-    method @DrawableRes public int getResourceId();
-  }
-
-  public static final class ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder {
-    ctor public ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder();
-    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder setAnimatedImageFormat(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder setProgress(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder setResourceId(@DrawableRes int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ResourceBuilders.ImageResource {
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId? getAndroidAnimatedResourceByResId();
-    method public androidx.wear.protolayout.ResourceBuilders.AndroidLottieResourceByResId? getAndroidLottieResourceByResId();
-    method public androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId? getAndroidResourceByResId();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId? getAndroidSeekableAnimatedResourceByResId();
-    method public androidx.wear.protolayout.ResourceBuilders.InlineImageResource? getInlineResource();
-  }
-
-  public static final class ResourceBuilders.ImageResource.Builder {
-    ctor public ResourceBuilders.ImageResource.Builder();
-    method public androidx.wear.protolayout.ResourceBuilders.ImageResource build();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidAnimatedResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidLottieResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidLottieResourceByResId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidSeekableAnimatedResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setInlineResource(androidx.wear.protolayout.ResourceBuilders.InlineImageResource);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ResourceBuilders.InlineImageResource {
-    method public byte[] getData();
-    method public int getFormat();
-    method @Dimension(unit=androidx.annotation.Dimension.PX) public int getHeightPx();
-    method @Dimension(unit=androidx.annotation.Dimension.PX) public int getWidthPx();
-  }
-
-  public static final class ResourceBuilders.InlineImageResource.Builder {
-    ctor public ResourceBuilders.InlineImageResource.Builder();
-    method public androidx.wear.protolayout.ResourceBuilders.InlineImageResource build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.InlineImageResource.Builder setData(byte[]);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.InlineImageResource.Builder setFormat(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.InlineImageResource.Builder setHeightPx(@Dimension(unit=androidx.annotation.Dimension.PX) int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.InlineImageResource.Builder setWidthPx(@Dimension(unit=androidx.annotation.Dimension.PX) int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class ResourceBuilders.Resources {
-    method public java.util.Map<java.lang.String!,androidx.wear.protolayout.ResourceBuilders.ImageResource!> getIdToImageMapping();
-    method public String getVersion();
-  }
-
-  public static final class ResourceBuilders.Resources.Builder {
-    ctor public ResourceBuilders.Resources.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.Resources.Builder addIdToImageMapping(String, androidx.wear.protolayout.ResourceBuilders.ImageResource);
-    method public androidx.wear.protolayout.ResourceBuilders.Resources build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.ResourceBuilders.Resources.Builder setVersion(String);
-  }
-
-  public final class StateBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class StateBuilders.State {
-    method public java.util.Map<androidx.wear.protolayout.expression.AppDataKey<? extends java.lang.Object!>!,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends java.lang.Object!>!> getKeyToValueMapping();
-    method public String getLastClickableId();
-    method public static int getMaxStateEntryCount();
-    method public androidx.wear.protolayout.expression.DynamicDataMap getStateMap();
-  }
-
-  public static final class StateBuilders.State.Builder {
-    ctor public StateBuilders.State.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public <T extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType> androidx.wear.protolayout.StateBuilders.State.Builder addKeyToValueMapping(androidx.wear.protolayout.expression.AppDataKey<T!>, androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<T!>);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.StateBuilders.State.Builder addToStateMap(androidx.wear.protolayout.expression.DynamicDataPair<? extends java.lang.Object!>...);
-    method public androidx.wear.protolayout.StateBuilders.State build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.StateBuilders.State.Builder setStateMap(androidx.wear.protolayout.expression.DynamicDataMap);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.StateBuilders.State.Builder setStateMap(androidx.wear.protolayout.expression.DynamicDataPair<? extends java.lang.Object!>...);
-  }
-
-  public final class TimelineBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TimelineBuilders.TimeInterval {
-    method public long getEndMillis();
-    method public long getStartMillis();
-  }
-
-  public static final class TimelineBuilders.TimeInterval.Builder {
-    ctor public TimelineBuilders.TimeInterval.Builder();
-    method public androidx.wear.protolayout.TimelineBuilders.TimeInterval build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TimelineBuilders.TimeInterval.Builder setEndMillis(long);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TimelineBuilders.TimeInterval.Builder setStartMillis(long);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TimelineBuilders.Timeline {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.TimelineBuilders.Timeline fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public java.util.List<androidx.wear.protolayout.TimelineBuilders.TimelineEntry!> getTimelineEntries();
-  }
-
-  public static final class TimelineBuilders.Timeline.Builder {
-    ctor public TimelineBuilders.Timeline.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TimelineBuilders.Timeline.Builder addTimelineEntry(androidx.wear.protolayout.TimelineBuilders.TimelineEntry);
-    method public androidx.wear.protolayout.TimelineBuilders.Timeline build();
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TimelineBuilders.TimelineEntry {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static androidx.wear.protolayout.TimelineBuilders.TimelineEntry fromLayoutElement(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement);
-    method public androidx.wear.protolayout.LayoutElementBuilders.Layout? getLayout();
-    method public androidx.wear.protolayout.TimelineBuilders.TimeInterval? getValidity();
-  }
-
-  public static final class TimelineBuilders.TimelineEntry.Builder {
-    ctor public TimelineBuilders.TimelineEntry.Builder();
-    method public androidx.wear.protolayout.TimelineBuilders.TimelineEntry build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TimelineBuilders.TimelineEntry.Builder setLayout(androidx.wear.protolayout.LayoutElementBuilders.Layout);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TimelineBuilders.TimelineEntry.Builder setValidity(androidx.wear.protolayout.TimelineBuilders.TimeInterval);
-  }
-
-  public final class TriggerBuilders {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.TriggerBuilders.Trigger createOnConditionMetTrigger(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.TriggerBuilders.Trigger createOnLoadTrigger();
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.TriggerBuilders.Trigger createOnVisibleOnceTrigger();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.TriggerBuilders.Trigger createOnVisibleTrigger();
-  }
-
-  @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class TriggerBuilders.OnVisibleOnceTrigger implements androidx.wear.protolayout.TriggerBuilders.Trigger {
-  }
-
-  public static final class TriggerBuilders.OnVisibleOnceTrigger.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public TriggerBuilders.OnVisibleOnceTrigger.Builder();
-    method public androidx.wear.protolayout.TriggerBuilders.OnVisibleOnceTrigger build();
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class TriggerBuilders.OnVisibleTrigger implements androidx.wear.protolayout.TriggerBuilders.Trigger {
-  }
-
-  public static final class TriggerBuilders.OnVisibleTrigger.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public TriggerBuilders.OnVisibleTrigger.Builder();
-    method public androidx.wear.protolayout.TriggerBuilders.OnVisibleTrigger build();
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static interface TriggerBuilders.Trigger {
-  }
-
-  public final class TypeBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TypeBuilders.BoolProp {
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool? getDynamicValue();
-    method public boolean getValue();
-  }
-
-  public static final class TypeBuilders.BoolProp.Builder {
-    ctor @Deprecated public TypeBuilders.BoolProp.Builder();
-    ctor public TypeBuilders.BoolProp.Builder(boolean);
-    method public androidx.wear.protolayout.TypeBuilders.BoolProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.TypeBuilders.BoolProp.Builder setDynamicValue(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TypeBuilders.BoolProp.Builder setValue(boolean);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TypeBuilders.FloatProp {
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? getDynamicValue();
-    method public float getValue();
-  }
-
-  public static final class TypeBuilders.FloatProp.Builder {
-    ctor @Deprecated public TypeBuilders.FloatProp.Builder();
-    ctor public TypeBuilders.FloatProp.Builder(float);
-    method public androidx.wear.protolayout.TypeBuilders.FloatProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.TypeBuilders.FloatProp.Builder setDynamicValue(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TypeBuilders.FloatProp.Builder setValue(float);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TypeBuilders.Int32Prop {
-    method public int getValue();
-  }
-
-  public static final class TypeBuilders.Int32Prop.Builder {
-    ctor public TypeBuilders.Int32Prop.Builder();
-    method public androidx.wear.protolayout.TypeBuilders.Int32Prop build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TypeBuilders.Int32Prop.Builder setValue(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static final class TypeBuilders.StringLayoutConstraint {
-    method public int getAlignment();
-    method public String getPatternForLayout();
-  }
-
-  public static final class TypeBuilders.StringLayoutConstraint.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public TypeBuilders.StringLayoutConstraint.Builder(String);
-    method public androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint.Builder setAlignment(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TypeBuilders.StringProp {
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicString? getDynamicValue();
-    method public String getValue();
-  }
-
-  public static final class TypeBuilders.StringProp.Builder {
-    ctor @Deprecated public TypeBuilders.StringProp.Builder();
-    ctor public TypeBuilders.StringProp.Builder(String);
-    method public androidx.wear.protolayout.TypeBuilders.StringProp build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.TypeBuilders.StringProp.Builder setDynamicValue(androidx.wear.protolayout.expression.DynamicBuilders.DynamicString);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.protolayout.TypeBuilders.StringProp.Builder setValue(String);
-  }
-
-}
-
-package androidx.wear.protolayout.layout {
-
-  public final class TextKt {
-    method public static androidx.wear.protolayout.LayoutElementBuilders.Text basicText(androidx.wear.protolayout.types.LayoutString text, optional androidx.wear.protolayout.LayoutElementBuilders.FontStyle? fontStyle, optional androidx.wear.protolayout.modifiers.LayoutModifier? modifier, optional int maxLines, optional int alignment, optional int overflow, optional @Dimension(unit=androidx.annotation.Dimension.Companion.SP) float lineHeight);
-    method public static androidx.wear.protolayout.LayoutElementBuilders.FontStyle fontStyle(optional @Dimension(unit=androidx.annotation.Dimension.Companion.SP) float size, optional boolean italic, optional boolean underline, optional androidx.wear.protolayout.types.LayoutColor? color, optional int weight, optional float letterSpacingEm, optional @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) java.util.List<java.lang.Float> additionalSizesSp, optional @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) java.util.List<? extends androidx.wear.protolayout.LayoutElementBuilders.FontSetting> settings, optional @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) java.util.List<java.lang.String> preferredFontFamilies);
-  }
-
-}
-
-package androidx.wear.protolayout.modifiers {
-
-  public final class BackgroundKt {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=500) public static androidx.wear.protolayout.modifiers.LayoutModifier background(androidx.wear.protolayout.modifiers.LayoutModifier, androidx.wear.protolayout.ColorBuilders.Brush brush);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier background(androidx.wear.protolayout.modifiers.LayoutModifier, androidx.wear.protolayout.types.LayoutColor color);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier clip(androidx.wear.protolayout.modifiers.LayoutModifier, androidx.wear.protolayout.ModifiersBuilders.Corner corner);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier clip(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float cornerRadius);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.modifiers.LayoutModifier clip(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float x, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float y);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.modifiers.LayoutModifier clipBottomLeft(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float x, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float y);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.modifiers.LayoutModifier clipBottomRight(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float x, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float y);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.modifiers.LayoutModifier clipTopLeft(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float x, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float y);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.modifiers.LayoutModifier clipTopRight(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float x, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float y);
-  }
-
-  public final class BorderKt {
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier border(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float width, androidx.wear.protolayout.types.LayoutColor color);
-  }
-
-  public final class ClickableKt {
-    method public static androidx.wear.protolayout.ModifiersBuilders.Clickable clickable();
-    method public static androidx.wear.protolayout.ModifiersBuilders.Clickable clickable(optional androidx.wear.protolayout.ActionBuilders.Action action);
-    method public static androidx.wear.protolayout.ModifiersBuilders.Clickable clickable(optional androidx.wear.protolayout.ActionBuilders.Action action, optional String? id);
-    method public static androidx.wear.protolayout.ModifiersBuilders.Clickable clickable(optional androidx.wear.protolayout.ActionBuilders.Action action, optional String? id, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) float minClickableWidth);
-    method public static androidx.wear.protolayout.ModifiersBuilders.Clickable clickable(optional androidx.wear.protolayout.ActionBuilders.Action action, optional String? id, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) float minClickableWidth, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) float minClickableHeight);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier clickable(androidx.wear.protolayout.modifiers.LayoutModifier, optional androidx.wear.protolayout.ActionBuilders.Action action, optional String? id);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier clickable(androidx.wear.protolayout.modifiers.LayoutModifier, androidx.wear.protolayout.ModifiersBuilders.Clickable clickable);
-    method public static androidx.wear.protolayout.ActionBuilders.LoadAction loadAction(optional @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) androidx.wear.protolayout.expression.DynamicDataMap? requestedStateMap);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static androidx.wear.protolayout.modifiers.LayoutModifier minimumTouchTargetSize(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float minWidth, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float minHeight);
-  }
-
-  public interface LayoutModifier {
-    method public <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
-    method public default infix androidx.wear.protolayout.modifiers.LayoutModifier then(androidx.wear.protolayout.modifiers.LayoutModifier other);
-    field public static final androidx.wear.protolayout.modifiers.LayoutModifier.Companion Companion;
-  }
-
-  public static final class LayoutModifier.Companion implements androidx.wear.protolayout.modifiers.LayoutModifier {
-    method public <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
-  }
-
-  public static interface LayoutModifier.Element extends androidx.wear.protolayout.modifiers.LayoutModifier {
-    method public default <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
-  }
-
-  public final class ModifierAppliersKt {
-    method public static androidx.wear.protolayout.ModifiersBuilders.Modifiers toProtoLayoutModifiers(androidx.wear.protolayout.modifiers.LayoutModifier);
-  }
-
-  public final class OpacityKt {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static androidx.wear.protolayout.modifiers.LayoutModifier opacity(androidx.wear.protolayout.modifiers.LayoutModifier, @FloatRange(from=0.0, to=1.0) float staticValue, optional androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? dynamicValue);
-  }
-
-  public final class PaddingKt {
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier padding(androidx.wear.protolayout.modifiers.LayoutModifier, androidx.wear.protolayout.ModifiersBuilders.Padding padding);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier padding(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float all);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier padding(androidx.wear.protolayout.modifiers.LayoutModifier, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float horizontal, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float vertical);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier padding(androidx.wear.protolayout.modifiers.LayoutModifier, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float start, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float top, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float end, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float bottom, optional boolean rtlAware);
-    method public static androidx.wear.protolayout.ModifiersBuilders.Padding padding(@Dimension(unit=androidx.annotation.Dimension.Companion.DP) float all);
-    method public static androidx.wear.protolayout.ModifiersBuilders.Padding padding(@Dimension(unit=androidx.annotation.Dimension.Companion.DP) float horizontal, @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float vertical);
-    method public static androidx.wear.protolayout.ModifiersBuilders.Padding padding(optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float start, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float top, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float end, optional @Dimension(unit=androidx.annotation.Dimension.Companion.DP) float bottom, optional boolean rtlAware);
-  }
-
-  public final class SemanticsKt {
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier clearSemantics(androidx.wear.protolayout.modifiers.LayoutModifier);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier contentDescription(androidx.wear.protolayout.modifiers.LayoutModifier, String staticValue, optional @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) androidx.wear.protolayout.expression.DynamicBuilders.DynamicString? dynamicValue);
-    method public static androidx.wear.protolayout.modifiers.LayoutModifier semanticsRole(androidx.wear.protolayout.modifiers.LayoutModifier, int semanticsRole);
-  }
-
-  public final class TransitionKt {
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.modifiers.LayoutModifier enterTransition(androidx.wear.protolayout.modifiers.LayoutModifier, androidx.wear.protolayout.ModifiersBuilders.EnterTransition transition);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.modifiers.LayoutModifier enterTransition(androidx.wear.protolayout.modifiers.LayoutModifier, optional androidx.wear.protolayout.ModifiersBuilders.FadeInTransition? fadeIn, optional androidx.wear.protolayout.ModifiersBuilders.SlideInTransition? slideIn);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.modifiers.LayoutModifier exitTransition(androidx.wear.protolayout.modifiers.LayoutModifier, androidx.wear.protolayout.ModifiersBuilders.ExitTransition transition);
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.modifiers.LayoutModifier exitTransition(androidx.wear.protolayout.modifiers.LayoutModifier, optional androidx.wear.protolayout.ModifiersBuilders.FadeOutTransition? fadeOut, optional androidx.wear.protolayout.ModifiersBuilders.SlideOutTransition? slideOut);
-  }
-
-  public final class VisibilityKt {
-    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=300) public static androidx.wear.protolayout.modifiers.LayoutModifier visibility(androidx.wear.protolayout.modifiers.LayoutModifier, boolean staticVisibility, optional androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool? dynamicVisibility);
-  }
-
-}
-
-package androidx.wear.protolayout.types {
-
-  public final class LayoutColor {
-    ctor public LayoutColor(@ColorInt int staticArgb, optional @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor? dynamicArgb);
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor? getDynamicArgb();
-    method public int getStaticArgb();
-    property @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor? dynamicArgb;
-    property @ColorInt public int staticArgb;
-  }
-
-  public final class LayoutColorUtil {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.types.LayoutColor createLayoutColor(androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor, @ColorInt int staticArgb);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.types.LayoutColor createLayoutColor(androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor, @ColorInt long staticArgb);
-    method public static androidx.wear.protolayout.types.LayoutColor createLayoutColor(int);
-    method public static androidx.wear.protolayout.types.LayoutColor createLayoutColor(long);
-    property public static androidx.wear.protolayout.types.LayoutColor int.argb;
-    property public static androidx.wear.protolayout.types.LayoutColor long.argb;
-  }
-
-  public final class LayoutString {
-    ctor public LayoutString(String staticValue);
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public LayoutString(String staticValue, androidx.wear.protolayout.expression.DynamicBuilders.DynamicString dynamicValue, androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint layoutConstraint);
-    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicString? getDynamicValue();
-    method public androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint? getLayoutConstraint();
-    method public String getStaticValue();
-    property public androidx.wear.protolayout.expression.DynamicBuilders.DynamicString? dynamicValue;
-    property public androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint? layoutConstraint;
-    property public String staticValue;
-  }
-
-  public final class LayoutStringUtil {
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint asLayoutConstraint(String, optional int alignment);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.types.LayoutString createLayoutString(androidx.wear.protolayout.expression.DynamicBuilders.DynamicString, String staticValue, androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint layoutConstraint);
-    method public static androidx.wear.protolayout.types.LayoutString createLayoutString(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint stringLayoutConstraint(String longestPattern);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public static androidx.wear.protolayout.TypeBuilders.StringLayoutConstraint stringLayoutConstraint(String longestPattern, optional int alignment);
-    property public static androidx.wear.protolayout.types.LayoutString String.layoutString;
-  }
-
-}
-
diff --git a/wear/tiles/tiles-material/api/1.5.0-beta01.txt b/wear/tiles/tiles-material/api/1.5.0-beta01.txt
deleted file mode 100644
index 85c110b..0000000
--- a/wear/tiles/tiles-material/api/1.5.0-beta01.txt
+++ /dev/null
@@ -1,298 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.tiles.material {
-
-  @Deprecated public class Button implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.Button? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.ButtonColors getButtonColors();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable();
-    method @Deprecated public CharSequence? getContentDescription();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getCustomContent();
-    method @Deprecated public String? getIconContent();
-    method @Deprecated public String? getImageContent();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension getSize();
-    method @Deprecated public String? getTextContent();
-  }
-
-  @Deprecated public static final class Button.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public Button.Builder(android.content.Context, androidx.wear.tiles.ModifiersBuilders.Clickable);
-    method @Deprecated public androidx.wear.tiles.material.Button build();
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setButtonColors(androidx.wear.tiles.material.ButtonColors);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setContentDescription(CharSequence);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setCustomContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setIconContent(String);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setIconContent(String, androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setImageContent(String);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setSize(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setSize(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setTextContent(String);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setTextContent(String, int);
-  }
-
-  @Deprecated public class ButtonColors {
-    ctor @Deprecated public ButtonColors(androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp);
-    ctor @Deprecated public ButtonColors(@ColorInt int, @ColorInt int);
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getBackgroundColor();
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getContentColor();
-    method @Deprecated public static androidx.wear.tiles.material.ButtonColors primaryButtonColors(androidx.wear.tiles.material.Colors);
-    method @Deprecated public static androidx.wear.tiles.material.ButtonColors secondaryButtonColors(androidx.wear.tiles.material.Colors);
-  }
-
-  @Deprecated public class ButtonDefaults {
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.DpProp recommendedIconSize(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.DpProp recommendedIconSize(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    field @Deprecated public static final androidx.wear.tiles.DimensionBuilders.DpProp DEFAULT_SIZE;
-    field @Deprecated public static final androidx.wear.tiles.DimensionBuilders.DpProp EXTRA_LARGE_SIZE;
-    field @Deprecated public static final androidx.wear.tiles.DimensionBuilders.DpProp LARGE_SIZE;
-    field @Deprecated public static final androidx.wear.tiles.material.ButtonColors PRIMARY_COLORS;
-    field @Deprecated public static final androidx.wear.tiles.material.ButtonColors SECONDARY_COLORS;
-  }
-
-  @Deprecated public class Chip implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.Chip? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.ChipColors getChipColors();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable();
-    method @Deprecated public CharSequence? getContentDescription();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getCustomContent();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension getHeight();
-    method @Deprecated public int getHorizontalAlignment();
-    method @Deprecated public String? getIconContent();
-    method @Deprecated public String? getPrimaryLabelContent();
-    method @Deprecated public String? getSecondaryLabelContent();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension getWidth();
-  }
-
-  @Deprecated public static final class Chip.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public Chip.Builder(android.content.Context, androidx.wear.tiles.ModifiersBuilders.Clickable, androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.material.Chip build();
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setChipColors(androidx.wear.tiles.material.ChipColors);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setContentDescription(CharSequence);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setCustomContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setHorizontalAlignment(int);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setIconContent(String);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setPrimaryLabelContent(String);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setSecondaryLabelContent(String);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setWidth(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @Deprecated public class ChipColors {
-    ctor @Deprecated public ChipColors(androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp);
-    ctor @Deprecated public ChipColors(androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp);
-    ctor @Deprecated public ChipColors(@ColorInt int, @ColorInt int);
-    ctor @Deprecated public ChipColors(@ColorInt int, @ColorInt int, @ColorInt int, @ColorInt int);
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getBackgroundColor();
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getContentColor();
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getIconColor();
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getSecondaryContentColor();
-    method @Deprecated public static androidx.wear.tiles.material.ChipColors primaryChipColors(androidx.wear.tiles.material.Colors);
-    method @Deprecated public static androidx.wear.tiles.material.ChipColors secondaryChipColors(androidx.wear.tiles.material.Colors);
-  }
-
-  @Deprecated public class ChipDefaults {
-    field @Deprecated public static final androidx.wear.tiles.material.ChipColors COMPACT_PRIMARY_COLORS;
-    field @Deprecated public static final androidx.wear.tiles.material.ChipColors COMPACT_SECONDARY_COLORS;
-    field @Deprecated public static final androidx.wear.tiles.material.ChipColors PRIMARY_COLORS;
-    field @Deprecated public static final androidx.wear.tiles.material.ChipColors SECONDARY_COLORS;
-    field @Deprecated public static final androidx.wear.tiles.material.ChipColors TITLE_PRIMARY_COLORS;
-    field @Deprecated public static final androidx.wear.tiles.material.ChipColors TITLE_SECONDARY_COLORS;
-  }
-
-  @Deprecated public class CircularProgressIndicator implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.CircularProgressIndicator? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.ProgressIndicatorColors getCircularProgressIndicatorColors();
-    method @Deprecated public CharSequence? getContentDescription();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp getEndAngle();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp getProgress();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp getStartAngle();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp getStrokeWidth();
-  }
-
-  @Deprecated public static final class CircularProgressIndicator.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public CircularProgressIndicator.Builder();
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator build();
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator.Builder setCircularProgressIndicatorColors(androidx.wear.tiles.material.ProgressIndicatorColors);
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator.Builder setContentDescription(CharSequence);
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator.Builder setEndAngle(float);
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator.Builder setProgress(@FloatRange(from=0, to=1) float);
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator.Builder setStartAngle(float);
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator.Builder setStrokeWidth(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator.Builder setStrokeWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @Deprecated public class Colors {
-    ctor @Deprecated public Colors(@ColorInt int, @ColorInt int, @ColorInt int, @ColorInt int);
-    method @Deprecated @ColorInt public int getOnPrimary();
-    method @Deprecated @ColorInt public int getOnSurface();
-    method @Deprecated @ColorInt public int getPrimary();
-    method @Deprecated @ColorInt public int getSurface();
-    field @Deprecated public static final androidx.wear.tiles.material.Colors DEFAULT;
-  }
-
-  @Deprecated public class CompactChip implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.CompactChip? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.ChipColors getChipColors();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable();
-    method @Deprecated public String getText();
-  }
-
-  @Deprecated public static final class CompactChip.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public CompactChip.Builder(android.content.Context, String, androidx.wear.tiles.ModifiersBuilders.Clickable, androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.material.CompactChip build();
-    method @Deprecated public androidx.wear.tiles.material.CompactChip.Builder setChipColors(androidx.wear.tiles.material.ChipColors);
-  }
-
-  @Deprecated public class ProgressIndicatorColors {
-    ctor @Deprecated public ProgressIndicatorColors(androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp);
-    ctor @Deprecated public ProgressIndicatorColors(@ColorInt int, @ColorInt int);
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getIndicatorColor();
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getTrackColor();
-    method @Deprecated public static androidx.wear.tiles.material.ProgressIndicatorColors progressIndicatorColors(androidx.wear.tiles.material.Colors);
-  }
-
-  @Deprecated public class ProgressIndicatorDefaults {
-    field @Deprecated public static final androidx.wear.tiles.material.ProgressIndicatorColors DEFAULT_COLORS;
-    field @Deprecated public static final androidx.wear.tiles.DimensionBuilders.DpProp DEFAULT_STROKE_WIDTH;
-    field @Deprecated public static final float GAP_END_ANGLE = 156.1f;
-    field @Deprecated public static final float GAP_START_ANGLE = -156.1f;
-  }
-
-  @Deprecated public class Text implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.Text? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getColor();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle getFontStyle();
-    method @Deprecated public float getLineHeight();
-    method @Deprecated public int getMaxLines();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers getModifiers();
-    method @Deprecated public int getMultilineAlignment();
-    method @Deprecated public int getOverflow();
-    method @Deprecated public String getText();
-    method @Deprecated public int getWeight();
-    method @Deprecated public boolean isItalic();
-    method @Deprecated public boolean isUnderline();
-  }
-
-  @Deprecated public static final class Text.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public Text.Builder(android.content.Context, String);
-    method @Deprecated public androidx.wear.tiles.material.Text build();
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setColor(androidx.wear.tiles.ColorBuilders.ColorProp);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setItalic(boolean);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setMaxLines(@IntRange(from=1) int);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setMultilineAlignment(int);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setOverflow(int);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setTypography(int);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setUnderline(boolean);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setWeight(int);
-  }
-
-  @Deprecated public class TitleChip implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.TitleChip? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.ChipColors getChipColors();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable();
-    method @Deprecated public int getHorizontalAlignment();
-    method @Deprecated public String getText();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension getWidth();
-  }
-
-  @Deprecated public static final class TitleChip.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public TitleChip.Builder(android.content.Context, String, androidx.wear.tiles.ModifiersBuilders.Clickable, androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.material.TitleChip build();
-    method @Deprecated public androidx.wear.tiles.material.TitleChip.Builder setChipColors(androidx.wear.tiles.material.ChipColors);
-    method @Deprecated public androidx.wear.tiles.material.TitleChip.Builder setHorizontalAlignment(int);
-    method @Deprecated public androidx.wear.tiles.material.TitleChip.Builder setWidth(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-    method @Deprecated public androidx.wear.tiles.material.TitleChip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @Deprecated public class Typography {
-    field @Deprecated public static final int TYPOGRAPHY_BODY1 = 7; // 0x7
-    field @Deprecated public static final int TYPOGRAPHY_BODY2 = 8; // 0x8
-    field @Deprecated public static final int TYPOGRAPHY_BUTTON = 9; // 0x9
-    field @Deprecated public static final int TYPOGRAPHY_CAPTION1 = 10; // 0xa
-    field @Deprecated public static final int TYPOGRAPHY_CAPTION2 = 11; // 0xb
-    field @Deprecated public static final int TYPOGRAPHY_CAPTION3 = 12; // 0xc
-    field @Deprecated public static final int TYPOGRAPHY_DISPLAY1 = 1; // 0x1
-    field @Deprecated public static final int TYPOGRAPHY_DISPLAY2 = 2; // 0x2
-    field @Deprecated public static final int TYPOGRAPHY_DISPLAY3 = 3; // 0x3
-    field @Deprecated public static final int TYPOGRAPHY_TITLE1 = 4; // 0x4
-    field @Deprecated public static final int TYPOGRAPHY_TITLE2 = 5; // 0x5
-    field @Deprecated public static final int TYPOGRAPHY_TITLE3 = 6; // 0x6
-  }
-
-}
-
-package androidx.wear.tiles.material.layouts {
-
-  @Deprecated public class EdgeContentLayout implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.layouts.EdgeContentLayout? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getContent();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getEdgeContent();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getPrimaryLabelTextContent();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getSecondaryLabelTextContent();
-  }
-
-  @Deprecated public static final class EdgeContentLayout.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public EdgeContentLayout.Builder(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.material.layouts.EdgeContentLayout build();
-    method @Deprecated public androidx.wear.tiles.material.layouts.EdgeContentLayout.Builder setContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.EdgeContentLayout.Builder setEdgeContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.EdgeContentLayout.Builder setPrimaryLabelTextContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.EdgeContentLayout.Builder setSecondaryLabelTextContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-  }
-
-  @Deprecated public class LayoutDefaults {
-    field @Deprecated public static final androidx.wear.tiles.DimensionBuilders.DpProp DEFAULT_VERTICAL_SPACER_HEIGHT;
-    field @Deprecated public static final float EDGE_CONTENT_LAYOUT_PADDING_ABOVE_MAIN_CONTENT_DP = 6.0f;
-    field @Deprecated public static final float EDGE_CONTENT_LAYOUT_PADDING_BELOW_MAIN_CONTENT_DP = 8.0f;
-    field @Deprecated public static final int MULTI_BUTTON_MAX_NUMBER = 7; // 0x7
-    field @Deprecated public static final androidx.wear.tiles.DimensionBuilders.DpProp MULTI_SLOT_LAYOUT_HORIZONTAL_SPACER_WIDTH;
-  }
-
-  @Deprecated public class MultiButtonLayout implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.layouts.MultiButtonLayout? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public java.util.List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement!> getButtonContents();
-    method @Deprecated public int getFiveButtonDistribution();
-    field @Deprecated public static final int FIVE_BUTTON_DISTRIBUTION_BOTTOM_HEAVY = 2; // 0x2
-    field @Deprecated public static final int FIVE_BUTTON_DISTRIBUTION_TOP_HEAVY = 1; // 0x1
-  }
-
-  @Deprecated public static final class MultiButtonLayout.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public MultiButtonLayout.Builder();
-    method @Deprecated public androidx.wear.tiles.material.layouts.MultiButtonLayout.Builder addButtonContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.MultiButtonLayout build();
-    method @Deprecated public androidx.wear.tiles.material.layouts.MultiButtonLayout.Builder setFiveButtonDistribution(int);
-  }
-
-  @Deprecated public class MultiSlotLayout implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.layouts.MultiSlotLayout? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.DP) public float getHorizontalSpacerWidth();
-    method @Deprecated public java.util.List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement!> getSlotContents();
-  }
-
-  @Deprecated public static final class MultiSlotLayout.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public MultiSlotLayout.Builder();
-    method @Deprecated public androidx.wear.tiles.material.layouts.MultiSlotLayout.Builder addSlotContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.MultiSlotLayout build();
-    method @Deprecated public androidx.wear.tiles.material.layouts.MultiSlotLayout.Builder setHorizontalSpacerWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @Deprecated public class PrimaryLayout implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.layouts.PrimaryLayout? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getContent();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getPrimaryChipContent();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getPrimaryLabelTextContent();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getSecondaryLabelTextContent();
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.DP) public float getVerticalSpacerHeight();
-  }
-
-  @Deprecated public static final class PrimaryLayout.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public PrimaryLayout.Builder(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.material.layouts.PrimaryLayout build();
-    method @Deprecated public androidx.wear.tiles.material.layouts.PrimaryLayout.Builder setContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.PrimaryLayout.Builder setPrimaryChipContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.PrimaryLayout.Builder setPrimaryLabelTextContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.PrimaryLayout.Builder setSecondaryLabelTextContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.PrimaryLayout.Builder setVerticalSpacerHeight(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-}
-
diff --git a/wear/tiles/tiles-material/api/res-1.5.0-beta01.txt b/wear/tiles/tiles-material/api/res-1.5.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/wear/tiles/tiles-material/api/res-1.5.0-beta01.txt
+++ /dev/null
diff --git a/wear/tiles/tiles-material/api/restricted_1.5.0-beta01.txt b/wear/tiles/tiles-material/api/restricted_1.5.0-beta01.txt
deleted file mode 100644
index 85c110b..0000000
--- a/wear/tiles/tiles-material/api/restricted_1.5.0-beta01.txt
+++ /dev/null
@@ -1,298 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.tiles.material {
-
-  @Deprecated public class Button implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.Button? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.ButtonColors getButtonColors();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable();
-    method @Deprecated public CharSequence? getContentDescription();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getCustomContent();
-    method @Deprecated public String? getIconContent();
-    method @Deprecated public String? getImageContent();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension getSize();
-    method @Deprecated public String? getTextContent();
-  }
-
-  @Deprecated public static final class Button.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public Button.Builder(android.content.Context, androidx.wear.tiles.ModifiersBuilders.Clickable);
-    method @Deprecated public androidx.wear.tiles.material.Button build();
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setButtonColors(androidx.wear.tiles.material.ButtonColors);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setContentDescription(CharSequence);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setCustomContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setIconContent(String);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setIconContent(String, androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setImageContent(String);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setSize(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setSize(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setTextContent(String);
-    method @Deprecated public androidx.wear.tiles.material.Button.Builder setTextContent(String, int);
-  }
-
-  @Deprecated public class ButtonColors {
-    ctor @Deprecated public ButtonColors(androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp);
-    ctor @Deprecated public ButtonColors(@ColorInt int, @ColorInt int);
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getBackgroundColor();
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getContentColor();
-    method @Deprecated public static androidx.wear.tiles.material.ButtonColors primaryButtonColors(androidx.wear.tiles.material.Colors);
-    method @Deprecated public static androidx.wear.tiles.material.ButtonColors secondaryButtonColors(androidx.wear.tiles.material.Colors);
-  }
-
-  @Deprecated public class ButtonDefaults {
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.DpProp recommendedIconSize(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.DpProp recommendedIconSize(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    field @Deprecated public static final androidx.wear.tiles.DimensionBuilders.DpProp DEFAULT_SIZE;
-    field @Deprecated public static final androidx.wear.tiles.DimensionBuilders.DpProp EXTRA_LARGE_SIZE;
-    field @Deprecated public static final androidx.wear.tiles.DimensionBuilders.DpProp LARGE_SIZE;
-    field @Deprecated public static final androidx.wear.tiles.material.ButtonColors PRIMARY_COLORS;
-    field @Deprecated public static final androidx.wear.tiles.material.ButtonColors SECONDARY_COLORS;
-  }
-
-  @Deprecated public class Chip implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.Chip? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.ChipColors getChipColors();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable();
-    method @Deprecated public CharSequence? getContentDescription();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getCustomContent();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension getHeight();
-    method @Deprecated public int getHorizontalAlignment();
-    method @Deprecated public String? getIconContent();
-    method @Deprecated public String? getPrimaryLabelContent();
-    method @Deprecated public String? getSecondaryLabelContent();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension getWidth();
-  }
-
-  @Deprecated public static final class Chip.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public Chip.Builder(android.content.Context, androidx.wear.tiles.ModifiersBuilders.Clickable, androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.material.Chip build();
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setChipColors(androidx.wear.tiles.material.ChipColors);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setContentDescription(CharSequence);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setCustomContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setHorizontalAlignment(int);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setIconContent(String);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setPrimaryLabelContent(String);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setSecondaryLabelContent(String);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setWidth(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-    method @Deprecated public androidx.wear.tiles.material.Chip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @Deprecated public class ChipColors {
-    ctor @Deprecated public ChipColors(androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp);
-    ctor @Deprecated public ChipColors(androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp);
-    ctor @Deprecated public ChipColors(@ColorInt int, @ColorInt int);
-    ctor @Deprecated public ChipColors(@ColorInt int, @ColorInt int, @ColorInt int, @ColorInt int);
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getBackgroundColor();
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getContentColor();
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getIconColor();
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getSecondaryContentColor();
-    method @Deprecated public static androidx.wear.tiles.material.ChipColors primaryChipColors(androidx.wear.tiles.material.Colors);
-    method @Deprecated public static androidx.wear.tiles.material.ChipColors secondaryChipColors(androidx.wear.tiles.material.Colors);
-  }
-
-  @Deprecated public class ChipDefaults {
-    field @Deprecated public static final androidx.wear.tiles.material.ChipColors COMPACT_PRIMARY_COLORS;
-    field @Deprecated public static final androidx.wear.tiles.material.ChipColors COMPACT_SECONDARY_COLORS;
-    field @Deprecated public static final androidx.wear.tiles.material.ChipColors PRIMARY_COLORS;
-    field @Deprecated public static final androidx.wear.tiles.material.ChipColors SECONDARY_COLORS;
-    field @Deprecated public static final androidx.wear.tiles.material.ChipColors TITLE_PRIMARY_COLORS;
-    field @Deprecated public static final androidx.wear.tiles.material.ChipColors TITLE_SECONDARY_COLORS;
-  }
-
-  @Deprecated public class CircularProgressIndicator implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.CircularProgressIndicator? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.ProgressIndicatorColors getCircularProgressIndicatorColors();
-    method @Deprecated public CharSequence? getContentDescription();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp getEndAngle();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp getProgress();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp getStartAngle();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp getStrokeWidth();
-  }
-
-  @Deprecated public static final class CircularProgressIndicator.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public CircularProgressIndicator.Builder();
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator build();
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator.Builder setCircularProgressIndicatorColors(androidx.wear.tiles.material.ProgressIndicatorColors);
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator.Builder setContentDescription(CharSequence);
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator.Builder setEndAngle(float);
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator.Builder setProgress(@FloatRange(from=0, to=1) float);
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator.Builder setStartAngle(float);
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator.Builder setStrokeWidth(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.material.CircularProgressIndicator.Builder setStrokeWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @Deprecated public class Colors {
-    ctor @Deprecated public Colors(@ColorInt int, @ColorInt int, @ColorInt int, @ColorInt int);
-    method @Deprecated @ColorInt public int getOnPrimary();
-    method @Deprecated @ColorInt public int getOnSurface();
-    method @Deprecated @ColorInt public int getPrimary();
-    method @Deprecated @ColorInt public int getSurface();
-    field @Deprecated public static final androidx.wear.tiles.material.Colors DEFAULT;
-  }
-
-  @Deprecated public class CompactChip implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.CompactChip? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.ChipColors getChipColors();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable();
-    method @Deprecated public String getText();
-  }
-
-  @Deprecated public static final class CompactChip.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public CompactChip.Builder(android.content.Context, String, androidx.wear.tiles.ModifiersBuilders.Clickable, androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.material.CompactChip build();
-    method @Deprecated public androidx.wear.tiles.material.CompactChip.Builder setChipColors(androidx.wear.tiles.material.ChipColors);
-  }
-
-  @Deprecated public class ProgressIndicatorColors {
-    ctor @Deprecated public ProgressIndicatorColors(androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp);
-    ctor @Deprecated public ProgressIndicatorColors(@ColorInt int, @ColorInt int);
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getIndicatorColor();
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getTrackColor();
-    method @Deprecated public static androidx.wear.tiles.material.ProgressIndicatorColors progressIndicatorColors(androidx.wear.tiles.material.Colors);
-  }
-
-  @Deprecated public class ProgressIndicatorDefaults {
-    field @Deprecated public static final androidx.wear.tiles.material.ProgressIndicatorColors DEFAULT_COLORS;
-    field @Deprecated public static final androidx.wear.tiles.DimensionBuilders.DpProp DEFAULT_STROKE_WIDTH;
-    field @Deprecated public static final float GAP_END_ANGLE = 156.1f;
-    field @Deprecated public static final float GAP_START_ANGLE = -156.1f;
-  }
-
-  @Deprecated public class Text implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.Text? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp getColor();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle getFontStyle();
-    method @Deprecated public float getLineHeight();
-    method @Deprecated public int getMaxLines();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers getModifiers();
-    method @Deprecated public int getMultilineAlignment();
-    method @Deprecated public int getOverflow();
-    method @Deprecated public String getText();
-    method @Deprecated public int getWeight();
-    method @Deprecated public boolean isItalic();
-    method @Deprecated public boolean isUnderline();
-  }
-
-  @Deprecated public static final class Text.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public Text.Builder(android.content.Context, String);
-    method @Deprecated public androidx.wear.tiles.material.Text build();
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setColor(androidx.wear.tiles.ColorBuilders.ColorProp);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setItalic(boolean);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setMaxLines(@IntRange(from=1) int);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setMultilineAlignment(int);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setOverflow(int);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setTypography(int);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setUnderline(boolean);
-    method @Deprecated public androidx.wear.tiles.material.Text.Builder setWeight(int);
-  }
-
-  @Deprecated public class TitleChip implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.TitleChip? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.ChipColors getChipColors();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable();
-    method @Deprecated public int getHorizontalAlignment();
-    method @Deprecated public String getText();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension getWidth();
-  }
-
-  @Deprecated public static final class TitleChip.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public TitleChip.Builder(android.content.Context, String, androidx.wear.tiles.ModifiersBuilders.Clickable, androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.material.TitleChip build();
-    method @Deprecated public androidx.wear.tiles.material.TitleChip.Builder setChipColors(androidx.wear.tiles.material.ChipColors);
-    method @Deprecated public androidx.wear.tiles.material.TitleChip.Builder setHorizontalAlignment(int);
-    method @Deprecated public androidx.wear.tiles.material.TitleChip.Builder setWidth(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-    method @Deprecated public androidx.wear.tiles.material.TitleChip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @Deprecated public class Typography {
-    field @Deprecated public static final int TYPOGRAPHY_BODY1 = 7; // 0x7
-    field @Deprecated public static final int TYPOGRAPHY_BODY2 = 8; // 0x8
-    field @Deprecated public static final int TYPOGRAPHY_BUTTON = 9; // 0x9
-    field @Deprecated public static final int TYPOGRAPHY_CAPTION1 = 10; // 0xa
-    field @Deprecated public static final int TYPOGRAPHY_CAPTION2 = 11; // 0xb
-    field @Deprecated public static final int TYPOGRAPHY_CAPTION3 = 12; // 0xc
-    field @Deprecated public static final int TYPOGRAPHY_DISPLAY1 = 1; // 0x1
-    field @Deprecated public static final int TYPOGRAPHY_DISPLAY2 = 2; // 0x2
-    field @Deprecated public static final int TYPOGRAPHY_DISPLAY3 = 3; // 0x3
-    field @Deprecated public static final int TYPOGRAPHY_TITLE1 = 4; // 0x4
-    field @Deprecated public static final int TYPOGRAPHY_TITLE2 = 5; // 0x5
-    field @Deprecated public static final int TYPOGRAPHY_TITLE3 = 6; // 0x6
-  }
-
-}
-
-package androidx.wear.tiles.material.layouts {
-
-  @Deprecated public class EdgeContentLayout implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.layouts.EdgeContentLayout? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getContent();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getEdgeContent();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getPrimaryLabelTextContent();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getSecondaryLabelTextContent();
-  }
-
-  @Deprecated public static final class EdgeContentLayout.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public EdgeContentLayout.Builder(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.material.layouts.EdgeContentLayout build();
-    method @Deprecated public androidx.wear.tiles.material.layouts.EdgeContentLayout.Builder setContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.EdgeContentLayout.Builder setEdgeContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.EdgeContentLayout.Builder setPrimaryLabelTextContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.EdgeContentLayout.Builder setSecondaryLabelTextContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-  }
-
-  @Deprecated public class LayoutDefaults {
-    field @Deprecated public static final androidx.wear.tiles.DimensionBuilders.DpProp DEFAULT_VERTICAL_SPACER_HEIGHT;
-    field @Deprecated public static final float EDGE_CONTENT_LAYOUT_PADDING_ABOVE_MAIN_CONTENT_DP = 6.0f;
-    field @Deprecated public static final float EDGE_CONTENT_LAYOUT_PADDING_BELOW_MAIN_CONTENT_DP = 8.0f;
-    field @Deprecated public static final int MULTI_BUTTON_MAX_NUMBER = 7; // 0x7
-    field @Deprecated public static final androidx.wear.tiles.DimensionBuilders.DpProp MULTI_SLOT_LAYOUT_HORIZONTAL_SPACER_WIDTH;
-  }
-
-  @Deprecated public class MultiButtonLayout implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.layouts.MultiButtonLayout? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public java.util.List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement!> getButtonContents();
-    method @Deprecated public int getFiveButtonDistribution();
-    field @Deprecated public static final int FIVE_BUTTON_DISTRIBUTION_BOTTOM_HEAVY = 2; // 0x2
-    field @Deprecated public static final int FIVE_BUTTON_DISTRIBUTION_TOP_HEAVY = 1; // 0x1
-  }
-
-  @Deprecated public static final class MultiButtonLayout.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public MultiButtonLayout.Builder();
-    method @Deprecated public androidx.wear.tiles.material.layouts.MultiButtonLayout.Builder addButtonContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.MultiButtonLayout build();
-    method @Deprecated public androidx.wear.tiles.material.layouts.MultiButtonLayout.Builder setFiveButtonDistribution(int);
-  }
-
-  @Deprecated public class MultiSlotLayout implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.layouts.MultiSlotLayout? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.DP) public float getHorizontalSpacerWidth();
-    method @Deprecated public java.util.List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement!> getSlotContents();
-  }
-
-  @Deprecated public static final class MultiSlotLayout.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public MultiSlotLayout.Builder();
-    method @Deprecated public androidx.wear.tiles.material.layouts.MultiSlotLayout.Builder addSlotContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.MultiSlotLayout build();
-    method @Deprecated public androidx.wear.tiles.material.layouts.MultiSlotLayout.Builder setHorizontalSpacerWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @Deprecated public class PrimaryLayout implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public static androidx.wear.tiles.material.layouts.PrimaryLayout? fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getContent();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getPrimaryChipContent();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getPrimaryLabelTextContent();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getSecondaryLabelTextContent();
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.DP) public float getVerticalSpacerHeight();
-  }
-
-  @Deprecated public static final class PrimaryLayout.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public PrimaryLayout.Builder(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.material.layouts.PrimaryLayout build();
-    method @Deprecated public androidx.wear.tiles.material.layouts.PrimaryLayout.Builder setContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.PrimaryLayout.Builder setPrimaryChipContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.PrimaryLayout.Builder setPrimaryLabelTextContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.PrimaryLayout.Builder setSecondaryLabelTextContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.material.layouts.PrimaryLayout.Builder setVerticalSpacerHeight(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-}
-
diff --git a/wear/tiles/tiles-renderer/api/1.5.0-beta01.txt b/wear/tiles/tiles-renderer/api/1.5.0-beta01.txt
deleted file mode 100644
index ac732cf..0000000
--- a/wear/tiles/tiles-renderer/api/1.5.0-beta01.txt
+++ /dev/null
@@ -1,105 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.tiles.client {
-
-  public interface TileClient {
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> requestApiVersion();
-    method @Deprecated public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources!> requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile!> requestTile(androidx.wear.tiles.RequestBuilders.TileRequest);
-    method public default com.google.common.util.concurrent.ListenableFuture<androidx.wear.protolayout.ResourceBuilders.Resources!> requestTileResourcesAsync(androidx.wear.tiles.RequestBuilders.ResourcesRequest);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> sendOnTileAddedEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> sendOnTileEnterEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> sendOnTileLeaveEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> sendOnTileRemovedEvent();
-  }
-
-}
-
-package androidx.wear.tiles.connection {
-
-  public final class DefaultTileClient implements androidx.wear.tiles.client.TileClient {
-    ctor public DefaultTileClient(android.content.Context context, android.content.ComponentName componentName, java.util.concurrent.Executor executor);
-    ctor public DefaultTileClient(android.content.Context context, android.content.ComponentName componentName, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer> requestApiVersion();
-    method @Deprecated public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest requestParams);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile> requestTile(androidx.wear.tiles.RequestBuilders.TileRequest requestParams);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileAddedEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileEnterEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileLeaveEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileRemovedEvent();
-  }
-
-}
-
-package androidx.wear.tiles.manager {
-
-  public final class TileUiClient implements java.lang.AutoCloseable {
-    ctor public TileUiClient(android.content.Context context, android.content.ComponentName component, android.view.ViewGroup parentView);
-    method @MainThread public void close();
-    method @MainThread public void connect();
-  }
-
-}
-
-package androidx.wear.tiles.renderer {
-
-  public final class TileRenderer {
-    ctor @Deprecated public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
-    ctor @Deprecated public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, @StyleRes int, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
-    ctor public TileRenderer(android.content.Context, java.util.concurrent.Executor, java.util.function.Consumer<androidx.wear.protolayout.StateBuilders.State!>);
-    method public java.util.concurrent.Executor getLoadActionExecutor();
-    method public java.util.function.Consumer<androidx.wear.protolayout.StateBuilders.State!> getLoadActionListener();
-    method public java.util.Map<androidx.wear.protolayout.expression.pipeline.PlatformDataProvider!,java.util.Set<androidx.wear.protolayout.expression.PlatformDataKey<? extends java.lang.Object!>!>!> getPlatformDataProviders();
-    method public int getTilesTheme();
-    method public android.content.Context getUiContext();
-    method @Deprecated public android.view.View? inflate(android.view.ViewGroup);
-    method public com.google.common.util.concurrent.ListenableFuture<android.view.View!> inflateAsync(androidx.wear.protolayout.LayoutElementBuilders.Layout, androidx.wear.protolayout.ResourceBuilders.Resources, android.view.ViewGroup);
-    method public void setState(java.util.Map<androidx.wear.protolayout.expression.AppDataKey<? extends java.lang.Object!>!,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends java.lang.Object!>!>);
-  }
-
-  public static final class TileRenderer.Builder {
-    ctor public TileRenderer.Builder(android.content.Context, java.util.concurrent.Executor, java.util.function.Consumer<androidx.wear.protolayout.StateBuilders.State!>);
-    method public androidx.wear.tiles.renderer.TileRenderer.Builder addPlatformDataProvider(androidx.wear.protolayout.expression.pipeline.PlatformDataProvider, androidx.wear.protolayout.expression.PlatformDataKey<? extends java.lang.Object!>!...);
-    method public androidx.wear.tiles.renderer.TileRenderer build();
-    method public androidx.wear.tiles.renderer.TileRenderer.Builder setTilesTheme(@StyleRes int);
-  }
-
-  @Deprecated public static interface TileRenderer.LoadActionListener {
-    method @Deprecated public void onClick(androidx.wear.tiles.StateBuilders.State);
-  }
-
-}
-
-package androidx.wear.tiles.timeline {
-
-  public final class TilesTimelineCache {
-    ctor public TilesTimelineCache(androidx.wear.protolayout.TimelineBuilders.Timeline);
-    ctor @Deprecated public TilesTimelineCache(androidx.wear.tiles.TimelineBuilders.Timeline);
-    method @MainThread public androidx.wear.protolayout.TimelineBuilders.TimelineEntry? findClosestTileTimelineEntry(long);
-    method @Deprecated @MainThread public androidx.wear.tiles.TimelineBuilders.TimelineEntry? findClosestTimelineEntry(long);
-    method @MainThread public long findCurrentTimelineEntryExpiry(androidx.wear.protolayout.TimelineBuilders.TimelineEntry, long);
-    method @Deprecated @MainThread public long findCurrentTimelineEntryExpiry(androidx.wear.tiles.TimelineBuilders.TimelineEntry, long);
-    method @MainThread public androidx.wear.protolayout.TimelineBuilders.TimelineEntry? findTileTimelineEntryForTime(long);
-    method @Deprecated @MainThread public androidx.wear.tiles.TimelineBuilders.TimelineEntry? findTimelineEntryForTime(long);
-  }
-
-  public class TilesTimelineManager implements java.lang.AutoCloseable {
-    ctor public TilesTimelineManager(android.app.AlarmManager, androidx.wear.tiles.timeline.TilesTimelineManager.Clock, androidx.wear.protolayout.TimelineBuilders.Timeline, int, java.util.concurrent.Executor, androidx.wear.tiles.timeline.TilesTimelineManager.LayoutUpdateListener);
-    ctor @Deprecated public TilesTimelineManager(android.app.AlarmManager, androidx.wear.tiles.timeline.TilesTimelineManager.Clock, androidx.wear.tiles.TimelineBuilders.Timeline, int, java.util.concurrent.Executor, androidx.wear.tiles.timeline.TilesTimelineManager.Listener);
-    method public void close();
-    method public void init();
-  }
-
-  public static interface TilesTimelineManager.Clock {
-    method public long getCurrentTimeMillis();
-  }
-
-  public static interface TilesTimelineManager.LayoutUpdateListener {
-    method public void onLayoutUpdate(int, androidx.wear.protolayout.LayoutElementBuilders.Layout);
-  }
-
-  @Deprecated public static interface TilesTimelineManager.Listener {
-    method @Deprecated public void onLayoutUpdate(int, androidx.wear.tiles.LayoutElementBuilders.Layout);
-  }
-
-}
-
diff --git a/wear/tiles/tiles-renderer/api/res-1.5.0-beta01.txt b/wear/tiles/tiles-renderer/api/res-1.5.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/wear/tiles/tiles-renderer/api/res-1.5.0-beta01.txt
+++ /dev/null
diff --git a/wear/tiles/tiles-renderer/api/restricted_1.5.0-beta01.txt b/wear/tiles/tiles-renderer/api/restricted_1.5.0-beta01.txt
deleted file mode 100644
index 6ebda68..0000000
--- a/wear/tiles/tiles-renderer/api/restricted_1.5.0-beta01.txt
+++ /dev/null
@@ -1,106 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.tiles.client {
-
-  public interface TileClient {
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> requestApiVersion();
-    method @Deprecated public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources!> requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile!> requestTile(androidx.wear.tiles.RequestBuilders.TileRequest);
-    method public default com.google.common.util.concurrent.ListenableFuture<androidx.wear.protolayout.ResourceBuilders.Resources!> requestTileResourcesAsync(androidx.wear.tiles.RequestBuilders.ResourcesRequest);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> sendOnTileAddedEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> sendOnTileEnterEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> sendOnTileLeaveEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> sendOnTileRemovedEvent();
-  }
-
-}
-
-package androidx.wear.tiles.connection {
-
-  public final class DefaultTileClient implements androidx.wear.tiles.client.TileClient {
-    ctor public DefaultTileClient(android.content.Context context, android.content.ComponentName componentName, java.util.concurrent.Executor executor);
-    ctor public DefaultTileClient(android.content.Context context, android.content.ComponentName componentName, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer> requestApiVersion();
-    method @Deprecated public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest requestParams);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile> requestTile(androidx.wear.tiles.RequestBuilders.TileRequest requestParams);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileAddedEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileEnterEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileLeaveEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileRemovedEvent();
-  }
-
-}
-
-package androidx.wear.tiles.manager {
-
-  public final class TileUiClient implements java.lang.AutoCloseable {
-    ctor public TileUiClient(android.content.Context context, android.content.ComponentName component, android.view.ViewGroup parentView);
-    method @MainThread public void close();
-    method @MainThread public void connect();
-  }
-
-}
-
-package androidx.wear.tiles.renderer {
-
-  public final class TileRenderer {
-    ctor @Deprecated public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
-    ctor @Deprecated public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, @StyleRes int, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
-    ctor public TileRenderer(android.content.Context, java.util.concurrent.Executor, java.util.function.Consumer<androidx.wear.protolayout.StateBuilders.State!>);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public java.util.List<androidx.wear.protolayout.expression.pipeline.DynamicTypeAnimator!> getAnimations();
-    method public java.util.concurrent.Executor getLoadActionExecutor();
-    method public java.util.function.Consumer<androidx.wear.protolayout.StateBuilders.State!> getLoadActionListener();
-    method public java.util.Map<androidx.wear.protolayout.expression.pipeline.PlatformDataProvider!,java.util.Set<androidx.wear.protolayout.expression.PlatformDataKey<? extends java.lang.Object!>!>!> getPlatformDataProviders();
-    method public int getTilesTheme();
-    method public android.content.Context getUiContext();
-    method @Deprecated public android.view.View? inflate(android.view.ViewGroup);
-    method public com.google.common.util.concurrent.ListenableFuture<android.view.View!> inflateAsync(androidx.wear.protolayout.LayoutElementBuilders.Layout, androidx.wear.protolayout.ResourceBuilders.Resources, android.view.ViewGroup);
-    method public void setState(java.util.Map<androidx.wear.protolayout.expression.AppDataKey<? extends java.lang.Object!>!,androidx.wear.protolayout.expression.DynamicDataBuilders.DynamicDataValue<? extends java.lang.Object!>!>);
-  }
-
-  public static final class TileRenderer.Builder {
-    ctor public TileRenderer.Builder(android.content.Context, java.util.concurrent.Executor, java.util.function.Consumer<androidx.wear.protolayout.StateBuilders.State!>);
-    method public androidx.wear.tiles.renderer.TileRenderer.Builder addPlatformDataProvider(androidx.wear.protolayout.expression.pipeline.PlatformDataProvider, androidx.wear.protolayout.expression.PlatformDataKey<? extends java.lang.Object!>!...);
-    method public androidx.wear.tiles.renderer.TileRenderer build();
-    method public androidx.wear.tiles.renderer.TileRenderer.Builder setTilesTheme(@StyleRes int);
-  }
-
-  @Deprecated public static interface TileRenderer.LoadActionListener {
-    method @Deprecated public void onClick(androidx.wear.tiles.StateBuilders.State);
-  }
-
-}
-
-package androidx.wear.tiles.timeline {
-
-  public final class TilesTimelineCache {
-    ctor public TilesTimelineCache(androidx.wear.protolayout.TimelineBuilders.Timeline);
-    ctor @Deprecated public TilesTimelineCache(androidx.wear.tiles.TimelineBuilders.Timeline);
-    method @MainThread public androidx.wear.protolayout.TimelineBuilders.TimelineEntry? findClosestTileTimelineEntry(long);
-    method @Deprecated @MainThread public androidx.wear.tiles.TimelineBuilders.TimelineEntry? findClosestTimelineEntry(long);
-    method @MainThread public long findCurrentTimelineEntryExpiry(androidx.wear.protolayout.TimelineBuilders.TimelineEntry, long);
-    method @Deprecated @MainThread public long findCurrentTimelineEntryExpiry(androidx.wear.tiles.TimelineBuilders.TimelineEntry, long);
-    method @MainThread public androidx.wear.protolayout.TimelineBuilders.TimelineEntry? findTileTimelineEntryForTime(long);
-    method @Deprecated @MainThread public androidx.wear.tiles.TimelineBuilders.TimelineEntry? findTimelineEntryForTime(long);
-  }
-
-  public class TilesTimelineManager implements java.lang.AutoCloseable {
-    ctor public TilesTimelineManager(android.app.AlarmManager, androidx.wear.tiles.timeline.TilesTimelineManager.Clock, androidx.wear.protolayout.TimelineBuilders.Timeline, int, java.util.concurrent.Executor, androidx.wear.tiles.timeline.TilesTimelineManager.LayoutUpdateListener);
-    ctor @Deprecated public TilesTimelineManager(android.app.AlarmManager, androidx.wear.tiles.timeline.TilesTimelineManager.Clock, androidx.wear.tiles.TimelineBuilders.Timeline, int, java.util.concurrent.Executor, androidx.wear.tiles.timeline.TilesTimelineManager.Listener);
-    method public void close();
-    method public void init();
-  }
-
-  public static interface TilesTimelineManager.Clock {
-    method public long getCurrentTimeMillis();
-  }
-
-  public static interface TilesTimelineManager.LayoutUpdateListener {
-    method public void onLayoutUpdate(int, androidx.wear.protolayout.LayoutElementBuilders.Layout);
-  }
-
-  @Deprecated public static interface TilesTimelineManager.Listener {
-    method @Deprecated public void onLayoutUpdate(int, androidx.wear.tiles.LayoutElementBuilders.Layout);
-  }
-
-}
-
diff --git a/wear/tiles/tiles-renderer/dependencyAnalysis-baseline.json b/wear/tiles/tiles-renderer/dependencyAnalysis-baseline.json
index 9879f96..ea23dd1 100644
--- a/wear/tiles/tiles-renderer/dependencyAnalysis-baseline.json
+++ b/wear/tiles/tiles-renderer/dependencyAnalysis-baseline.json
@@ -28,14 +28,6 @@
     {
       "coordinates": {
         "type": "module",
-        "identifier": "androidx.test:monitor",
-        "resolvedVersion": "1.8.0-alpha01"
-      },
-      "toConfiguration": "androidTestImplementation"
-    },
-    {
-      "coordinates": {
-        "type": "module",
         "identifier": "androidx.test:rules",
         "resolvedVersion": "1.7.0-alpha01"
       },
diff --git a/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java b/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java
index 45544f0..5352c51 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java
+++ b/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java
@@ -100,7 +100,7 @@
                     {"image_with_inline_data", false},
                     {"image_with_padding", true},
                     {"line_in_arc", false},
-                    {"line_multi_height", true},
+                    {"line_multi_height", false},
                     {"long_text", false},
                     {"mixed_language_text", false},
                     {"multi_line_text_alignment", false},
diff --git a/wear/tiles/tiles-testing/api/1.5.0-beta01.txt b/wear/tiles/tiles-testing/api/1.5.0-beta01.txt
deleted file mode 100644
index ae007dd..0000000
--- a/wear/tiles/tiles-testing/api/1.5.0-beta01.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.tiles.testing {
-
-  public final class TestTileClient<T extends androidx.wear.tiles.TileService> implements androidx.wear.tiles.client.TileClient {
-    ctor public TestTileClient(T service, java.util.concurrent.Executor executor);
-    ctor public TestTileClient(T service, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer> requestApiVersion();
-    method @Deprecated public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest requestParams);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile> requestTile(androidx.wear.tiles.RequestBuilders.TileRequest requestParams);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileAddedEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileEnterEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileLeaveEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileRemovedEvent();
-  }
-
-}
-
diff --git a/wear/tiles/tiles-testing/api/res-1.5.0-beta01.txt b/wear/tiles/tiles-testing/api/res-1.5.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/wear/tiles/tiles-testing/api/res-1.5.0-beta01.txt
+++ /dev/null
diff --git a/wear/tiles/tiles-testing/api/restricted_1.5.0-beta01.txt b/wear/tiles/tiles-testing/api/restricted_1.5.0-beta01.txt
deleted file mode 100644
index ae007dd..0000000
--- a/wear/tiles/tiles-testing/api/restricted_1.5.0-beta01.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.tiles.testing {
-
-  public final class TestTileClient<T extends androidx.wear.tiles.TileService> implements androidx.wear.tiles.client.TileClient {
-    ctor public TestTileClient(T service, java.util.concurrent.Executor executor);
-    ctor public TestTileClient(T service, kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer> requestApiVersion();
-    method @Deprecated public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest requestParams);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile> requestTile(androidx.wear.tiles.RequestBuilders.TileRequest requestParams);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileAddedEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileEnterEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileLeaveEvent();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void?> sendOnTileRemovedEvent();
-  }
-
-}
-
diff --git a/wear/tiles/tiles-tooling-preview/api/1.5.0-beta01.txt b/wear/tiles/tiles-tooling-preview/api/1.5.0-beta01.txt
deleted file mode 100644
index 96cc2c0..0000000
--- a/wear/tiles/tiles-tooling-preview/api/1.5.0-beta01.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.tiles.tooling.preview {
-
-  @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 String device() default androidx.wear.tooling.preview.devices.WearDevices.SMALL_ROUND;
-    method public abstract float fontScale() default 1.0;
-    method public abstract String group() default "";
-    method public abstract String locale() default "";
-    method public abstract String name() default "";
-    property public abstract String device;
-    property @FloatRange(from=0.01) public abstract float fontScale;
-    property public abstract String group;
-    property public abstract String locale;
-    property public abstract String name;
-  }
-
-  @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.wear.tiles.tooling.preview.Preview[] value();
-    property public abstract String device;
-    property @FloatRange(from=0.01) public abstract float fontScale;
-    property public abstract String group;
-    property public abstract String locale;
-    property public abstract String name;
-  }
-
-  public final class TilePreviewData {
-    ctor public TilePreviewData(optional kotlin.jvm.functions.Function1<? super androidx.wear.tiles.RequestBuilders.ResourcesRequest,androidx.wear.protolayout.ResourceBuilders.Resources> onTileResourceRequest, optional androidx.wear.protolayout.expression.PlatformDataValues? platformDataValues, kotlin.jvm.functions.Function1<? super androidx.wear.tiles.RequestBuilders.TileRequest,androidx.wear.tiles.TileBuilders.Tile> onTileRequest);
-    ctor public TilePreviewData(optional kotlin.jvm.functions.Function1<? super androidx.wear.tiles.RequestBuilders.ResourcesRequest,androidx.wear.protolayout.ResourceBuilders.Resources> onTileResourceRequest, kotlin.jvm.functions.Function1<? super androidx.wear.tiles.RequestBuilders.TileRequest,androidx.wear.tiles.TileBuilders.Tile> onTileRequest);
-    ctor public TilePreviewData(kotlin.jvm.functions.Function1<? super androidx.wear.tiles.RequestBuilders.TileRequest,androidx.wear.tiles.TileBuilders.Tile> onTileRequest);
-    method public kotlin.jvm.functions.Function1<androidx.wear.tiles.RequestBuilders.TileRequest,androidx.wear.tiles.TileBuilders.Tile> getOnTileRequest();
-    method public kotlin.jvm.functions.Function1<androidx.wear.tiles.RequestBuilders.ResourcesRequest,androidx.wear.protolayout.ResourceBuilders.Resources> getOnTileResourceRequest();
-    method public androidx.wear.protolayout.expression.PlatformDataValues? getPlatformDataValues();
-    property public kotlin.jvm.functions.Function1<androidx.wear.tiles.RequestBuilders.TileRequest,androidx.wear.tiles.TileBuilders.Tile> onTileRequest;
-    property public kotlin.jvm.functions.Function1<androidx.wear.tiles.RequestBuilders.ResourcesRequest,androidx.wear.protolayout.ResourceBuilders.Resources> onTileResourceRequest;
-    property public androidx.wear.protolayout.expression.PlatformDataValues? platformDataValues;
-  }
-
-  public final class TilePreviewHelper {
-    method public static androidx.wear.tiles.TileBuilders.Tile.Builder singleTimelineEntryTileBuilder(androidx.wear.protolayout.LayoutElementBuilders.Layout layout);
-    method public static androidx.wear.tiles.TileBuilders.Tile.Builder singleTimelineEntryTileBuilder(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement layoutElement);
-    field public static final androidx.wear.tiles.tooling.preview.TilePreviewHelper INSTANCE;
-  }
-
-}
-
diff --git a/wear/tiles/tiles-tooling-preview/api/res-1.5.0-beta01.txt b/wear/tiles/tiles-tooling-preview/api/res-1.5.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/wear/tiles/tiles-tooling-preview/api/res-1.5.0-beta01.txt
+++ /dev/null
diff --git a/wear/tiles/tiles-tooling-preview/api/restricted_1.5.0-beta01.txt b/wear/tiles/tiles-tooling-preview/api/restricted_1.5.0-beta01.txt
deleted file mode 100644
index 96cc2c0..0000000
--- a/wear/tiles/tiles-tooling-preview/api/restricted_1.5.0-beta01.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.tiles.tooling.preview {
-
-  @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 String device() default androidx.wear.tooling.preview.devices.WearDevices.SMALL_ROUND;
-    method public abstract float fontScale() default 1.0;
-    method public abstract String group() default "";
-    method public abstract String locale() default "";
-    method public abstract String name() default "";
-    property public abstract String device;
-    property @FloatRange(from=0.01) public abstract float fontScale;
-    property public abstract String group;
-    property public abstract String locale;
-    property public abstract String name;
-  }
-
-  @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.wear.tiles.tooling.preview.Preview[] value();
-    property public abstract String device;
-    property @FloatRange(from=0.01) public abstract float fontScale;
-    property public abstract String group;
-    property public abstract String locale;
-    property public abstract String name;
-  }
-
-  public final class TilePreviewData {
-    ctor public TilePreviewData(optional kotlin.jvm.functions.Function1<? super androidx.wear.tiles.RequestBuilders.ResourcesRequest,androidx.wear.protolayout.ResourceBuilders.Resources> onTileResourceRequest, optional androidx.wear.protolayout.expression.PlatformDataValues? platformDataValues, kotlin.jvm.functions.Function1<? super androidx.wear.tiles.RequestBuilders.TileRequest,androidx.wear.tiles.TileBuilders.Tile> onTileRequest);
-    ctor public TilePreviewData(optional kotlin.jvm.functions.Function1<? super androidx.wear.tiles.RequestBuilders.ResourcesRequest,androidx.wear.protolayout.ResourceBuilders.Resources> onTileResourceRequest, kotlin.jvm.functions.Function1<? super androidx.wear.tiles.RequestBuilders.TileRequest,androidx.wear.tiles.TileBuilders.Tile> onTileRequest);
-    ctor public TilePreviewData(kotlin.jvm.functions.Function1<? super androidx.wear.tiles.RequestBuilders.TileRequest,androidx.wear.tiles.TileBuilders.Tile> onTileRequest);
-    method public kotlin.jvm.functions.Function1<androidx.wear.tiles.RequestBuilders.TileRequest,androidx.wear.tiles.TileBuilders.Tile> getOnTileRequest();
-    method public kotlin.jvm.functions.Function1<androidx.wear.tiles.RequestBuilders.ResourcesRequest,androidx.wear.protolayout.ResourceBuilders.Resources> getOnTileResourceRequest();
-    method public androidx.wear.protolayout.expression.PlatformDataValues? getPlatformDataValues();
-    property public kotlin.jvm.functions.Function1<androidx.wear.tiles.RequestBuilders.TileRequest,androidx.wear.tiles.TileBuilders.Tile> onTileRequest;
-    property public kotlin.jvm.functions.Function1<androidx.wear.tiles.RequestBuilders.ResourcesRequest,androidx.wear.protolayout.ResourceBuilders.Resources> onTileResourceRequest;
-    property public androidx.wear.protolayout.expression.PlatformDataValues? platformDataValues;
-  }
-
-  public final class TilePreviewHelper {
-    method public static androidx.wear.tiles.TileBuilders.Tile.Builder singleTimelineEntryTileBuilder(androidx.wear.protolayout.LayoutElementBuilders.Layout layout);
-    method public static androidx.wear.tiles.TileBuilders.Tile.Builder singleTimelineEntryTileBuilder(androidx.wear.protolayout.LayoutElementBuilders.LayoutElement layoutElement);
-    field public static final androidx.wear.tiles.tooling.preview.TilePreviewHelper INSTANCE;
-  }
-
-}
-
diff --git a/wear/tiles/tiles-tooling/api/1.5.0-beta01.txt b/wear/tiles/tiles-tooling/api/1.5.0-beta01.txt
deleted file mode 100644
index e6f50d0..0000000
--- a/wear/tiles/tiles-tooling/api/1.5.0-beta01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 4.0
diff --git a/wear/tiles/tiles-tooling/api/res-1.5.0-beta01.txt b/wear/tiles/tiles-tooling/api/res-1.5.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/wear/tiles/tiles-tooling/api/res-1.5.0-beta01.txt
+++ /dev/null
diff --git a/wear/tiles/tiles-tooling/api/restricted_1.5.0-beta01.txt b/wear/tiles/tiles-tooling/api/restricted_1.5.0-beta01.txt
deleted file mode 100644
index dc88560..0000000
--- a/wear/tiles/tiles-tooling/api/restricted_1.5.0-beta01.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.tiles.tooling {
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class TileServiceViewAdapter extends android.widget.FrameLayout {
-    ctor public TileServiceViewAdapter(android.content.Context context, android.util.AttributeSet attrs);
-    method public java.util.List<androidx.wear.protolayout.expression.pipeline.DynamicTypeAnimator> getAnimations();
-  }
-
-}
-
diff --git a/wear/tiles/tiles/api/1.5.0-beta01.txt b/wear/tiles/tiles/api/1.5.0-beta01.txt
deleted file mode 100644
index f9c99d7..0000000
--- a/wear/tiles/tiles/api/1.5.0-beta01.txt
+++ /dev/null
@@ -1,1151 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.tiles {
-
-  @Deprecated public final class ActionBuilders {
-    method @Deprecated public static androidx.wear.tiles.ActionBuilders.AndroidBooleanExtra booleanExtra(boolean);
-    method @Deprecated public static androidx.wear.tiles.ActionBuilders.AndroidDoubleExtra doubleExtra(double);
-    method @Deprecated public static androidx.wear.tiles.ActionBuilders.AndroidIntExtra intExtra(int);
-    method @Deprecated public static androidx.wear.tiles.ActionBuilders.AndroidLongExtra longExtra(long);
-    method @Deprecated public static androidx.wear.tiles.ActionBuilders.AndroidStringExtra stringExtra(String);
-  }
-
-  @Deprecated public static interface ActionBuilders.Action {
-  }
-
-  @Deprecated public static interface ActionBuilders.Action.Builder {
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.Action build();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidActivity {
-    method @Deprecated public String getClassName();
-    method @Deprecated public java.util.Map<java.lang.String!,androidx.wear.tiles.ActionBuilders.AndroidExtra!> getKeyToExtraMapping();
-    method @Deprecated public String getPackageName();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidActivity.Builder {
-    ctor @Deprecated public ActionBuilders.AndroidActivity.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidActivity.Builder addKeyToExtraMapping(String, androidx.wear.tiles.ActionBuilders.AndroidExtra);
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidActivity build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidActivity.Builder setClassName(String);
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidActivity.Builder setPackageName(String);
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidBooleanExtra implements androidx.wear.tiles.ActionBuilders.AndroidExtra {
-    method @Deprecated public boolean getValue();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidBooleanExtra.Builder implements androidx.wear.tiles.ActionBuilders.AndroidExtra.Builder {
-    ctor @Deprecated public ActionBuilders.AndroidBooleanExtra.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidBooleanExtra build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidBooleanExtra.Builder setValue(boolean);
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidDoubleExtra implements androidx.wear.tiles.ActionBuilders.AndroidExtra {
-    method @Deprecated public double getValue();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidDoubleExtra.Builder implements androidx.wear.tiles.ActionBuilders.AndroidExtra.Builder {
-    ctor @Deprecated public ActionBuilders.AndroidDoubleExtra.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidDoubleExtra build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidDoubleExtra.Builder setValue(double);
-  }
-
-  @Deprecated public static interface ActionBuilders.AndroidExtra {
-  }
-
-  @Deprecated public static interface ActionBuilders.AndroidExtra.Builder {
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidExtra build();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidIntExtra implements androidx.wear.tiles.ActionBuilders.AndroidExtra {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidIntExtra.Builder implements androidx.wear.tiles.ActionBuilders.AndroidExtra.Builder {
-    ctor @Deprecated public ActionBuilders.AndroidIntExtra.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidIntExtra build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidIntExtra.Builder setValue(int);
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidLongExtra implements androidx.wear.tiles.ActionBuilders.AndroidExtra {
-    method @Deprecated public long getValue();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidLongExtra.Builder implements androidx.wear.tiles.ActionBuilders.AndroidExtra.Builder {
-    ctor @Deprecated public ActionBuilders.AndroidLongExtra.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidLongExtra build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidLongExtra.Builder setValue(long);
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidStringExtra implements androidx.wear.tiles.ActionBuilders.AndroidExtra {
-    method @Deprecated public String getValue();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidStringExtra.Builder implements androidx.wear.tiles.ActionBuilders.AndroidExtra.Builder {
-    ctor @Deprecated public ActionBuilders.AndroidStringExtra.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidStringExtra build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidStringExtra.Builder setValue(String);
-  }
-
-  @Deprecated public static final class ActionBuilders.LaunchAction implements androidx.wear.tiles.ActionBuilders.Action {
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidActivity? getAndroidActivity();
-  }
-
-  @Deprecated public static final class ActionBuilders.LaunchAction.Builder implements androidx.wear.tiles.ActionBuilders.Action.Builder {
-    ctor @Deprecated public ActionBuilders.LaunchAction.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.LaunchAction build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.LaunchAction.Builder setAndroidActivity(androidx.wear.tiles.ActionBuilders.AndroidActivity);
-  }
-
-  @Deprecated public static final class ActionBuilders.LoadAction implements androidx.wear.tiles.ActionBuilders.Action {
-    method @Deprecated public androidx.wear.tiles.StateBuilders.State? getRequestState();
-  }
-
-  @Deprecated public static final class ActionBuilders.LoadAction.Builder implements androidx.wear.tiles.ActionBuilders.Action.Builder {
-    ctor @Deprecated public ActionBuilders.LoadAction.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.LoadAction build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.LoadAction.Builder setRequestState(androidx.wear.tiles.StateBuilders.State);
-  }
-
-  public final class ActiveTileIdentifier {
-    ctor public ActiveTileIdentifier(android.content.ComponentName, int);
-    method public android.content.ComponentName getComponentName();
-    method public int getInstanceId();
-  }
-
-  @Deprecated public final class ColorBuilders {
-    method @Deprecated public static androidx.wear.tiles.ColorBuilders.ColorProp argb(@ColorInt int);
-  }
-
-  @Deprecated public static final class ColorBuilders.ColorProp {
-    method @Deprecated @ColorInt public int getArgb();
-  }
-
-  @Deprecated public static final class ColorBuilders.ColorProp.Builder {
-    ctor @Deprecated public ColorBuilders.ColorProp.Builder();
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp build();
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp.Builder setArgb(@ColorInt int);
-  }
-
-  @Deprecated public final class DeviceParametersBuilders {
-    field @Deprecated public static final int DEVICE_PLATFORM_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int DEVICE_PLATFORM_WEAR_OS = 1; // 0x1
-    field @Deprecated public static final int SCREEN_SHAPE_RECT = 2; // 0x2
-    field @Deprecated public static final int SCREEN_SHAPE_ROUND = 1; // 0x1
-    field @Deprecated public static final int SCREEN_SHAPE_UNDEFINED = 0; // 0x0
-  }
-
-  @Deprecated public static final class DeviceParametersBuilders.DeviceParameters {
-    method @Deprecated public int getDevicePlatform();
-    method @Deprecated @FloatRange(from=0.0, fromInclusive=false, toInclusive=false) public float getScreenDensity();
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.DP) public int getScreenHeightDp();
-    method @Deprecated public int getScreenShape();
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.DP) public int getScreenWidthDp();
-  }
-
-  @Deprecated public static final class DeviceParametersBuilders.DeviceParameters.Builder {
-    ctor @Deprecated public DeviceParametersBuilders.DeviceParameters.Builder();
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters build();
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.Builder setDevicePlatform(int);
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.Builder setScreenDensity(@FloatRange(from=0.0, fromInclusive=false, toInclusive=false) float);
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.Builder setScreenHeightDp(@Dimension(unit=androidx.annotation.Dimension.DP) int);
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.Builder setScreenShape(int);
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.Builder setScreenWidthDp(@Dimension(unit=androidx.annotation.Dimension.DP) int);
-  }
-
-  @Deprecated public final class DimensionBuilders {
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.DegreesProp degrees(float);
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.DpProp dp(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.EmProp em(float);
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.EmProp em(int);
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.ExpandedDimensionProp expand();
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.SpProp sp(@Dimension(unit=androidx.annotation.Dimension.SP) float);
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.WrappedDimensionProp wrap();
-  }
-
-  @Deprecated public static interface DimensionBuilders.ContainerDimension {
-  }
-
-  @Deprecated public static interface DimensionBuilders.ContainerDimension.Builder {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension build();
-  }
-
-  @Deprecated public static final class DimensionBuilders.DegreesProp {
-    method @Deprecated public float getValue();
-  }
-
-  @Deprecated public static final class DimensionBuilders.DegreesProp.Builder {
-    ctor @Deprecated public DimensionBuilders.DegreesProp.Builder();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp build();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp.Builder setValue(float);
-  }
-
-  @Deprecated public static final class DimensionBuilders.DpProp implements androidx.wear.tiles.DimensionBuilders.ContainerDimension androidx.wear.tiles.DimensionBuilders.ImageDimension androidx.wear.tiles.DimensionBuilders.SpacerDimension {
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.DP) public float getValue();
-  }
-
-  @Deprecated public static final class DimensionBuilders.DpProp.Builder implements androidx.wear.tiles.DimensionBuilders.ContainerDimension.Builder androidx.wear.tiles.DimensionBuilders.ImageDimension.Builder androidx.wear.tiles.DimensionBuilders.SpacerDimension.Builder {
-    ctor @Deprecated public DimensionBuilders.DpProp.Builder();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp build();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp.Builder setValue(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @Deprecated public static final class DimensionBuilders.EmProp {
-    method @Deprecated public float getValue();
-  }
-
-  @Deprecated public static final class DimensionBuilders.EmProp.Builder {
-    ctor @Deprecated public DimensionBuilders.EmProp.Builder();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.EmProp build();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.EmProp.Builder setValue(float);
-  }
-
-  @Deprecated public static final class DimensionBuilders.ExpandedDimensionProp implements androidx.wear.tiles.DimensionBuilders.ContainerDimension androidx.wear.tiles.DimensionBuilders.ImageDimension {
-  }
-
-  @Deprecated public static final class DimensionBuilders.ExpandedDimensionProp.Builder implements androidx.wear.tiles.DimensionBuilders.ContainerDimension.Builder androidx.wear.tiles.DimensionBuilders.ImageDimension.Builder {
-    ctor @Deprecated public DimensionBuilders.ExpandedDimensionProp.Builder();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ExpandedDimensionProp build();
-  }
-
-  @Deprecated public static interface DimensionBuilders.ImageDimension {
-  }
-
-  @Deprecated public static interface DimensionBuilders.ImageDimension.Builder {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ImageDimension build();
-  }
-
-  @Deprecated public static final class DimensionBuilders.ProportionalDimensionProp implements androidx.wear.tiles.DimensionBuilders.ImageDimension {
-    method @Deprecated @IntRange(from=0) public int getAspectRatioHeight();
-    method @Deprecated @IntRange(from=0) public int getAspectRatioWidth();
-  }
-
-  @Deprecated public static final class DimensionBuilders.ProportionalDimensionProp.Builder implements androidx.wear.tiles.DimensionBuilders.ImageDimension.Builder {
-    ctor @Deprecated public DimensionBuilders.ProportionalDimensionProp.Builder();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ProportionalDimensionProp build();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ProportionalDimensionProp.Builder setAspectRatioHeight(@IntRange(from=0) int);
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ProportionalDimensionProp.Builder setAspectRatioWidth(@IntRange(from=0) int);
-  }
-
-  @Deprecated public static final class DimensionBuilders.SpProp {
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.SP) public float getValue();
-  }
-
-  @Deprecated public static final class DimensionBuilders.SpProp.Builder {
-    ctor @Deprecated public DimensionBuilders.SpProp.Builder();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpProp build();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpProp.Builder setValue(@Dimension(unit=androidx.annotation.Dimension.SP) float);
-  }
-
-  @Deprecated public static interface DimensionBuilders.SpacerDimension {
-  }
-
-  @Deprecated public static interface DimensionBuilders.SpacerDimension.Builder {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpacerDimension build();
-  }
-
-  @Deprecated public static final class DimensionBuilders.WrappedDimensionProp implements androidx.wear.tiles.DimensionBuilders.ContainerDimension {
-  }
-
-  @Deprecated public static final class DimensionBuilders.WrappedDimensionProp.Builder implements androidx.wear.tiles.DimensionBuilders.ContainerDimension.Builder {
-    ctor @Deprecated public DimensionBuilders.WrappedDimensionProp.Builder();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.WrappedDimensionProp build();
-  }
-
-  public final class EventBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class EventBuilders.TileAddEvent {
-    method public int getTileId();
-  }
-
-  public static final class EventBuilders.TileAddEvent.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public EventBuilders.TileAddEvent.Builder();
-    method public androidx.wear.tiles.EventBuilders.TileAddEvent build();
-    method public androidx.wear.tiles.EventBuilders.TileAddEvent.Builder setTileId(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class EventBuilders.TileEnterEvent {
-    method public int getTileId();
-  }
-
-  public static final class EventBuilders.TileEnterEvent.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public EventBuilders.TileEnterEvent.Builder();
-    method public androidx.wear.tiles.EventBuilders.TileEnterEvent build();
-    method public androidx.wear.tiles.EventBuilders.TileEnterEvent.Builder setTileId(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static final class EventBuilders.TileInteractionEvent {
-    method public int getEventType();
-    method public int getTileId();
-    method public java.time.Instant getTimestamp();
-    field public static final int ENTER = 1; // 0x1
-    field public static final int LEAVE = 2; // 0x2
-    field public static final int UNKNOWN = 0; // 0x0
-  }
-
-  public static final class EventBuilders.TileInteractionEvent.Builder {
-    ctor public EventBuilders.TileInteractionEvent.Builder(int, int);
-    method public androidx.wear.tiles.EventBuilders.TileInteractionEvent build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.tiles.EventBuilders.TileInteractionEvent.Builder setTimestamp(java.time.Instant);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class EventBuilders.TileLeaveEvent {
-    method public int getTileId();
-  }
-
-  public static final class EventBuilders.TileLeaveEvent.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public EventBuilders.TileLeaveEvent.Builder();
-    method public androidx.wear.tiles.EventBuilders.TileLeaveEvent build();
-    method public androidx.wear.tiles.EventBuilders.TileLeaveEvent.Builder setTileId(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class EventBuilders.TileRemoveEvent {
-    method public int getTileId();
-  }
-
-  public static final class EventBuilders.TileRemoveEvent.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public EventBuilders.TileRemoveEvent.Builder();
-    method public androidx.wear.tiles.EventBuilders.TileRemoveEvent build();
-    method public androidx.wear.tiles.EventBuilders.TileRemoveEvent.Builder setTileId(int);
-  }
-
-  @Deprecated public final class LayoutElementBuilders {
-    field @Deprecated public static final int ARC_ANCHOR_CENTER = 2; // 0x2
-    field @Deprecated public static final int ARC_ANCHOR_END = 3; // 0x3
-    field @Deprecated public static final int ARC_ANCHOR_START = 1; // 0x1
-    field @Deprecated public static final int ARC_ANCHOR_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int CONTENT_SCALE_MODE_CROP = 2; // 0x2
-    field @Deprecated public static final int CONTENT_SCALE_MODE_FILL_BOUNDS = 3; // 0x3
-    field @Deprecated public static final int CONTENT_SCALE_MODE_FIT = 1; // 0x1
-    field @Deprecated public static final int CONTENT_SCALE_MODE_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int FONT_VARIANT_BODY = 2; // 0x2
-    field @Deprecated public static final int FONT_VARIANT_TITLE = 1; // 0x1
-    field @Deprecated public static final int FONT_VARIANT_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int FONT_WEIGHT_BOLD = 700; // 0x2bc
-    field @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public static final int FONT_WEIGHT_MEDIUM = 500; // 0x1f4
-    field @Deprecated public static final int FONT_WEIGHT_NORMAL = 400; // 0x190
-    field @Deprecated public static final int FONT_WEIGHT_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int HORIZONTAL_ALIGN_CENTER = 2; // 0x2
-    field @Deprecated public static final int HORIZONTAL_ALIGN_END = 5; // 0x5
-    field @Deprecated public static final int HORIZONTAL_ALIGN_LEFT = 1; // 0x1
-    field @Deprecated public static final int HORIZONTAL_ALIGN_RIGHT = 3; // 0x3
-    field @Deprecated public static final int HORIZONTAL_ALIGN_START = 4; // 0x4
-    field @Deprecated public static final int HORIZONTAL_ALIGN_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int SPAN_VERTICAL_ALIGN_BOTTOM = 1; // 0x1
-    field @Deprecated public static final int SPAN_VERTICAL_ALIGN_TEXT_BASELINE = 2; // 0x2
-    field @Deprecated public static final int SPAN_VERTICAL_ALIGN_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int TEXT_ALIGN_CENTER = 2; // 0x2
-    field @Deprecated public static final int TEXT_ALIGN_END = 3; // 0x3
-    field @Deprecated public static final int TEXT_ALIGN_START = 1; // 0x1
-    field @Deprecated public static final int TEXT_ALIGN_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int TEXT_OVERFLOW_ELLIPSIZE_END = 2; // 0x2
-    field @Deprecated public static final int TEXT_OVERFLOW_TRUNCATE = 1; // 0x1
-    field @Deprecated public static final int TEXT_OVERFLOW_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int VERTICAL_ALIGN_BOTTOM = 3; // 0x3
-    field @Deprecated public static final int VERTICAL_ALIGN_CENTER = 2; // 0x2
-    field @Deprecated public static final int VERTICAL_ALIGN_TOP = 1; // 0x1
-    field @Deprecated public static final int VERTICAL_ALIGN_UNDEFINED = 0; // 0x0
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Arc implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp? getAnchorAngle();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcAnchorTypeProp? getAnchorType();
-    method @Deprecated public java.util.List<androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement!> getContents();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp? getVerticalAlign();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Arc.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Arc.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc.Builder addContent(androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc.Builder setAnchorAngle(androidx.wear.tiles.DimensionBuilders.DegreesProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc.Builder setAnchorType(androidx.wear.tiles.LayoutElementBuilders.ArcAnchorTypeProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc.Builder setAnchorType(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc.Builder setVerticalAlign(androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc.Builder setVerticalAlign(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcAdapter implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getContent();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.BoolProp? getRotateContents();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcAdapter.Builder implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.ArcAdapter.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcAdapter build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcAdapter.Builder setContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcAdapter.Builder setRotateContents(androidx.wear.tiles.TypeBuilders.BoolProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcAdapter.Builder setRotateContents(boolean);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcAnchorTypeProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcAnchorTypeProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.ArcAnchorTypeProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcAnchorTypeProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcAnchorTypeProp.Builder setValue(int);
-  }
-
-  @Deprecated public static interface LayoutElementBuilders.ArcLayoutElement {
-  }
-
-  @Deprecated public static interface LayoutElementBuilders.ArcLayoutElement.Builder {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement build();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcLine implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement {
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp? getColor();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp? getLength();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ArcModifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getThickness();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcLine.Builder implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.ArcLine.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcLine build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcLine.Builder setColor(androidx.wear.tiles.ColorBuilders.ColorProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcLine.Builder setLength(androidx.wear.tiles.DimensionBuilders.DegreesProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcLine.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.ArcModifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcLine.Builder setThickness(androidx.wear.tiles.DimensionBuilders.DpProp);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcSpacer implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp? getLength();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ArcModifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getThickness();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcSpacer.Builder implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.ArcSpacer.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcSpacer build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcSpacer.Builder setLength(androidx.wear.tiles.DimensionBuilders.DegreesProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcSpacer.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.ArcModifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcSpacer.Builder setThickness(androidx.wear.tiles.DimensionBuilders.DpProp);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcText implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle? getFontStyle();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ArcModifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.StringProp? getText();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcText.Builder implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.ArcText.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcText build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcText.Builder setFontStyle(androidx.wear.tiles.LayoutElementBuilders.FontStyle);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcText.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.ArcModifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcText.Builder setText(androidx.wear.tiles.TypeBuilders.StringProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcText.Builder setText(String);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Box implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public java.util.List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement!> getContents();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension? getHeight();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp? getHorizontalAlignment();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp? getVerticalAlignment();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension? getWidth();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Box.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Box.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder addContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder setHeight(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder setHorizontalAlignment(androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder setHorizontalAlignment(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder setVerticalAlignment(androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder setVerticalAlignment(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder setWidth(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ColorFilter {
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp? getTint();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ColorFilter.Builder {
-    ctor @Deprecated public LayoutElementBuilders.ColorFilter.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ColorFilter build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ColorFilter.Builder setTint(androidx.wear.tiles.ColorBuilders.ColorProp);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Column implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public java.util.List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement!> getContents();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension? getHeight();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp? getHorizontalAlignment();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension? getWidth();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Column.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Column.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Column.Builder addContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Column build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Column.Builder setHeight(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Column.Builder setHorizontalAlignment(androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Column.Builder setHorizontalAlignment(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Column.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Column.Builder setWidth(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ContentScaleModeProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ContentScaleModeProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.ContentScaleModeProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ContentScaleModeProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ContentScaleModeProp.Builder setValue(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.FontStyle {
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp? getColor();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.BoolProp? getItalic();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.EmProp? getLetterSpacing();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpProp? getSize();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.BoolProp? getUnderline();
-    method @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public androidx.wear.tiles.LayoutElementBuilders.FontVariantProp? getVariant();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontWeightProp? getWeight();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.FontStyle.Builder {
-    ctor @Deprecated public LayoutElementBuilders.FontStyle.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setColor(androidx.wear.tiles.ColorBuilders.ColorProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setItalic(androidx.wear.tiles.TypeBuilders.BoolProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setItalic(boolean);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setLetterSpacing(androidx.wear.tiles.DimensionBuilders.EmProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setSize(androidx.wear.tiles.DimensionBuilders.SpProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setUnderline(androidx.wear.tiles.TypeBuilders.BoolProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setUnderline(boolean);
-    method @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setVariant(androidx.wear.tiles.LayoutElementBuilders.FontVariantProp);
-    method @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setVariant(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setWeight(androidx.wear.tiles.LayoutElementBuilders.FontWeightProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setWeight(int);
-  }
-
-  @Deprecated public static class LayoutElementBuilders.FontStyles {
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder body1(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder body2(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder button(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder caption1(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder caption2(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder display1(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder display2(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder display3(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder title1(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder title2(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder title3(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-  }
-
-  @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public static final class LayoutElementBuilders.FontVariantProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.FontVariantProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.FontVariantProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontVariantProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontVariantProp.Builder setValue(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.FontWeightProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.FontWeightProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.FontWeightProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontWeightProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontWeightProp.Builder setValue(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.HorizontalAlignmentProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.HorizontalAlignmentProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.HorizontalAlignmentProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp.Builder setValue(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Image implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ColorFilter? getColorFilter();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ContentScaleModeProp? getContentScaleMode();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ImageDimension? getHeight();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.StringProp? getResourceId();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ImageDimension? getWidth();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Image.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Image.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setColorFilter(androidx.wear.tiles.LayoutElementBuilders.ColorFilter);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setContentScaleMode(androidx.wear.tiles.LayoutElementBuilders.ContentScaleModeProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setContentScaleMode(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setHeight(androidx.wear.tiles.DimensionBuilders.ImageDimension);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setResourceId(androidx.wear.tiles.TypeBuilders.StringProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setResourceId(String);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setWidth(androidx.wear.tiles.DimensionBuilders.ImageDimension);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Layout {
-    method @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public static androidx.wear.tiles.LayoutElementBuilders.Layout? fromByteArray(byte[]);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.Layout fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getRoot();
-    method @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public byte[] toByteArray();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Layout.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Layout.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Layout build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Layout.Builder setRoot(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-  }
-
-  @Deprecated public static interface LayoutElementBuilders.LayoutElement {
-  }
-
-  @Deprecated public static interface LayoutElementBuilders.LayoutElement.Builder {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement build();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Row implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public java.util.List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement!> getContents();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension? getHeight();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp? getVerticalAlignment();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension? getWidth();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Row.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Row.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Row.Builder addContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Row build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Row.Builder setHeight(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Row.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Row.Builder setVerticalAlignment(androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Row.Builder setVerticalAlignment(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Row.Builder setWidth(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Spacer implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpacerDimension? getHeight();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpacerDimension? getWidth();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Spacer.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Spacer.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spacer build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spacer.Builder setHeight(androidx.wear.tiles.DimensionBuilders.SpacerDimension);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spacer.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spacer.Builder setWidth(androidx.wear.tiles.DimensionBuilders.SpacerDimension);
-  }
-
-  @Deprecated public static interface LayoutElementBuilders.Span {
-  }
-
-  @Deprecated public static interface LayoutElementBuilders.Span.Builder {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Span build();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.SpanImage implements androidx.wear.tiles.LayoutElementBuilders.Span {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanVerticalAlignmentProp? getAlignment();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getHeight();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.SpanModifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.StringProp? getResourceId();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getWidth();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.SpanImage.Builder implements androidx.wear.tiles.LayoutElementBuilders.Span.Builder {
-    ctor @Deprecated public LayoutElementBuilders.SpanImage.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage.Builder setAlignment(androidx.wear.tiles.LayoutElementBuilders.SpanVerticalAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage.Builder setAlignment(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage.Builder setHeight(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.SpanModifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage.Builder setResourceId(androidx.wear.tiles.TypeBuilders.StringProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage.Builder setResourceId(String);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage.Builder setWidth(androidx.wear.tiles.DimensionBuilders.DpProp);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.SpanText implements androidx.wear.tiles.LayoutElementBuilders.Span {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle? getFontStyle();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.SpanModifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.StringProp? getText();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.SpanText.Builder implements androidx.wear.tiles.LayoutElementBuilders.Span.Builder {
-    ctor @Deprecated public LayoutElementBuilders.SpanText.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanText build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanText.Builder setFontStyle(androidx.wear.tiles.LayoutElementBuilders.FontStyle);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanText.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.SpanModifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanText.Builder setText(androidx.wear.tiles.TypeBuilders.StringProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanText.Builder setText(String);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.SpanVerticalAlignmentProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.SpanVerticalAlignmentProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.SpanVerticalAlignmentProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanVerticalAlignmentProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanVerticalAlignmentProp.Builder setValue(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Spannable implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpProp? getLineHeight();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.Int32Prop? getMaxLines();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp? getMultilineAlignment();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.TextOverflowProp? getOverflow();
-    method @Deprecated public java.util.List<androidx.wear.tiles.LayoutElementBuilders.Span!> getSpans();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Spannable.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Spannable.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder addSpan(androidx.wear.tiles.LayoutElementBuilders.Span);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setLineHeight(androidx.wear.tiles.DimensionBuilders.SpProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setMaxLines(androidx.wear.tiles.TypeBuilders.Int32Prop);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setMaxLines(@IntRange(from=1) int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setMultilineAlignment(androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setMultilineAlignment(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setOverflow(androidx.wear.tiles.LayoutElementBuilders.TextOverflowProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setOverflow(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Text implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle? getFontStyle();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpProp? getLineHeight();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.Int32Prop? getMaxLines();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.TextAlignmentProp? getMultilineAlignment();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.TextOverflowProp? getOverflow();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.StringProp? getText();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Text.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Text.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setFontStyle(androidx.wear.tiles.LayoutElementBuilders.FontStyle);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setLineHeight(androidx.wear.tiles.DimensionBuilders.SpProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setMaxLines(androidx.wear.tiles.TypeBuilders.Int32Prop);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setMaxLines(@IntRange(from=1) int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setMultilineAlignment(androidx.wear.tiles.LayoutElementBuilders.TextAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setMultilineAlignment(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setOverflow(androidx.wear.tiles.LayoutElementBuilders.TextOverflowProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setOverflow(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setText(androidx.wear.tiles.TypeBuilders.StringProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setText(String);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.TextAlignmentProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.TextAlignmentProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.TextAlignmentProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.TextAlignmentProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.TextAlignmentProp.Builder setValue(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.TextOverflowProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.TextOverflowProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.TextOverflowProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.TextOverflowProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.TextOverflowProp.Builder setValue(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.VerticalAlignmentProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.VerticalAlignmentProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.VerticalAlignmentProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp.Builder setValue(int);
-  }
-
-  @Deprecated public final class ModifiersBuilders {
-  }
-
-  @Deprecated public static final class ModifiersBuilders.ArcModifiers {
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable? getClickable();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Semantics? getSemantics();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.ArcModifiers.Builder {
-    ctor @Deprecated public ModifiersBuilders.ArcModifiers.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ArcModifiers build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ArcModifiers.Builder setClickable(androidx.wear.tiles.ModifiersBuilders.Clickable);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ArcModifiers.Builder setSemantics(androidx.wear.tiles.ModifiersBuilders.Semantics);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Background {
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp? getColor();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Corner? getCorner();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Background.Builder {
-    ctor @Deprecated public ModifiersBuilders.Background.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Background build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Background.Builder setColor(androidx.wear.tiles.ColorBuilders.ColorProp);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Background.Builder setCorner(androidx.wear.tiles.ModifiersBuilders.Corner);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Border {
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp? getColor();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getWidth();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Border.Builder {
-    ctor @Deprecated public ModifiersBuilders.Border.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Border build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Border.Builder setColor(androidx.wear.tiles.ColorBuilders.ColorProp);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Border.Builder setWidth(androidx.wear.tiles.DimensionBuilders.DpProp);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Clickable {
-    method @Deprecated public String getId();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.Action? getOnClick();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Clickable.Builder {
-    ctor @Deprecated public ModifiersBuilders.Clickable.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable.Builder setId(String);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable.Builder setOnClick(androidx.wear.tiles.ActionBuilders.Action);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Corner {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getRadius();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Corner.Builder {
-    ctor @Deprecated public ModifiersBuilders.Corner.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Corner build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Corner.Builder setRadius(androidx.wear.tiles.DimensionBuilders.DpProp);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.ElementMetadata {
-    method @Deprecated public byte[] getTagData();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.ElementMetadata.Builder {
-    ctor @Deprecated public ModifiersBuilders.ElementMetadata.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ElementMetadata build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ElementMetadata.Builder setTagData(byte[]);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Modifiers {
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Background? getBackground();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Border? getBorder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable? getClickable();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ElementMetadata? getMetadata();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding? getPadding();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Semantics? getSemantics();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Modifiers.Builder {
-    ctor @Deprecated public ModifiersBuilders.Modifiers.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder setBackground(androidx.wear.tiles.ModifiersBuilders.Background);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder setBorder(androidx.wear.tiles.ModifiersBuilders.Border);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder setClickable(androidx.wear.tiles.ModifiersBuilders.Clickable);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder setMetadata(androidx.wear.tiles.ModifiersBuilders.ElementMetadata);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder setPadding(androidx.wear.tiles.ModifiersBuilders.Padding);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder setSemantics(androidx.wear.tiles.ModifiersBuilders.Semantics);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Padding {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getBottom();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getEnd();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.BoolProp? getRtlAware();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getStart();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getTop();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Padding.Builder {
-    ctor @Deprecated public ModifiersBuilders.Padding.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding.Builder setAll(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding.Builder setBottom(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding.Builder setEnd(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding.Builder setRtlAware(androidx.wear.tiles.TypeBuilders.BoolProp);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding.Builder setRtlAware(boolean);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding.Builder setStart(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding.Builder setTop(androidx.wear.tiles.DimensionBuilders.DpProp);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Semantics {
-    method @Deprecated public String getContentDescription();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Semantics.Builder {
-    ctor @Deprecated public ModifiersBuilders.Semantics.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Semantics build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Semantics.Builder setContentDescription(String);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.SpanModifiers {
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable? getClickable();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.SpanModifiers.Builder {
-    ctor @Deprecated public ModifiersBuilders.SpanModifiers.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.SpanModifiers build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.SpanModifiers.Builder setClickable(androidx.wear.tiles.ModifiersBuilders.Clickable);
-  }
-
-  public final class RequestBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class RequestBuilders.ResourcesRequest {
-    method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters getDeviceConfiguration();
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters? getDeviceParameters();
-    method public java.util.List<java.lang.String!> getResourceIds();
-    method public int getTileId();
-    method public String getVersion();
-  }
-
-  public static final class RequestBuilders.ResourcesRequest.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public RequestBuilders.ResourcesRequest.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.RequestBuilders.ResourcesRequest.Builder addResourceId(String);
-    method public androidx.wear.tiles.RequestBuilders.ResourcesRequest build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.RequestBuilders.ResourcesRequest.Builder setDeviceConfiguration(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.RequestBuilders.ResourcesRequest.Builder setDeviceParameters(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.RequestBuilders.ResourcesRequest.Builder setTileId(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.RequestBuilders.ResourcesRequest.Builder setVersion(String);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class RequestBuilders.TileRequest {
-    method public androidx.wear.protolayout.StateBuilders.State getCurrentState();
-    method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters getDeviceConfiguration();
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters? getDeviceParameters();
-    method @Deprecated public androidx.wear.tiles.StateBuilders.State? getState();
-    method public int getTileId();
-  }
-
-  public static final class RequestBuilders.TileRequest.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public RequestBuilders.TileRequest.Builder();
-    method public androidx.wear.tiles.RequestBuilders.TileRequest build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.RequestBuilders.TileRequest.Builder setCurrentState(androidx.wear.protolayout.StateBuilders.State);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.RequestBuilders.TileRequest.Builder setDeviceConfiguration(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.RequestBuilders.TileRequest.Builder setDeviceParameters(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.RequestBuilders.TileRequest.Builder setState(androidx.wear.tiles.StateBuilders.State);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.RequestBuilders.TileRequest.Builder setTileId(int);
-  }
-
-  @Deprecated public final class ResourceBuilders {
-    field @Deprecated public static final int IMAGE_FORMAT_RGB_565 = 1; // 0x1
-    field @Deprecated public static final int IMAGE_FORMAT_UNDEFINED = 0; // 0x0
-  }
-
-  @Deprecated public static final class ResourceBuilders.AndroidImageResourceByResId {
-    method @Deprecated @DrawableRes public int getResourceId();
-  }
-
-  @Deprecated public static final class ResourceBuilders.AndroidImageResourceByResId.Builder {
-    ctor @Deprecated public ResourceBuilders.AndroidImageResourceByResId.Builder();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.AndroidImageResourceByResId build();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.AndroidImageResourceByResId.Builder setResourceId(@DrawableRes int);
-  }
-
-  @Deprecated public static final class ResourceBuilders.ImageResource {
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.AndroidImageResourceByResId? getAndroidResourceByResId();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.InlineImageResource? getInlineResource();
-  }
-
-  @Deprecated public static final class ResourceBuilders.ImageResource.Builder {
-    ctor @Deprecated public ResourceBuilders.ImageResource.Builder();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.ImageResource build();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.ImageResource.Builder setAndroidResourceByResId(androidx.wear.tiles.ResourceBuilders.AndroidImageResourceByResId);
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.ImageResource.Builder setInlineResource(androidx.wear.tiles.ResourceBuilders.InlineImageResource);
-  }
-
-  @Deprecated public static final class ResourceBuilders.InlineImageResource {
-    method @Deprecated public byte[] getData();
-    method @Deprecated public int getFormat();
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.PX) public int getHeightPx();
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.PX) public int getWidthPx();
-  }
-
-  @Deprecated public static final class ResourceBuilders.InlineImageResource.Builder {
-    ctor @Deprecated public ResourceBuilders.InlineImageResource.Builder();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.InlineImageResource build();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.InlineImageResource.Builder setData(byte[]);
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.InlineImageResource.Builder setFormat(int);
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.InlineImageResource.Builder setHeightPx(@Dimension(unit=androidx.annotation.Dimension.PX) int);
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.InlineImageResource.Builder setWidthPx(@Dimension(unit=androidx.annotation.Dimension.PX) int);
-  }
-
-  @Deprecated public static final class ResourceBuilders.Resources {
-    method @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public static androidx.wear.tiles.ResourceBuilders.Resources? fromByteArray(byte[]);
-    method @Deprecated public java.util.Map<java.lang.String!,androidx.wear.tiles.ResourceBuilders.ImageResource!> getIdToImageMapping();
-    method @Deprecated public String getVersion();
-    method @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public byte[] toByteArray();
-  }
-
-  @Deprecated public static final class ResourceBuilders.Resources.Builder {
-    ctor @Deprecated public ResourceBuilders.Resources.Builder();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.Resources.Builder addIdToImageMapping(String, androidx.wear.tiles.ResourceBuilders.ImageResource);
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.Resources build();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.Resources.Builder setVersion(String);
-  }
-
-  @Deprecated public final class StateBuilders {
-  }
-
-  @Deprecated public static final class StateBuilders.State {
-    method @Deprecated public String getLastClickableId();
-  }
-
-  @Deprecated public static final class StateBuilders.State.Builder {
-    ctor @Deprecated public StateBuilders.State.Builder();
-    method @Deprecated public androidx.wear.tiles.StateBuilders.State build();
-  }
-
-  public final class TileBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TileBuilders.Tile {
-    method public long getFreshnessIntervalMillis();
-    method public String getResourcesVersion();
-    method public androidx.wear.protolayout.StateBuilders.State? getState();
-    method public androidx.wear.protolayout.TimelineBuilders.Timeline? getTileTimeline();
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.Timeline? getTimeline();
-  }
-
-  public static final class TileBuilders.Tile.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public TileBuilders.Tile.Builder();
-    method public androidx.wear.tiles.TileBuilders.Tile build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.TileBuilders.Tile.Builder setFreshnessIntervalMillis(long);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.TileBuilders.Tile.Builder setResourcesVersion(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.tiles.TileBuilders.Tile.Builder setState(androidx.wear.protolayout.StateBuilders.State);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.TileBuilders.Tile.Builder setTileTimeline(androidx.wear.protolayout.TimelineBuilders.Timeline);
-    method @Deprecated public androidx.wear.tiles.TileBuilders.Tile.Builder setTimeline(androidx.wear.tiles.TimelineBuilders.Timeline);
-  }
-
-  public abstract class TileService extends android.app.Service {
-    ctor public TileService();
-    method public static com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.wear.tiles.ActiveTileIdentifier!>!> getActiveTilesAsync(android.content.Context, java.util.concurrent.Executor);
-    method public static androidx.wear.tiles.TileUpdateRequester getUpdater(android.content.Context);
-    method public android.os.IBinder? onBind(android.content.Intent);
-    method @MainThread protected com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> onRecentInteractionEventsAsync(java.util.List<androidx.wear.tiles.EventBuilders.TileInteractionEvent!>);
-    method @Deprecated @MainThread protected com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources!> onResourcesRequest(androidx.wear.tiles.RequestBuilders.ResourcesRequest);
-    method @MainThread protected void onTileAddEvent(androidx.wear.tiles.EventBuilders.TileAddEvent);
-    method @Deprecated @MainThread protected void onTileEnterEvent(androidx.wear.tiles.EventBuilders.TileEnterEvent);
-    method @Deprecated @MainThread protected void onTileLeaveEvent(androidx.wear.tiles.EventBuilders.TileLeaveEvent);
-    method @MainThread protected void onTileRemoveEvent(androidx.wear.tiles.EventBuilders.TileRemoveEvent);
-    method @MainThread protected abstract com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile!> onTileRequest(androidx.wear.tiles.RequestBuilders.TileRequest);
-    method @MainThread protected com.google.common.util.concurrent.ListenableFuture<androidx.wear.protolayout.ResourceBuilders.Resources!> onTileResourcesRequest(androidx.wear.tiles.RequestBuilders.ResourcesRequest);
-    field public static final String ACTION_BIND_TILE_PROVIDER = "androidx.wear.tiles.action.BIND_TILE_PROVIDER";
-    field public static final String EXTRA_CLICKABLE_ID = "androidx.wear.tiles.extra.CLICKABLE_ID";
-    field public static final String METADATA_PREVIEW_KEY = "androidx.wear.tiles.PREVIEW";
-  }
-
-  public interface TileUpdateRequester {
-    method public void requestUpdate(Class<? extends androidx.wear.tiles.TileService!>);
-  }
-
-  @SuppressCompatibility @RequiresOptIn(level=androidx.annotation.RequiresOptIn.Level.ERROR) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD}) public @interface TilesExperimental {
-  }
-
-  @Deprecated public final class TimelineBuilders {
-  }
-
-  @Deprecated public static final class TimelineBuilders.TimeInterval {
-    method @Deprecated public long getEndMillis();
-    method @Deprecated public long getStartMillis();
-  }
-
-  @Deprecated public static final class TimelineBuilders.TimeInterval.Builder {
-    ctor @Deprecated public TimelineBuilders.TimeInterval.Builder();
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.TimeInterval build();
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.TimeInterval.Builder setEndMillis(long);
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.TimeInterval.Builder setStartMillis(long);
-  }
-
-  @Deprecated public static final class TimelineBuilders.Timeline {
-    method @Deprecated public static androidx.wear.tiles.TimelineBuilders.Timeline fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public java.util.List<androidx.wear.tiles.TimelineBuilders.TimelineEntry!> getTimelineEntries();
-  }
-
-  @Deprecated public static final class TimelineBuilders.Timeline.Builder {
-    ctor @Deprecated public TimelineBuilders.Timeline.Builder();
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.Timeline.Builder addTimelineEntry(androidx.wear.tiles.TimelineBuilders.TimelineEntry);
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.Timeline build();
-  }
-
-  @Deprecated public static final class TimelineBuilders.TimelineEntry {
-    method @Deprecated public static androidx.wear.tiles.TimelineBuilders.TimelineEntry fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Layout? getLayout();
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.TimeInterval? getValidity();
-  }
-
-  @Deprecated public static final class TimelineBuilders.TimelineEntry.Builder {
-    ctor @Deprecated public TimelineBuilders.TimelineEntry.Builder();
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.TimelineEntry build();
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.TimelineEntry.Builder setLayout(androidx.wear.tiles.LayoutElementBuilders.Layout);
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.TimelineEntry.Builder setValidity(androidx.wear.tiles.TimelineBuilders.TimeInterval);
-  }
-
-  @Deprecated public final class TypeBuilders {
-  }
-
-  @Deprecated public static final class TypeBuilders.BoolProp {
-    method @Deprecated public boolean getValue();
-  }
-
-  @Deprecated public static final class TypeBuilders.BoolProp.Builder {
-    ctor @Deprecated public TypeBuilders.BoolProp.Builder();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.BoolProp build();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.BoolProp.Builder setValue(boolean);
-  }
-
-  @Deprecated public static final class TypeBuilders.FloatProp {
-    method @Deprecated public float getValue();
-  }
-
-  @Deprecated public static final class TypeBuilders.FloatProp.Builder {
-    ctor @Deprecated public TypeBuilders.FloatProp.Builder();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.FloatProp build();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.FloatProp.Builder setValue(float);
-  }
-
-  @Deprecated public static final class TypeBuilders.Int32Prop {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class TypeBuilders.Int32Prop.Builder {
-    ctor @Deprecated public TypeBuilders.Int32Prop.Builder();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.Int32Prop build();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.Int32Prop.Builder setValue(int);
-  }
-
-  @Deprecated public static final class TypeBuilders.StringProp {
-    method @Deprecated public String getValue();
-  }
-
-  @Deprecated public static final class TypeBuilders.StringProp.Builder {
-    ctor @Deprecated public TypeBuilders.StringProp.Builder();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.StringProp build();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.StringProp.Builder setValue(String);
-  }
-
-}
-
diff --git a/wear/tiles/tiles/api/res-1.5.0-beta01.txt b/wear/tiles/tiles/api/res-1.5.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/wear/tiles/tiles/api/res-1.5.0-beta01.txt
+++ /dev/null
diff --git a/wear/tiles/tiles/api/restricted_1.5.0-beta01.txt b/wear/tiles/tiles/api/restricted_1.5.0-beta01.txt
deleted file mode 100644
index f9c99d7..0000000
--- a/wear/tiles/tiles/api/restricted_1.5.0-beta01.txt
+++ /dev/null
@@ -1,1151 +0,0 @@
-// Signature format: 4.0
-package androidx.wear.tiles {
-
-  @Deprecated public final class ActionBuilders {
-    method @Deprecated public static androidx.wear.tiles.ActionBuilders.AndroidBooleanExtra booleanExtra(boolean);
-    method @Deprecated public static androidx.wear.tiles.ActionBuilders.AndroidDoubleExtra doubleExtra(double);
-    method @Deprecated public static androidx.wear.tiles.ActionBuilders.AndroidIntExtra intExtra(int);
-    method @Deprecated public static androidx.wear.tiles.ActionBuilders.AndroidLongExtra longExtra(long);
-    method @Deprecated public static androidx.wear.tiles.ActionBuilders.AndroidStringExtra stringExtra(String);
-  }
-
-  @Deprecated public static interface ActionBuilders.Action {
-  }
-
-  @Deprecated public static interface ActionBuilders.Action.Builder {
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.Action build();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidActivity {
-    method @Deprecated public String getClassName();
-    method @Deprecated public java.util.Map<java.lang.String!,androidx.wear.tiles.ActionBuilders.AndroidExtra!> getKeyToExtraMapping();
-    method @Deprecated public String getPackageName();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidActivity.Builder {
-    ctor @Deprecated public ActionBuilders.AndroidActivity.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidActivity.Builder addKeyToExtraMapping(String, androidx.wear.tiles.ActionBuilders.AndroidExtra);
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidActivity build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidActivity.Builder setClassName(String);
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidActivity.Builder setPackageName(String);
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidBooleanExtra implements androidx.wear.tiles.ActionBuilders.AndroidExtra {
-    method @Deprecated public boolean getValue();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidBooleanExtra.Builder implements androidx.wear.tiles.ActionBuilders.AndroidExtra.Builder {
-    ctor @Deprecated public ActionBuilders.AndroidBooleanExtra.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidBooleanExtra build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidBooleanExtra.Builder setValue(boolean);
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidDoubleExtra implements androidx.wear.tiles.ActionBuilders.AndroidExtra {
-    method @Deprecated public double getValue();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidDoubleExtra.Builder implements androidx.wear.tiles.ActionBuilders.AndroidExtra.Builder {
-    ctor @Deprecated public ActionBuilders.AndroidDoubleExtra.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidDoubleExtra build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidDoubleExtra.Builder setValue(double);
-  }
-
-  @Deprecated public static interface ActionBuilders.AndroidExtra {
-  }
-
-  @Deprecated public static interface ActionBuilders.AndroidExtra.Builder {
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidExtra build();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidIntExtra implements androidx.wear.tiles.ActionBuilders.AndroidExtra {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidIntExtra.Builder implements androidx.wear.tiles.ActionBuilders.AndroidExtra.Builder {
-    ctor @Deprecated public ActionBuilders.AndroidIntExtra.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidIntExtra build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidIntExtra.Builder setValue(int);
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidLongExtra implements androidx.wear.tiles.ActionBuilders.AndroidExtra {
-    method @Deprecated public long getValue();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidLongExtra.Builder implements androidx.wear.tiles.ActionBuilders.AndroidExtra.Builder {
-    ctor @Deprecated public ActionBuilders.AndroidLongExtra.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidLongExtra build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidLongExtra.Builder setValue(long);
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidStringExtra implements androidx.wear.tiles.ActionBuilders.AndroidExtra {
-    method @Deprecated public String getValue();
-  }
-
-  @Deprecated public static final class ActionBuilders.AndroidStringExtra.Builder implements androidx.wear.tiles.ActionBuilders.AndroidExtra.Builder {
-    ctor @Deprecated public ActionBuilders.AndroidStringExtra.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidStringExtra build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidStringExtra.Builder setValue(String);
-  }
-
-  @Deprecated public static final class ActionBuilders.LaunchAction implements androidx.wear.tiles.ActionBuilders.Action {
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.AndroidActivity? getAndroidActivity();
-  }
-
-  @Deprecated public static final class ActionBuilders.LaunchAction.Builder implements androidx.wear.tiles.ActionBuilders.Action.Builder {
-    ctor @Deprecated public ActionBuilders.LaunchAction.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.LaunchAction build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.LaunchAction.Builder setAndroidActivity(androidx.wear.tiles.ActionBuilders.AndroidActivity);
-  }
-
-  @Deprecated public static final class ActionBuilders.LoadAction implements androidx.wear.tiles.ActionBuilders.Action {
-    method @Deprecated public androidx.wear.tiles.StateBuilders.State? getRequestState();
-  }
-
-  @Deprecated public static final class ActionBuilders.LoadAction.Builder implements androidx.wear.tiles.ActionBuilders.Action.Builder {
-    ctor @Deprecated public ActionBuilders.LoadAction.Builder();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.LoadAction build();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.LoadAction.Builder setRequestState(androidx.wear.tiles.StateBuilders.State);
-  }
-
-  public final class ActiveTileIdentifier {
-    ctor public ActiveTileIdentifier(android.content.ComponentName, int);
-    method public android.content.ComponentName getComponentName();
-    method public int getInstanceId();
-  }
-
-  @Deprecated public final class ColorBuilders {
-    method @Deprecated public static androidx.wear.tiles.ColorBuilders.ColorProp argb(@ColorInt int);
-  }
-
-  @Deprecated public static final class ColorBuilders.ColorProp {
-    method @Deprecated @ColorInt public int getArgb();
-  }
-
-  @Deprecated public static final class ColorBuilders.ColorProp.Builder {
-    ctor @Deprecated public ColorBuilders.ColorProp.Builder();
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp build();
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp.Builder setArgb(@ColorInt int);
-  }
-
-  @Deprecated public final class DeviceParametersBuilders {
-    field @Deprecated public static final int DEVICE_PLATFORM_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int DEVICE_PLATFORM_WEAR_OS = 1; // 0x1
-    field @Deprecated public static final int SCREEN_SHAPE_RECT = 2; // 0x2
-    field @Deprecated public static final int SCREEN_SHAPE_ROUND = 1; // 0x1
-    field @Deprecated public static final int SCREEN_SHAPE_UNDEFINED = 0; // 0x0
-  }
-
-  @Deprecated public static final class DeviceParametersBuilders.DeviceParameters {
-    method @Deprecated public int getDevicePlatform();
-    method @Deprecated @FloatRange(from=0.0, fromInclusive=false, toInclusive=false) public float getScreenDensity();
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.DP) public int getScreenHeightDp();
-    method @Deprecated public int getScreenShape();
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.DP) public int getScreenWidthDp();
-  }
-
-  @Deprecated public static final class DeviceParametersBuilders.DeviceParameters.Builder {
-    ctor @Deprecated public DeviceParametersBuilders.DeviceParameters.Builder();
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters build();
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.Builder setDevicePlatform(int);
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.Builder setScreenDensity(@FloatRange(from=0.0, fromInclusive=false, toInclusive=false) float);
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.Builder setScreenHeightDp(@Dimension(unit=androidx.annotation.Dimension.DP) int);
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.Builder setScreenShape(int);
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.Builder setScreenWidthDp(@Dimension(unit=androidx.annotation.Dimension.DP) int);
-  }
-
-  @Deprecated public final class DimensionBuilders {
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.DegreesProp degrees(float);
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.DpProp dp(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.EmProp em(float);
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.EmProp em(int);
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.ExpandedDimensionProp expand();
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.SpProp sp(@Dimension(unit=androidx.annotation.Dimension.SP) float);
-    method @Deprecated public static androidx.wear.tiles.DimensionBuilders.WrappedDimensionProp wrap();
-  }
-
-  @Deprecated public static interface DimensionBuilders.ContainerDimension {
-  }
-
-  @Deprecated public static interface DimensionBuilders.ContainerDimension.Builder {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension build();
-  }
-
-  @Deprecated public static final class DimensionBuilders.DegreesProp {
-    method @Deprecated public float getValue();
-  }
-
-  @Deprecated public static final class DimensionBuilders.DegreesProp.Builder {
-    ctor @Deprecated public DimensionBuilders.DegreesProp.Builder();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp build();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp.Builder setValue(float);
-  }
-
-  @Deprecated public static final class DimensionBuilders.DpProp implements androidx.wear.tiles.DimensionBuilders.ContainerDimension androidx.wear.tiles.DimensionBuilders.ImageDimension androidx.wear.tiles.DimensionBuilders.SpacerDimension {
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.DP) public float getValue();
-  }
-
-  @Deprecated public static final class DimensionBuilders.DpProp.Builder implements androidx.wear.tiles.DimensionBuilders.ContainerDimension.Builder androidx.wear.tiles.DimensionBuilders.ImageDimension.Builder androidx.wear.tiles.DimensionBuilders.SpacerDimension.Builder {
-    ctor @Deprecated public DimensionBuilders.DpProp.Builder();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp build();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp.Builder setValue(@Dimension(unit=androidx.annotation.Dimension.DP) float);
-  }
-
-  @Deprecated public static final class DimensionBuilders.EmProp {
-    method @Deprecated public float getValue();
-  }
-
-  @Deprecated public static final class DimensionBuilders.EmProp.Builder {
-    ctor @Deprecated public DimensionBuilders.EmProp.Builder();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.EmProp build();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.EmProp.Builder setValue(float);
-  }
-
-  @Deprecated public static final class DimensionBuilders.ExpandedDimensionProp implements androidx.wear.tiles.DimensionBuilders.ContainerDimension androidx.wear.tiles.DimensionBuilders.ImageDimension {
-  }
-
-  @Deprecated public static final class DimensionBuilders.ExpandedDimensionProp.Builder implements androidx.wear.tiles.DimensionBuilders.ContainerDimension.Builder androidx.wear.tiles.DimensionBuilders.ImageDimension.Builder {
-    ctor @Deprecated public DimensionBuilders.ExpandedDimensionProp.Builder();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ExpandedDimensionProp build();
-  }
-
-  @Deprecated public static interface DimensionBuilders.ImageDimension {
-  }
-
-  @Deprecated public static interface DimensionBuilders.ImageDimension.Builder {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ImageDimension build();
-  }
-
-  @Deprecated public static final class DimensionBuilders.ProportionalDimensionProp implements androidx.wear.tiles.DimensionBuilders.ImageDimension {
-    method @Deprecated @IntRange(from=0) public int getAspectRatioHeight();
-    method @Deprecated @IntRange(from=0) public int getAspectRatioWidth();
-  }
-
-  @Deprecated public static final class DimensionBuilders.ProportionalDimensionProp.Builder implements androidx.wear.tiles.DimensionBuilders.ImageDimension.Builder {
-    ctor @Deprecated public DimensionBuilders.ProportionalDimensionProp.Builder();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ProportionalDimensionProp build();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ProportionalDimensionProp.Builder setAspectRatioHeight(@IntRange(from=0) int);
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ProportionalDimensionProp.Builder setAspectRatioWidth(@IntRange(from=0) int);
-  }
-
-  @Deprecated public static final class DimensionBuilders.SpProp {
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.SP) public float getValue();
-  }
-
-  @Deprecated public static final class DimensionBuilders.SpProp.Builder {
-    ctor @Deprecated public DimensionBuilders.SpProp.Builder();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpProp build();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpProp.Builder setValue(@Dimension(unit=androidx.annotation.Dimension.SP) float);
-  }
-
-  @Deprecated public static interface DimensionBuilders.SpacerDimension {
-  }
-
-  @Deprecated public static interface DimensionBuilders.SpacerDimension.Builder {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpacerDimension build();
-  }
-
-  @Deprecated public static final class DimensionBuilders.WrappedDimensionProp implements androidx.wear.tiles.DimensionBuilders.ContainerDimension {
-  }
-
-  @Deprecated public static final class DimensionBuilders.WrappedDimensionProp.Builder implements androidx.wear.tiles.DimensionBuilders.ContainerDimension.Builder {
-    ctor @Deprecated public DimensionBuilders.WrappedDimensionProp.Builder();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.WrappedDimensionProp build();
-  }
-
-  public final class EventBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class EventBuilders.TileAddEvent {
-    method public int getTileId();
-  }
-
-  public static final class EventBuilders.TileAddEvent.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public EventBuilders.TileAddEvent.Builder();
-    method public androidx.wear.tiles.EventBuilders.TileAddEvent build();
-    method public androidx.wear.tiles.EventBuilders.TileAddEvent.Builder setTileId(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class EventBuilders.TileEnterEvent {
-    method public int getTileId();
-  }
-
-  public static final class EventBuilders.TileEnterEvent.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public EventBuilders.TileEnterEvent.Builder();
-    method public androidx.wear.tiles.EventBuilders.TileEnterEvent build();
-    method public androidx.wear.tiles.EventBuilders.TileEnterEvent.Builder setTileId(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public static final class EventBuilders.TileInteractionEvent {
-    method public int getEventType();
-    method public int getTileId();
-    method public java.time.Instant getTimestamp();
-    field public static final int ENTER = 1; // 0x1
-    field public static final int LEAVE = 2; // 0x2
-    field public static final int UNKNOWN = 0; // 0x0
-  }
-
-  public static final class EventBuilders.TileInteractionEvent.Builder {
-    ctor public EventBuilders.TileInteractionEvent.Builder(int, int);
-    method public androidx.wear.tiles.EventBuilders.TileInteractionEvent build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=400) public androidx.wear.tiles.EventBuilders.TileInteractionEvent.Builder setTimestamp(java.time.Instant);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class EventBuilders.TileLeaveEvent {
-    method public int getTileId();
-  }
-
-  public static final class EventBuilders.TileLeaveEvent.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public EventBuilders.TileLeaveEvent.Builder();
-    method public androidx.wear.tiles.EventBuilders.TileLeaveEvent build();
-    method public androidx.wear.tiles.EventBuilders.TileLeaveEvent.Builder setTileId(int);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class EventBuilders.TileRemoveEvent {
-    method public int getTileId();
-  }
-
-  public static final class EventBuilders.TileRemoveEvent.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public EventBuilders.TileRemoveEvent.Builder();
-    method public androidx.wear.tiles.EventBuilders.TileRemoveEvent build();
-    method public androidx.wear.tiles.EventBuilders.TileRemoveEvent.Builder setTileId(int);
-  }
-
-  @Deprecated public final class LayoutElementBuilders {
-    field @Deprecated public static final int ARC_ANCHOR_CENTER = 2; // 0x2
-    field @Deprecated public static final int ARC_ANCHOR_END = 3; // 0x3
-    field @Deprecated public static final int ARC_ANCHOR_START = 1; // 0x1
-    field @Deprecated public static final int ARC_ANCHOR_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int CONTENT_SCALE_MODE_CROP = 2; // 0x2
-    field @Deprecated public static final int CONTENT_SCALE_MODE_FILL_BOUNDS = 3; // 0x3
-    field @Deprecated public static final int CONTENT_SCALE_MODE_FIT = 1; // 0x1
-    field @Deprecated public static final int CONTENT_SCALE_MODE_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int FONT_VARIANT_BODY = 2; // 0x2
-    field @Deprecated public static final int FONT_VARIANT_TITLE = 1; // 0x1
-    field @Deprecated public static final int FONT_VARIANT_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int FONT_WEIGHT_BOLD = 700; // 0x2bc
-    field @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public static final int FONT_WEIGHT_MEDIUM = 500; // 0x1f4
-    field @Deprecated public static final int FONT_WEIGHT_NORMAL = 400; // 0x190
-    field @Deprecated public static final int FONT_WEIGHT_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int HORIZONTAL_ALIGN_CENTER = 2; // 0x2
-    field @Deprecated public static final int HORIZONTAL_ALIGN_END = 5; // 0x5
-    field @Deprecated public static final int HORIZONTAL_ALIGN_LEFT = 1; // 0x1
-    field @Deprecated public static final int HORIZONTAL_ALIGN_RIGHT = 3; // 0x3
-    field @Deprecated public static final int HORIZONTAL_ALIGN_START = 4; // 0x4
-    field @Deprecated public static final int HORIZONTAL_ALIGN_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int SPAN_VERTICAL_ALIGN_BOTTOM = 1; // 0x1
-    field @Deprecated public static final int SPAN_VERTICAL_ALIGN_TEXT_BASELINE = 2; // 0x2
-    field @Deprecated public static final int SPAN_VERTICAL_ALIGN_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int TEXT_ALIGN_CENTER = 2; // 0x2
-    field @Deprecated public static final int TEXT_ALIGN_END = 3; // 0x3
-    field @Deprecated public static final int TEXT_ALIGN_START = 1; // 0x1
-    field @Deprecated public static final int TEXT_ALIGN_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int TEXT_OVERFLOW_ELLIPSIZE_END = 2; // 0x2
-    field @Deprecated public static final int TEXT_OVERFLOW_TRUNCATE = 1; // 0x1
-    field @Deprecated public static final int TEXT_OVERFLOW_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int VERTICAL_ALIGN_BOTTOM = 3; // 0x3
-    field @Deprecated public static final int VERTICAL_ALIGN_CENTER = 2; // 0x2
-    field @Deprecated public static final int VERTICAL_ALIGN_TOP = 1; // 0x1
-    field @Deprecated public static final int VERTICAL_ALIGN_UNDEFINED = 0; // 0x0
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Arc implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp? getAnchorAngle();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcAnchorTypeProp? getAnchorType();
-    method @Deprecated public java.util.List<androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement!> getContents();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp? getVerticalAlign();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Arc.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Arc.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc.Builder addContent(androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc.Builder setAnchorAngle(androidx.wear.tiles.DimensionBuilders.DegreesProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc.Builder setAnchorType(androidx.wear.tiles.LayoutElementBuilders.ArcAnchorTypeProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc.Builder setAnchorType(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc.Builder setVerticalAlign(androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Arc.Builder setVerticalAlign(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcAdapter implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getContent();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.BoolProp? getRotateContents();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcAdapter.Builder implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.ArcAdapter.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcAdapter build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcAdapter.Builder setContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcAdapter.Builder setRotateContents(androidx.wear.tiles.TypeBuilders.BoolProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcAdapter.Builder setRotateContents(boolean);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcAnchorTypeProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcAnchorTypeProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.ArcAnchorTypeProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcAnchorTypeProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcAnchorTypeProp.Builder setValue(int);
-  }
-
-  @Deprecated public static interface LayoutElementBuilders.ArcLayoutElement {
-  }
-
-  @Deprecated public static interface LayoutElementBuilders.ArcLayoutElement.Builder {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement build();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcLine implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement {
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp? getColor();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp? getLength();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ArcModifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getThickness();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcLine.Builder implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.ArcLine.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcLine build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcLine.Builder setColor(androidx.wear.tiles.ColorBuilders.ColorProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcLine.Builder setLength(androidx.wear.tiles.DimensionBuilders.DegreesProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcLine.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.ArcModifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcLine.Builder setThickness(androidx.wear.tiles.DimensionBuilders.DpProp);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcSpacer implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DegreesProp? getLength();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ArcModifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getThickness();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcSpacer.Builder implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.ArcSpacer.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcSpacer build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcSpacer.Builder setLength(androidx.wear.tiles.DimensionBuilders.DegreesProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcSpacer.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.ArcModifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcSpacer.Builder setThickness(androidx.wear.tiles.DimensionBuilders.DpProp);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcText implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle? getFontStyle();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ArcModifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.StringProp? getText();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ArcText.Builder implements androidx.wear.tiles.LayoutElementBuilders.ArcLayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.ArcText.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcText build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcText.Builder setFontStyle(androidx.wear.tiles.LayoutElementBuilders.FontStyle);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcText.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.ArcModifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcText.Builder setText(androidx.wear.tiles.TypeBuilders.StringProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ArcText.Builder setText(String);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Box implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public java.util.List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement!> getContents();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension? getHeight();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp? getHorizontalAlignment();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp? getVerticalAlignment();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension? getWidth();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Box.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Box.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder addContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder setHeight(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder setHorizontalAlignment(androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder setHorizontalAlignment(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder setVerticalAlignment(androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder setVerticalAlignment(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Box.Builder setWidth(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ColorFilter {
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp? getTint();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ColorFilter.Builder {
-    ctor @Deprecated public LayoutElementBuilders.ColorFilter.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ColorFilter build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ColorFilter.Builder setTint(androidx.wear.tiles.ColorBuilders.ColorProp);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Column implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public java.util.List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement!> getContents();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension? getHeight();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp? getHorizontalAlignment();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension? getWidth();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Column.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Column.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Column.Builder addContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Column build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Column.Builder setHeight(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Column.Builder setHorizontalAlignment(androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Column.Builder setHorizontalAlignment(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Column.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Column.Builder setWidth(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ContentScaleModeProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.ContentScaleModeProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.ContentScaleModeProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ContentScaleModeProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ContentScaleModeProp.Builder setValue(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.FontStyle {
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp? getColor();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.BoolProp? getItalic();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.EmProp? getLetterSpacing();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpProp? getSize();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.BoolProp? getUnderline();
-    method @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public androidx.wear.tiles.LayoutElementBuilders.FontVariantProp? getVariant();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontWeightProp? getWeight();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.FontStyle.Builder {
-    ctor @Deprecated public LayoutElementBuilders.FontStyle.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setColor(androidx.wear.tiles.ColorBuilders.ColorProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setItalic(androidx.wear.tiles.TypeBuilders.BoolProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setItalic(boolean);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setLetterSpacing(androidx.wear.tiles.DimensionBuilders.EmProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setSize(androidx.wear.tiles.DimensionBuilders.SpProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setUnderline(androidx.wear.tiles.TypeBuilders.BoolProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setUnderline(boolean);
-    method @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setVariant(androidx.wear.tiles.LayoutElementBuilders.FontVariantProp);
-    method @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setVariant(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setWeight(androidx.wear.tiles.LayoutElementBuilders.FontWeightProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder setWeight(int);
-  }
-
-  @Deprecated public static class LayoutElementBuilders.FontStyles {
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder body1(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder body2(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder button(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder caption1(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder caption2(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder display1(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder display2(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder display3(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder title1(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder title2(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder title3(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-  }
-
-  @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public static final class LayoutElementBuilders.FontVariantProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.FontVariantProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.FontVariantProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontVariantProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontVariantProp.Builder setValue(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.FontWeightProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.FontWeightProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.FontWeightProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontWeightProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontWeightProp.Builder setValue(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.HorizontalAlignmentProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.HorizontalAlignmentProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.HorizontalAlignmentProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp.Builder setValue(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Image implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ColorFilter? getColorFilter();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.ContentScaleModeProp? getContentScaleMode();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ImageDimension? getHeight();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.StringProp? getResourceId();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ImageDimension? getWidth();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Image.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Image.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setColorFilter(androidx.wear.tiles.LayoutElementBuilders.ColorFilter);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setContentScaleMode(androidx.wear.tiles.LayoutElementBuilders.ContentScaleModeProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setContentScaleMode(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setHeight(androidx.wear.tiles.DimensionBuilders.ImageDimension);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setResourceId(androidx.wear.tiles.TypeBuilders.StringProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setResourceId(String);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Image.Builder setWidth(androidx.wear.tiles.DimensionBuilders.ImageDimension);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Layout {
-    method @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public static androidx.wear.tiles.LayoutElementBuilders.Layout? fromByteArray(byte[]);
-    method @Deprecated public static androidx.wear.tiles.LayoutElementBuilders.Layout fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement? getRoot();
-    method @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public byte[] toByteArray();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Layout.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Layout.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Layout build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Layout.Builder setRoot(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-  }
-
-  @Deprecated public static interface LayoutElementBuilders.LayoutElement {
-  }
-
-  @Deprecated public static interface LayoutElementBuilders.LayoutElement.Builder {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.LayoutElement build();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Row implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public java.util.List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement!> getContents();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension? getHeight();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp? getVerticalAlignment();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.ContainerDimension? getWidth();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Row.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Row.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Row.Builder addContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Row build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Row.Builder setHeight(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Row.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Row.Builder setVerticalAlignment(androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Row.Builder setVerticalAlignment(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Row.Builder setWidth(androidx.wear.tiles.DimensionBuilders.ContainerDimension);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Spacer implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpacerDimension? getHeight();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpacerDimension? getWidth();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Spacer.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Spacer.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spacer build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spacer.Builder setHeight(androidx.wear.tiles.DimensionBuilders.SpacerDimension);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spacer.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spacer.Builder setWidth(androidx.wear.tiles.DimensionBuilders.SpacerDimension);
-  }
-
-  @Deprecated public static interface LayoutElementBuilders.Span {
-  }
-
-  @Deprecated public static interface LayoutElementBuilders.Span.Builder {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Span build();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.SpanImage implements androidx.wear.tiles.LayoutElementBuilders.Span {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanVerticalAlignmentProp? getAlignment();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getHeight();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.SpanModifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.StringProp? getResourceId();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getWidth();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.SpanImage.Builder implements androidx.wear.tiles.LayoutElementBuilders.Span.Builder {
-    ctor @Deprecated public LayoutElementBuilders.SpanImage.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage.Builder setAlignment(androidx.wear.tiles.LayoutElementBuilders.SpanVerticalAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage.Builder setAlignment(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage.Builder setHeight(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.SpanModifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage.Builder setResourceId(androidx.wear.tiles.TypeBuilders.StringProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage.Builder setResourceId(String);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanImage.Builder setWidth(androidx.wear.tiles.DimensionBuilders.DpProp);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.SpanText implements androidx.wear.tiles.LayoutElementBuilders.Span {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle? getFontStyle();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.SpanModifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.StringProp? getText();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.SpanText.Builder implements androidx.wear.tiles.LayoutElementBuilders.Span.Builder {
-    ctor @Deprecated public LayoutElementBuilders.SpanText.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanText build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanText.Builder setFontStyle(androidx.wear.tiles.LayoutElementBuilders.FontStyle);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanText.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.SpanModifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanText.Builder setText(androidx.wear.tiles.TypeBuilders.StringProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanText.Builder setText(String);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.SpanVerticalAlignmentProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.SpanVerticalAlignmentProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.SpanVerticalAlignmentProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanVerticalAlignmentProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.SpanVerticalAlignmentProp.Builder setValue(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Spannable implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpProp? getLineHeight();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.Int32Prop? getMaxLines();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp? getMultilineAlignment();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.TextOverflowProp? getOverflow();
-    method @Deprecated public java.util.List<androidx.wear.tiles.LayoutElementBuilders.Span!> getSpans();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Spannable.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Spannable.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder addSpan(androidx.wear.tiles.LayoutElementBuilders.Span);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setLineHeight(androidx.wear.tiles.DimensionBuilders.SpProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setMaxLines(androidx.wear.tiles.TypeBuilders.Int32Prop);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setMaxLines(@IntRange(from=1) int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setMultilineAlignment(androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setMultilineAlignment(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setOverflow(androidx.wear.tiles.LayoutElementBuilders.TextOverflowProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Spannable.Builder setOverflow(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Text implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.FontStyle? getFontStyle();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.SpProp? getLineHeight();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.Int32Prop? getMaxLines();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers? getModifiers();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.TextAlignmentProp? getMultilineAlignment();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.TextOverflowProp? getOverflow();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.StringProp? getText();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.Text.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-    ctor @Deprecated public LayoutElementBuilders.Text.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setFontStyle(androidx.wear.tiles.LayoutElementBuilders.FontStyle);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setLineHeight(androidx.wear.tiles.DimensionBuilders.SpProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setMaxLines(androidx.wear.tiles.TypeBuilders.Int32Prop);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setMaxLines(@IntRange(from=1) int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setModifiers(androidx.wear.tiles.ModifiersBuilders.Modifiers);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setMultilineAlignment(androidx.wear.tiles.LayoutElementBuilders.TextAlignmentProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setMultilineAlignment(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setOverflow(androidx.wear.tiles.LayoutElementBuilders.TextOverflowProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setOverflow(int);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setText(androidx.wear.tiles.TypeBuilders.StringProp);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Text.Builder setText(String);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.TextAlignmentProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.TextAlignmentProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.TextAlignmentProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.TextAlignmentProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.TextAlignmentProp.Builder setValue(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.TextOverflowProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.TextOverflowProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.TextOverflowProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.TextOverflowProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.TextOverflowProp.Builder setValue(int);
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.VerticalAlignmentProp {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class LayoutElementBuilders.VerticalAlignmentProp.Builder {
-    ctor @Deprecated public LayoutElementBuilders.VerticalAlignmentProp.Builder();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp build();
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.VerticalAlignmentProp.Builder setValue(int);
-  }
-
-  @Deprecated public final class ModifiersBuilders {
-  }
-
-  @Deprecated public static final class ModifiersBuilders.ArcModifiers {
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable? getClickable();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Semantics? getSemantics();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.ArcModifiers.Builder {
-    ctor @Deprecated public ModifiersBuilders.ArcModifiers.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ArcModifiers build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ArcModifiers.Builder setClickable(androidx.wear.tiles.ModifiersBuilders.Clickable);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ArcModifiers.Builder setSemantics(androidx.wear.tiles.ModifiersBuilders.Semantics);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Background {
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp? getColor();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Corner? getCorner();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Background.Builder {
-    ctor @Deprecated public ModifiersBuilders.Background.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Background build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Background.Builder setColor(androidx.wear.tiles.ColorBuilders.ColorProp);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Background.Builder setCorner(androidx.wear.tiles.ModifiersBuilders.Corner);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Border {
-    method @Deprecated public androidx.wear.tiles.ColorBuilders.ColorProp? getColor();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getWidth();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Border.Builder {
-    ctor @Deprecated public ModifiersBuilders.Border.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Border build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Border.Builder setColor(androidx.wear.tiles.ColorBuilders.ColorProp);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Border.Builder setWidth(androidx.wear.tiles.DimensionBuilders.DpProp);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Clickable {
-    method @Deprecated public String getId();
-    method @Deprecated public androidx.wear.tiles.ActionBuilders.Action? getOnClick();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Clickable.Builder {
-    ctor @Deprecated public ModifiersBuilders.Clickable.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable.Builder setId(String);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable.Builder setOnClick(androidx.wear.tiles.ActionBuilders.Action);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Corner {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getRadius();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Corner.Builder {
-    ctor @Deprecated public ModifiersBuilders.Corner.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Corner build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Corner.Builder setRadius(androidx.wear.tiles.DimensionBuilders.DpProp);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.ElementMetadata {
-    method @Deprecated public byte[] getTagData();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.ElementMetadata.Builder {
-    ctor @Deprecated public ModifiersBuilders.ElementMetadata.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ElementMetadata build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ElementMetadata.Builder setTagData(byte[]);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Modifiers {
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Background? getBackground();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Border? getBorder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable? getClickable();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.ElementMetadata? getMetadata();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding? getPadding();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Semantics? getSemantics();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Modifiers.Builder {
-    ctor @Deprecated public ModifiersBuilders.Modifiers.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder setBackground(androidx.wear.tiles.ModifiersBuilders.Background);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder setBorder(androidx.wear.tiles.ModifiersBuilders.Border);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder setClickable(androidx.wear.tiles.ModifiersBuilders.Clickable);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder setMetadata(androidx.wear.tiles.ModifiersBuilders.ElementMetadata);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder setPadding(androidx.wear.tiles.ModifiersBuilders.Padding);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder setSemantics(androidx.wear.tiles.ModifiersBuilders.Semantics);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Padding {
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getBottom();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getEnd();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.BoolProp? getRtlAware();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getStart();
-    method @Deprecated public androidx.wear.tiles.DimensionBuilders.DpProp? getTop();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Padding.Builder {
-    ctor @Deprecated public ModifiersBuilders.Padding.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding.Builder setAll(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding.Builder setBottom(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding.Builder setEnd(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding.Builder setRtlAware(androidx.wear.tiles.TypeBuilders.BoolProp);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding.Builder setRtlAware(boolean);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding.Builder setStart(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Padding.Builder setTop(androidx.wear.tiles.DimensionBuilders.DpProp);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Semantics {
-    method @Deprecated public String getContentDescription();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.Semantics.Builder {
-    ctor @Deprecated public ModifiersBuilders.Semantics.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Semantics build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Semantics.Builder setContentDescription(String);
-  }
-
-  @Deprecated public static final class ModifiersBuilders.SpanModifiers {
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.Clickable? getClickable();
-  }
-
-  @Deprecated public static final class ModifiersBuilders.SpanModifiers.Builder {
-    ctor @Deprecated public ModifiersBuilders.SpanModifiers.Builder();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.SpanModifiers build();
-    method @Deprecated public androidx.wear.tiles.ModifiersBuilders.SpanModifiers.Builder setClickable(androidx.wear.tiles.ModifiersBuilders.Clickable);
-  }
-
-  public final class RequestBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class RequestBuilders.ResourcesRequest {
-    method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters getDeviceConfiguration();
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters? getDeviceParameters();
-    method public java.util.List<java.lang.String!> getResourceIds();
-    method public int getTileId();
-    method public String getVersion();
-  }
-
-  public static final class RequestBuilders.ResourcesRequest.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public RequestBuilders.ResourcesRequest.Builder();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.RequestBuilders.ResourcesRequest.Builder addResourceId(String);
-    method public androidx.wear.tiles.RequestBuilders.ResourcesRequest build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.RequestBuilders.ResourcesRequest.Builder setDeviceConfiguration(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.RequestBuilders.ResourcesRequest.Builder setDeviceParameters(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.RequestBuilders.ResourcesRequest.Builder setTileId(int);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.RequestBuilders.ResourcesRequest.Builder setVersion(String);
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class RequestBuilders.TileRequest {
-    method public androidx.wear.protolayout.StateBuilders.State getCurrentState();
-    method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters getDeviceConfiguration();
-    method @Deprecated public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters? getDeviceParameters();
-    method @Deprecated public androidx.wear.tiles.StateBuilders.State? getState();
-    method public int getTileId();
-  }
-
-  public static final class RequestBuilders.TileRequest.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public RequestBuilders.TileRequest.Builder();
-    method public androidx.wear.tiles.RequestBuilders.TileRequest build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.RequestBuilders.TileRequest.Builder setCurrentState(androidx.wear.protolayout.StateBuilders.State);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.RequestBuilders.TileRequest.Builder setDeviceConfiguration(androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.RequestBuilders.TileRequest.Builder setDeviceParameters(androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
-    method @Deprecated public androidx.wear.tiles.RequestBuilders.TileRequest.Builder setState(androidx.wear.tiles.StateBuilders.State);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.RequestBuilders.TileRequest.Builder setTileId(int);
-  }
-
-  @Deprecated public final class ResourceBuilders {
-    field @Deprecated public static final int IMAGE_FORMAT_RGB_565 = 1; // 0x1
-    field @Deprecated public static final int IMAGE_FORMAT_UNDEFINED = 0; // 0x0
-  }
-
-  @Deprecated public static final class ResourceBuilders.AndroidImageResourceByResId {
-    method @Deprecated @DrawableRes public int getResourceId();
-  }
-
-  @Deprecated public static final class ResourceBuilders.AndroidImageResourceByResId.Builder {
-    ctor @Deprecated public ResourceBuilders.AndroidImageResourceByResId.Builder();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.AndroidImageResourceByResId build();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.AndroidImageResourceByResId.Builder setResourceId(@DrawableRes int);
-  }
-
-  @Deprecated public static final class ResourceBuilders.ImageResource {
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.AndroidImageResourceByResId? getAndroidResourceByResId();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.InlineImageResource? getInlineResource();
-  }
-
-  @Deprecated public static final class ResourceBuilders.ImageResource.Builder {
-    ctor @Deprecated public ResourceBuilders.ImageResource.Builder();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.ImageResource build();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.ImageResource.Builder setAndroidResourceByResId(androidx.wear.tiles.ResourceBuilders.AndroidImageResourceByResId);
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.ImageResource.Builder setInlineResource(androidx.wear.tiles.ResourceBuilders.InlineImageResource);
-  }
-
-  @Deprecated public static final class ResourceBuilders.InlineImageResource {
-    method @Deprecated public byte[] getData();
-    method @Deprecated public int getFormat();
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.PX) public int getHeightPx();
-    method @Deprecated @Dimension(unit=androidx.annotation.Dimension.PX) public int getWidthPx();
-  }
-
-  @Deprecated public static final class ResourceBuilders.InlineImageResource.Builder {
-    ctor @Deprecated public ResourceBuilders.InlineImageResource.Builder();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.InlineImageResource build();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.InlineImageResource.Builder setData(byte[]);
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.InlineImageResource.Builder setFormat(int);
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.InlineImageResource.Builder setHeightPx(@Dimension(unit=androidx.annotation.Dimension.PX) int);
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.InlineImageResource.Builder setWidthPx(@Dimension(unit=androidx.annotation.Dimension.PX) int);
-  }
-
-  @Deprecated public static final class ResourceBuilders.Resources {
-    method @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public static androidx.wear.tiles.ResourceBuilders.Resources? fromByteArray(byte[]);
-    method @Deprecated public java.util.Map<java.lang.String!,androidx.wear.tiles.ResourceBuilders.ImageResource!> getIdToImageMapping();
-    method @Deprecated public String getVersion();
-    method @Deprecated @SuppressCompatibility @androidx.wear.tiles.TilesExperimental public byte[] toByteArray();
-  }
-
-  @Deprecated public static final class ResourceBuilders.Resources.Builder {
-    ctor @Deprecated public ResourceBuilders.Resources.Builder();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.Resources.Builder addIdToImageMapping(String, androidx.wear.tiles.ResourceBuilders.ImageResource);
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.Resources build();
-    method @Deprecated public androidx.wear.tiles.ResourceBuilders.Resources.Builder setVersion(String);
-  }
-
-  @Deprecated public final class StateBuilders {
-  }
-
-  @Deprecated public static final class StateBuilders.State {
-    method @Deprecated public String getLastClickableId();
-  }
-
-  @Deprecated public static final class StateBuilders.State.Builder {
-    ctor @Deprecated public StateBuilders.State.Builder();
-    method @Deprecated public androidx.wear.tiles.StateBuilders.State build();
-  }
-
-  public final class TileBuilders {
-  }
-
-  @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public static final class TileBuilders.Tile {
-    method public long getFreshnessIntervalMillis();
-    method public String getResourcesVersion();
-    method public androidx.wear.protolayout.StateBuilders.State? getState();
-    method public androidx.wear.protolayout.TimelineBuilders.Timeline? getTileTimeline();
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.Timeline? getTimeline();
-  }
-
-  public static final class TileBuilders.Tile.Builder {
-    ctor @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public TileBuilders.Tile.Builder();
-    method public androidx.wear.tiles.TileBuilders.Tile build();
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.TileBuilders.Tile.Builder setFreshnessIntervalMillis(long);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.TileBuilders.Tile.Builder setResourcesVersion(String);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=200) public androidx.wear.tiles.TileBuilders.Tile.Builder setState(androidx.wear.protolayout.StateBuilders.State);
-    method @androidx.wear.protolayout.expression.RequiresSchemaVersion(major=1, minor=0) public androidx.wear.tiles.TileBuilders.Tile.Builder setTileTimeline(androidx.wear.protolayout.TimelineBuilders.Timeline);
-    method @Deprecated public androidx.wear.tiles.TileBuilders.Tile.Builder setTimeline(androidx.wear.tiles.TimelineBuilders.Timeline);
-  }
-
-  public abstract class TileService extends android.app.Service {
-    ctor public TileService();
-    method public static com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.wear.tiles.ActiveTileIdentifier!>!> getActiveTilesAsync(android.content.Context, java.util.concurrent.Executor);
-    method public static androidx.wear.tiles.TileUpdateRequester getUpdater(android.content.Context);
-    method public android.os.IBinder? onBind(android.content.Intent);
-    method @MainThread protected com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> onRecentInteractionEventsAsync(java.util.List<androidx.wear.tiles.EventBuilders.TileInteractionEvent!>);
-    method @Deprecated @MainThread protected com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources!> onResourcesRequest(androidx.wear.tiles.RequestBuilders.ResourcesRequest);
-    method @MainThread protected void onTileAddEvent(androidx.wear.tiles.EventBuilders.TileAddEvent);
-    method @Deprecated @MainThread protected void onTileEnterEvent(androidx.wear.tiles.EventBuilders.TileEnterEvent);
-    method @Deprecated @MainThread protected void onTileLeaveEvent(androidx.wear.tiles.EventBuilders.TileLeaveEvent);
-    method @MainThread protected void onTileRemoveEvent(androidx.wear.tiles.EventBuilders.TileRemoveEvent);
-    method @MainThread protected abstract com.google.common.util.concurrent.ListenableFuture<androidx.wear.tiles.TileBuilders.Tile!> onTileRequest(androidx.wear.tiles.RequestBuilders.TileRequest);
-    method @MainThread protected com.google.common.util.concurrent.ListenableFuture<androidx.wear.protolayout.ResourceBuilders.Resources!> onTileResourcesRequest(androidx.wear.tiles.RequestBuilders.ResourcesRequest);
-    field public static final String ACTION_BIND_TILE_PROVIDER = "androidx.wear.tiles.action.BIND_TILE_PROVIDER";
-    field public static final String EXTRA_CLICKABLE_ID = "androidx.wear.tiles.extra.CLICKABLE_ID";
-    field public static final String METADATA_PREVIEW_KEY = "androidx.wear.tiles.PREVIEW";
-  }
-
-  public interface TileUpdateRequester {
-    method public void requestUpdate(Class<? extends androidx.wear.tiles.TileService!>);
-  }
-
-  @SuppressCompatibility @RequiresOptIn(level=androidx.annotation.RequiresOptIn.Level.ERROR) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD}) public @interface TilesExperimental {
-  }
-
-  @Deprecated public final class TimelineBuilders {
-  }
-
-  @Deprecated public static final class TimelineBuilders.TimeInterval {
-    method @Deprecated public long getEndMillis();
-    method @Deprecated public long getStartMillis();
-  }
-
-  @Deprecated public static final class TimelineBuilders.TimeInterval.Builder {
-    ctor @Deprecated public TimelineBuilders.TimeInterval.Builder();
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.TimeInterval build();
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.TimeInterval.Builder setEndMillis(long);
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.TimeInterval.Builder setStartMillis(long);
-  }
-
-  @Deprecated public static final class TimelineBuilders.Timeline {
-    method @Deprecated public static androidx.wear.tiles.TimelineBuilders.Timeline fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public java.util.List<androidx.wear.tiles.TimelineBuilders.TimelineEntry!> getTimelineEntries();
-  }
-
-  @Deprecated public static final class TimelineBuilders.Timeline.Builder {
-    ctor @Deprecated public TimelineBuilders.Timeline.Builder();
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.Timeline.Builder addTimelineEntry(androidx.wear.tiles.TimelineBuilders.TimelineEntry);
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.Timeline build();
-  }
-
-  @Deprecated public static final class TimelineBuilders.TimelineEntry {
-    method @Deprecated public static androidx.wear.tiles.TimelineBuilders.TimelineEntry fromLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
-    method @Deprecated public androidx.wear.tiles.LayoutElementBuilders.Layout? getLayout();
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.TimeInterval? getValidity();
-  }
-
-  @Deprecated public static final class TimelineBuilders.TimelineEntry.Builder {
-    ctor @Deprecated public TimelineBuilders.TimelineEntry.Builder();
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.TimelineEntry build();
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.TimelineEntry.Builder setLayout(androidx.wear.tiles.LayoutElementBuilders.Layout);
-    method @Deprecated public androidx.wear.tiles.TimelineBuilders.TimelineEntry.Builder setValidity(androidx.wear.tiles.TimelineBuilders.TimeInterval);
-  }
-
-  @Deprecated public final class TypeBuilders {
-  }
-
-  @Deprecated public static final class TypeBuilders.BoolProp {
-    method @Deprecated public boolean getValue();
-  }
-
-  @Deprecated public static final class TypeBuilders.BoolProp.Builder {
-    ctor @Deprecated public TypeBuilders.BoolProp.Builder();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.BoolProp build();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.BoolProp.Builder setValue(boolean);
-  }
-
-  @Deprecated public static final class TypeBuilders.FloatProp {
-    method @Deprecated public float getValue();
-  }
-
-  @Deprecated public static final class TypeBuilders.FloatProp.Builder {
-    ctor @Deprecated public TypeBuilders.FloatProp.Builder();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.FloatProp build();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.FloatProp.Builder setValue(float);
-  }
-
-  @Deprecated public static final class TypeBuilders.Int32Prop {
-    method @Deprecated public int getValue();
-  }
-
-  @Deprecated public static final class TypeBuilders.Int32Prop.Builder {
-    ctor @Deprecated public TypeBuilders.Int32Prop.Builder();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.Int32Prop build();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.Int32Prop.Builder setValue(int);
-  }
-
-  @Deprecated public static final class TypeBuilders.StringProp {
-    method @Deprecated public String getValue();
-  }
-
-  @Deprecated public static final class TypeBuilders.StringProp.Builder {
-    ctor @Deprecated public TypeBuilders.StringProp.Builder();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.StringProp build();
-    method @Deprecated public androidx.wear.tiles.TypeBuilders.StringProp.Builder setValue(String);
-  }
-
-}
-
diff --git a/wear/wear-phone-interactions/src/test/java/androidx/wear/phone/interactions/PhoneTypeHelperTest.kt b/wear/wear-phone-interactions/src/test/java/androidx/wear/phone/interactions/PhoneTypeHelperTest.kt
index 080f45f..57cc0e9 100644
--- a/wear/wear-phone-interactions/src/test/java/androidx/wear/phone/interactions/PhoneTypeHelperTest.kt
+++ b/wear/wear-phone-interactions/src/test/java/androidx/wear/phone/interactions/PhoneTypeHelperTest.kt
@@ -150,6 +150,7 @@
             .isEqualTo(PhoneTypeHelper.DEVICE_TYPE_UNKNOWN)
     }
 
+    @Test
     @Config(sdk = [Build.VERSION_CODES.UPSIDE_DOWN_CAKE])
     fun testGetDeviceType_returnsAndroid_onUWithGreaterTargetSdk() {
         Settings.Global.putInt(
diff --git a/webkit/webkit/api/current.txt b/webkit/webkit/api/current.txt
index 72f140a..c1e111d 100644
--- a/webkit/webkit/api/current.txt
+++ b/webkit/webkit/api/current.txt
@@ -24,20 +24,6 @@
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.WEB_MESSAGE_LISTENER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public abstract void postMessage(String);
   }
 
-  @SuppressCompatibility @androidx.webkit.WebNavigationClient.ExperimentalNavigationCallback public interface Navigation {
-    method public boolean didCommit();
-    method public boolean didCommitErrorPage();
-    method public androidx.webkit.Page? getPage();
-    method public int getStatusCode();
-    method public boolean isBack();
-    method public boolean isForward();
-    method public boolean isHistory();
-    method public boolean isReload();
-    method public boolean isRestore();
-    method public boolean isSameDocument();
-    method public boolean wasInitiatedByPage();
-  }
-
   @SuppressCompatibility @androidx.webkit.Profile.ExperimentalUrlPrefetch public class NoVarySearchHeader {
     method @SuppressCompatibility @androidx.webkit.Profile.ExperimentalUrlPrefetch public static androidx.webkit.NoVarySearchHeader alwaysVaryHeader();
     method @SuppressCompatibility @androidx.webkit.Profile.ExperimentalUrlPrefetch public static androidx.webkit.NoVarySearchHeader neverVaryExcept(boolean, java.util.List<java.lang.String!>);
@@ -54,9 +40,6 @@
     method public void onResult(T!);
   }
 
-  @SuppressCompatibility @androidx.webkit.WebNavigationClient.ExperimentalNavigationCallback public interface Page {
-  }
-
   @SuppressCompatibility @androidx.webkit.Profile.ExperimentalUrlPrefetch public class PrefetchException extends java.lang.Exception {
     ctor public PrefetchException();
     ctor public PrefetchException(String);
@@ -314,19 +297,6 @@
     method public void onMessage(androidx.webkit.WebMessagePortCompat, androidx.webkit.WebMessageCompat?);
   }
 
-  @SuppressCompatibility @androidx.webkit.WebNavigationClient.ExperimentalNavigationCallback public interface WebNavigationClient {
-    method public void onFirstContentfulPaint(androidx.webkit.Page);
-    method public void onNavigationCompleted(androidx.webkit.Navigation);
-    method public void onNavigationRedirected(androidx.webkit.Navigation);
-    method public void onNavigationStarted(androidx.webkit.Navigation);
-    method public void onPageDeleted(androidx.webkit.Page);
-    method public void onPageDomContentLoadedEventFired(androidx.webkit.Page);
-    method public void onPageLoadEventFired(androidx.webkit.Page);
-  }
-
-  @SuppressCompatibility @RequiresOptIn(level=androidx.annotation.RequiresOptIn.Level.ERROR) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD}) public static @interface WebNavigationClient.ExperimentalNavigationCallback {
-  }
-
   public abstract class WebResourceErrorCompat {
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.WEB_RESOURCE_ERROR_GET_DESCRIPTION, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public abstract CharSequence getDescription();
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.WEB_RESOURCE_ERROR_GET_CODE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public abstract int getErrorCode();
@@ -444,7 +414,6 @@
     method @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_PRIVACY_POLICY_URL, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static android.net.Uri getSafeBrowsingPrivacyPolicyUrl();
     method @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.GET_VARIATIONS_HEADER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static String getVariationsHeader();
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.GET_WEB_CHROME_CLIENT, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static android.webkit.WebChromeClient? getWebChromeClient(android.webkit.WebView);
-    method @SuppressCompatibility @RequiresFeature(name=androidx.webkit.WebViewFeature.NAVIGATION_CALLBACK_BASIC, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread @androidx.webkit.WebNavigationClient.ExperimentalNavigationCallback public static androidx.webkit.WebNavigationClient getWebNavigationClient(android.webkit.WebView);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.GET_WEB_VIEW_CLIENT, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static android.webkit.WebViewClient getWebViewClient(android.webkit.WebView);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.GET_WEB_VIEW_RENDERER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static androidx.webkit.WebViewRenderProcess? getWebViewRenderProcess(android.webkit.WebView);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static androidx.webkit.WebViewRenderProcessClient? getWebViewRenderProcessClient(android.webkit.WebView);
@@ -462,7 +431,6 @@
     method @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_ALLOWLIST, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setSafeBrowsingAllowlist(java.util.Set<java.lang.String!>, android.webkit.ValueCallback<java.lang.Boolean!>?);
     method @Deprecated @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_WHITELIST, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setSafeBrowsingWhitelist(java.util.List<java.lang.String!>, android.webkit.ValueCallback<java.lang.Boolean!>?);
     method @SuppressCompatibility @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.CACHE_PROVIDER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @androidx.webkit.WebViewCompat.ExperimentalCacheProvider public static void setShouldCacheProvider(boolean);
-    method @SuppressCompatibility @RequiresFeature(name=androidx.webkit.WebViewFeature.NAVIGATION_CALLBACK_BASIC, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread @androidx.webkit.WebNavigationClient.ExperimentalNavigationCallback public static void setWebNavigationClient(android.webkit.WebView, androidx.webkit.WebNavigationClient);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static void setWebViewRenderProcessClient(android.webkit.WebView, androidx.webkit.WebViewRenderProcessClient?);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static void setWebViewRenderProcessClient(android.webkit.WebView, java.util.concurrent.Executor, androidx.webkit.WebViewRenderProcessClient);
     method @Deprecated @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.START_SAFE_BROWSING, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void startSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean!>?);
@@ -516,7 +484,6 @@
     field public static final String MULTI_PROCESS = "MULTI_PROCESS";
     field public static final String MULTI_PROFILE = "MULTI_PROFILE";
     field public static final String MUTE_AUDIO = "MUTE_AUDIO";
-    field public static final String NAVIGATION_CALLBACK_BASIC = "WEB_VIEW_NAVIGATION_CLIENT_BASIC_USAGE";
     field public static final String OFF_SCREEN_PRERASTER = "OFF_SCREEN_PRERASTER";
     field public static final String POST_WEB_MESSAGE = "POST_WEB_MESSAGE";
     field @SuppressCompatibility @androidx.webkit.WebViewCompat.ExperimentalUrlPrerender public static final String PRERENDER_WITH_URL = "PRERENDER_URL_V2";
diff --git a/webkit/webkit/api/restricted_current.txt b/webkit/webkit/api/restricted_current.txt
index 72f140a..c1e111d 100644
--- a/webkit/webkit/api/restricted_current.txt
+++ b/webkit/webkit/api/restricted_current.txt
@@ -24,20 +24,6 @@
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.WEB_MESSAGE_LISTENER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public abstract void postMessage(String);
   }
 
-  @SuppressCompatibility @androidx.webkit.WebNavigationClient.ExperimentalNavigationCallback public interface Navigation {
-    method public boolean didCommit();
-    method public boolean didCommitErrorPage();
-    method public androidx.webkit.Page? getPage();
-    method public int getStatusCode();
-    method public boolean isBack();
-    method public boolean isForward();
-    method public boolean isHistory();
-    method public boolean isReload();
-    method public boolean isRestore();
-    method public boolean isSameDocument();
-    method public boolean wasInitiatedByPage();
-  }
-
   @SuppressCompatibility @androidx.webkit.Profile.ExperimentalUrlPrefetch public class NoVarySearchHeader {
     method @SuppressCompatibility @androidx.webkit.Profile.ExperimentalUrlPrefetch public static androidx.webkit.NoVarySearchHeader alwaysVaryHeader();
     method @SuppressCompatibility @androidx.webkit.Profile.ExperimentalUrlPrefetch public static androidx.webkit.NoVarySearchHeader neverVaryExcept(boolean, java.util.List<java.lang.String!>);
@@ -54,9 +40,6 @@
     method public void onResult(T!);
   }
 
-  @SuppressCompatibility @androidx.webkit.WebNavigationClient.ExperimentalNavigationCallback public interface Page {
-  }
-
   @SuppressCompatibility @androidx.webkit.Profile.ExperimentalUrlPrefetch public class PrefetchException extends java.lang.Exception {
     ctor public PrefetchException();
     ctor public PrefetchException(String);
@@ -314,19 +297,6 @@
     method public void onMessage(androidx.webkit.WebMessagePortCompat, androidx.webkit.WebMessageCompat?);
   }
 
-  @SuppressCompatibility @androidx.webkit.WebNavigationClient.ExperimentalNavigationCallback public interface WebNavigationClient {
-    method public void onFirstContentfulPaint(androidx.webkit.Page);
-    method public void onNavigationCompleted(androidx.webkit.Navigation);
-    method public void onNavigationRedirected(androidx.webkit.Navigation);
-    method public void onNavigationStarted(androidx.webkit.Navigation);
-    method public void onPageDeleted(androidx.webkit.Page);
-    method public void onPageDomContentLoadedEventFired(androidx.webkit.Page);
-    method public void onPageLoadEventFired(androidx.webkit.Page);
-  }
-
-  @SuppressCompatibility @RequiresOptIn(level=androidx.annotation.RequiresOptIn.Level.ERROR) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD}) public static @interface WebNavigationClient.ExperimentalNavigationCallback {
-  }
-
   public abstract class WebResourceErrorCompat {
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.WEB_RESOURCE_ERROR_GET_DESCRIPTION, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public abstract CharSequence getDescription();
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.WEB_RESOURCE_ERROR_GET_CODE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public abstract int getErrorCode();
@@ -444,7 +414,6 @@
     method @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_PRIVACY_POLICY_URL, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static android.net.Uri getSafeBrowsingPrivacyPolicyUrl();
     method @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.GET_VARIATIONS_HEADER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static String getVariationsHeader();
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.GET_WEB_CHROME_CLIENT, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static android.webkit.WebChromeClient? getWebChromeClient(android.webkit.WebView);
-    method @SuppressCompatibility @RequiresFeature(name=androidx.webkit.WebViewFeature.NAVIGATION_CALLBACK_BASIC, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread @androidx.webkit.WebNavigationClient.ExperimentalNavigationCallback public static androidx.webkit.WebNavigationClient getWebNavigationClient(android.webkit.WebView);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.GET_WEB_VIEW_CLIENT, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static android.webkit.WebViewClient getWebViewClient(android.webkit.WebView);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.GET_WEB_VIEW_RENDERER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static androidx.webkit.WebViewRenderProcess? getWebViewRenderProcess(android.webkit.WebView);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static androidx.webkit.WebViewRenderProcessClient? getWebViewRenderProcessClient(android.webkit.WebView);
@@ -462,7 +431,6 @@
     method @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_ALLOWLIST, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setSafeBrowsingAllowlist(java.util.Set<java.lang.String!>, android.webkit.ValueCallback<java.lang.Boolean!>?);
     method @Deprecated @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_WHITELIST, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setSafeBrowsingWhitelist(java.util.List<java.lang.String!>, android.webkit.ValueCallback<java.lang.Boolean!>?);
     method @SuppressCompatibility @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.CACHE_PROVIDER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @androidx.webkit.WebViewCompat.ExperimentalCacheProvider public static void setShouldCacheProvider(boolean);
-    method @SuppressCompatibility @RequiresFeature(name=androidx.webkit.WebViewFeature.NAVIGATION_CALLBACK_BASIC, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread @androidx.webkit.WebNavigationClient.ExperimentalNavigationCallback public static void setWebNavigationClient(android.webkit.WebView, androidx.webkit.WebNavigationClient);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static void setWebViewRenderProcessClient(android.webkit.WebView, androidx.webkit.WebViewRenderProcessClient?);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static void setWebViewRenderProcessClient(android.webkit.WebView, java.util.concurrent.Executor, androidx.webkit.WebViewRenderProcessClient);
     method @Deprecated @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.START_SAFE_BROWSING, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void startSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean!>?);
@@ -516,7 +484,6 @@
     field public static final String MULTI_PROCESS = "MULTI_PROCESS";
     field public static final String MULTI_PROFILE = "MULTI_PROFILE";
     field public static final String MUTE_AUDIO = "MUTE_AUDIO";
-    field public static final String NAVIGATION_CALLBACK_BASIC = "WEB_VIEW_NAVIGATION_CLIENT_BASIC_USAGE";
     field public static final String OFF_SCREEN_PRERASTER = "OFF_SCREEN_PRERASTER";
     field public static final String POST_WEB_MESSAGE = "POST_WEB_MESSAGE";
     field @SuppressCompatibility @androidx.webkit.WebViewCompat.ExperimentalUrlPrerender public static final String PRERENDER_WITH_URL = "PRERENDER_URL_V2";
diff --git a/webkit/webkit/proguard-rules.pro b/webkit/webkit/proguard-rules.pro
index 36f4099..c40d32a 100644
--- a/webkit/webkit/proguard-rules.pro
+++ b/webkit/webkit/proguard-rules.pro
@@ -19,8 +19,4 @@
 # depends on this name.
 -keepnames public class androidx.webkit.ProcessGlobalConfig {
     private static final *** sProcessGlobalConfig;
-}
-
--keepclassmembers class androidx.webkit.internal.PageImpl {
-    private final org.chromium.support_lib_boundary.WebViewPageBoundaryInterface mPageBoundaryInterface;
 }
\ No newline at end of file
diff --git a/webkit/webkit/src/main/java/androidx/webkit/Navigation.java b/webkit/webkit/src/main/java/androidx/webkit/Navigation.java
deleted file mode 100644
index 796e461..0000000
--- a/webkit/webkit/src/main/java/androidx/webkit/Navigation.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.webkit;
-
-import android.os.Bundle;
-import android.webkit.WebView;
-
-import org.jspecify.annotations.Nullable;
-
-/**
- * The Navigation instance passed by the navigation callbacks.
- * <p>
- * The same object will be used by the relevant callbacks for the same navigation,
- * allowing the instance itself to be used as a key/ID to connect the callbacks for
- * the same navigations.
- */
-@WebNavigationClient.ExperimentalNavigationCallback
-public interface Navigation {
-    /**
-     * Returns the Page that the navigation commits into.
-     * <p>
-     * Note: This method will initially return {@code null} when navigation begins.
-     * If the navigation successfully commits a page, this method will return the corresponding
-     * {@link Page} object. This could be a newly created {@link Page} or a previously seen
-     * {@link Page} in the case of BFCache (Back/Forward Cache).
-     * <p>
-     * Note: Once this method returns a non-null {@link Page} object for a
-     * specific navigation, it will always return the same {@link Page} object for that navigation.
-     * <p>
-     *
-     * @return The {@link Page} object, or {@code null} if the navigation does not commit or
-     * result in a Page
-     * (e.g., <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204">204</a>
-     * /download).
-     */
-    @Nullable
-    Page getPage();
-
-    /**
-     * Indicates whether the navigation is initiated by the page/renderer (e.g., link clicks, JS
-     * script)
-     * instead of the browser/app (e.g., loadUrl calls).
-     *
-     * @return True if page-initiated, false otherwise.
-     */
-    boolean wasInitiatedByPage();
-
-    /**
-     * Indicates whether the navigation is a same-document navigation.
-     *
-     * @return True if same-document, false otherwise.
-     */
-    boolean isSameDocument();
-
-    /**
-     * Indicates whether the navigation is a reload navigation.
-     *
-     * @return True if reload, false otherwise.
-     */
-    boolean isReload();
-
-    /**
-     * Indicates whether the navigation is a history navigation.
-     *
-     * @return True if history, false otherwise.
-     */
-    boolean isHistory();
-
-    /**
-     * Indicates whether the navigation is a history back navigation.
-     *
-     * @return True if back navigation, false otherwise.
-     */
-    boolean isBack();
-
-    /**
-     * Indicates whether the navigation is a history forward navigation.
-     *
-     * @return True if forward navigation, false otherwise.
-     */
-    boolean isForward();
-
-    /**
-     * Indicates whether the navigation committed (i.e., did not get aborted/return 204/etc).
-     *
-     * @return True if committed, false otherwise.
-     */
-    boolean didCommit();
-
-    /**
-     * Indicates whether the navigation committed an error page.
-     *
-     * @return True if an error page was committed, false otherwise.
-     */
-    boolean didCommitErrorPage();
-
-    /**
-     * Returns the status code received by the navigation.
-     *
-     * @return The HTTP status code.
-     */
-    int getStatusCode();
-
-    /**
-     * Indicates whether the navigation is a restore navigation after calling
-     * {@link WebView#restoreState(Bundle)}.
-     *
-     * @return True if session restore, false otherwise.
-     */
-    boolean isRestore();
-
-}
diff --git a/webkit/webkit/src/main/java/androidx/webkit/Page.java b/webkit/webkit/src/main/java/androidx/webkit/Page.java
deleted file mode 100644
index 92f65ad..0000000
--- a/webkit/webkit/src/main/java/androidx/webkit/Page.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.webkit;
-
-/**
- * This class serves solely as a key for Page-associated data.
- * The instance itself functions as the key/identifier.
- * <p>
- * While this interface is currently empty, it may be expanded on in the future.
- * For example, it could be enhanced to expose lifecycle state information.
- */
-@WebNavigationClient.ExperimentalNavigationCallback
-public interface Page { }
diff --git a/webkit/webkit/src/main/java/androidx/webkit/WebNavigationClient.java b/webkit/webkit/src/main/java/androidx/webkit/WebNavigationClient.java
deleted file mode 100644
index fa53a7a..0000000
--- a/webkit/webkit/src/main/java/androidx/webkit/WebNavigationClient.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.webkit;
-
-import androidx.annotation.RequiresOptIn;
-
-import org.jspecify.annotations.NonNull;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Page identification and lifecycle APIs. This class provides callbacks to identify the
- * different stages of navigation.
- * For more information about the navigation lifecycle, please see the
- * <a href="https://docs.google.com/presentation/d/1YVqDmbXI0cllpfXD7TuewiexDNZYfwk6fRdmoXJbBlM">Life of a Navigation Presentation</a>.
- * <p>
- * Note: These navigation callbacks only fire for navigations happening on the main frame.
- * <p>
- * Navigation lifecycle events:
- * <ul>
- * <li>{@code onNavigationStarted}</li>
- * <li>Potentially zero or more {@code onNavigationRedirected} events</li>
- * <li>{@code onNavigationCompleted}</li>
- * <li>If the navigation commits and is not a same-document navigation, potentially any
- * combination and order of zero or one of each of:
- * <ul>
- * <li>{@code onPageLoadEvent}</li>
- * <li>{@code onPageDomContentLoaded}</li>
- * <li>{@code onFirstContentfulPaint}</li>
- * </ul>
- * </li>
- * </ul>
- */
-@WebNavigationClient.ExperimentalNavigationCallback
-public interface WebNavigationClient {
-    /**
-     * Fired when a navigation starts, including same-document navigations.
-     * <p>
-     * Note: These navigation callbacks only fire for navigations happening on the main frame.
-     *
-     * @param navigation The Navigation object representing the started navigation.
-     */
-    void onNavigationStarted(@NonNull Navigation navigation);
-
-    /**
-     * Fired when a navigation is redirected.
-     *
-     * @param navigation The Navigation object representing the redirected navigation.
-     */
-    void onNavigationRedirected(@NonNull Navigation navigation);
-
-    /**
-     * Fired when a navigation completes.
-     * <p>
-     * The navigation might not have actually committed (e.g., results in 204/download/cancelled).
-     *
-     * @param navigation The Navigation object representing the completed navigation.
-     */
-    void onNavigationCompleted(@NonNull Navigation navigation);
-
-    /**
-     * Fired when any Page is evicted/destroyed. This can occur immediately
-     * on navigation, or later if the page is BFCached and subsequently evicted.
-     *
-     * @param page The Page that was evicted or destroyed.
-     */
-    void onPageDeleted(@NonNull Page page);
-
-    /**
-     * Fired when the `window.load` event is fired for the current page.
-     *
-     * @param page The Page for which the `window.load` event fired.
-     */
-    void onPageLoadEventFired(@NonNull Page page);
-
-    /**
-     * Fired when the `DOMContentLoaded` event is fired for the current page.
-     *
-     * @param page The Page for which the `DOMContentLoaded` event fired.
-     */
-    void onPageDomContentLoadedEventFired(@NonNull Page page);
-
-    /**
-     * Fired when the page achieves "First Contentful Paint".
-     *
-     * <p>See <a href="https://web.dev/articles/fcp">First Contentful Paint (FCP)</a>
-     * for a definition.</p>
-     *
-     * @param page The Page for which the First Contentful Paint occurred.
-     */
-    void onFirstContentfulPaint(@NonNull Page page);
-
-    /**
-     * Denotes {@link Navigation}, {@link Page} and {@link WebNavigationClient} API surfaces are
-     * experimental.
-     * <p>
-     * It may change without warning and should not be relied upon for non-experimental purposes.
-     */
-    @Retention(RetentionPolicy.CLASS)
-    @Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD})
-    @RequiresOptIn(level = RequiresOptIn.Level.ERROR)
-    @interface ExperimentalNavigationCallback {
-    }
-}
diff --git a/webkit/webkit/src/main/java/androidx/webkit/WebViewCompat.java b/webkit/webkit/src/main/java/androidx/webkit/WebViewCompat.java
index 2b34514..951a5a2 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/WebViewCompat.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/WebViewCompat.java
@@ -1459,12 +1459,11 @@
      * {@link WebView#saveState(Bundle)} and the returned state can be restored through
      * {@link WebView#restoreState(Bundle)}.
      *
-     * @param webView             the {@link WebView} whose state is to be saved.
-     * @param outState            the {@link Bundle} to store the state in.
-     * @param maxSizeBytes        the maximum size (in bytes) that the returned state can be. If the
-     *                            WebView contains more state, history entries further back will
-     *                            not be
-     *                            saved.
+     * @param webView the {@link WebView} whose state is to be saved.
+     * @param outState the {@link Bundle} to store the state in.
+     * @param maxSizeBytes the maximum size (in bytes) that the returned state can be. If the
+     *                     WebView contains more state, history entries further back will not be
+     *                     saved.
      * @param includeForwardState whether to include entries that can only be reached through going
      *                            forward in history (such as through {@link WebView#goForward()}.
      *                            Some apps don't give the user a way to go forward, so won't need
@@ -1517,51 +1516,6 @@
         }
     }
 
-    /**
-     * Sets the {@link WebNavigationClient} for the given {@link WebView}.
-     *
-     * @param webView The {@link WebView} to set the client for.
-     * @param client  The {@link WebNavigationClient} to set.
-     * @throws UnsupportedOperationException if the
-     *                                       {@link WebViewFeature#NAVIGATION_CALLBACK_BASIC}
-     *                                       feature is not supported.
-     */
-    @RequiresFeature(name = WebViewFeature.NAVIGATION_CALLBACK_BASIC,
-            enforcement = "androidx.webkit.WebViewFeature#isFeatureSupported")
-    @UiThread
-    @WebNavigationClient.ExperimentalNavigationCallback
-    public static void setWebNavigationClient(@NonNull WebView webView,
-            @NonNull WebNavigationClient client) {
-        ApiFeature.NoFramework feature = WebViewFeatureInternal.NAVIGATION_CALLBACK_BASIC;
-        if (feature.isSupportedByWebView()) {
-            getProvider(webView).setWebNavigationClient(client);
-        } else {
-            throw WebViewFeatureInternal.getUnsupportedOperationException();
-        }
-    }
-
-    /**
-     * Gets the {@link WebNavigationClient} currently set for the given {@link WebView}.
-     *
-     * @param webView The {@link WebView} to get the client from.
-     * @return The {@link WebNavigationClient} currently set, or {@code null} if none is set.
-     * @throws UnsupportedOperationException if the
-     *                                       {@link WebViewFeature#NAVIGATION_CALLBACK_BASIC}
-     *                                       feature is not supported.
-     */
-    @RequiresFeature(name = WebViewFeature.NAVIGATION_CALLBACK_BASIC,
-            enforcement = "androidx.webkit.WebViewFeature#isFeatureSupported")
-    @UiThread
-    @WebNavigationClient.ExperimentalNavigationCallback
-    public static @NonNull WebNavigationClient getWebNavigationClient(@NonNull WebView webView) {
-        ApiFeature.NoFramework feature = WebViewFeatureInternal.NAVIGATION_CALLBACK_BASIC;
-        if (feature.isSupportedByWebView()) {
-            return getProvider(webView).getWebNavigationClient();
-        } else {
-            throw WebViewFeatureInternal.getUnsupportedOperationException();
-        }
-    }
-
     private static WebViewProviderFactory getFactory() {
         return WebViewGlueCommunicator.getFactory();
     }
diff --git a/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java b/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
index 8072fcb..eb06a9d2 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
@@ -120,7 +120,6 @@
             DELETE_BROWSING_DATA,
             PRERENDER_WITH_URL,
             SAVE_STATE,
-            NAVIGATION_CALLBACK_BASIC,
             CACHE_PROVIDER,
     })
     @Retention(RetentionPolicy.SOURCE)
@@ -378,7 +377,7 @@
      * Feature for {@link #isFeatureSupported(String)}.
      * This feature covers
      * {@link WebMessagePortCompat#setWebMessageCallback(
-     *WebMessagePortCompat.WebMessageCallbackCompat)}, and
+     * WebMessagePortCompat.WebMessageCallbackCompat)}, and
      * {@link WebMessagePortCompat#setWebMessageCallback(Handler,
      * WebMessagePortCompat.WebMessageCallbackCompat)}.
      */
@@ -678,25 +677,6 @@
     public static final String SAVE_STATE = "SAVE_STATE";
 
     /**
-     * Feature for {@link WebViewFeature#isFeatureSupported(String)}.
-     * This feature covers {@link WebViewCompat#getWebNavigationClient(WebView)};
-     * This feature covers
-     * {@link WebViewCompat#setWebNavigationClient(WebView, WebNavigationClient)};
-     * This feature covers {@link Navigation#didCommitErrorPage()}.
-     * This feature covers {@link Navigation#getPage()}.
-     * This feature covers {@link Navigation#isBack()}.
-     * This feature covers {@link Navigation#isForward()}.
-     * This feature covers {@link Navigation#isHistory()}.
-     * This feature covers {@link Navigation#isRestore()}.
-     * This feature covers {@link Navigation#isReload()}.
-     * This feature covers {@link Navigation#wasInitiatedByPage()}.
-     * This feature covers {@link Navigation#isSameDocument()}.
-     * This feature covers {@link Navigation#didCommit()}.
-     * This feature covers the initial version of {@link Page}.
-     */
-    public static final String NAVIGATION_CALLBACK_BASIC = "WEB_VIEW_NAVIGATION_CLIENT_BASIC_USAGE";
-
-    /**
      * Feature for {@link #isFeatureSupported(String)}.
      * This feature covers {@link WebViewCompat#setShouldCacheProvider(boolean)}.
      */
diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/NavigationAdapter.java b/webkit/webkit/src/main/java/androidx/webkit/internal/NavigationAdapter.java
deleted file mode 100644
index 10aea5c..0000000
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/NavigationAdapter.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.webkit.internal;
-
-import androidx.webkit.Navigation;
-import androidx.webkit.Page;
-
-import org.chromium.support_lib_boundary.WebViewNavigationBoundaryInterface;
-import org.chromium.support_lib_boundary.WebViewPageBoundaryInterface;
-import org.chromium.support_lib_boundary.util.BoundaryInterfaceReflectionUtil;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
-public class NavigationAdapter implements Navigation {
-    WebViewNavigationBoundaryInterface mImpl;
-    PageImpl mPage;
-
-    public NavigationAdapter(@NonNull WebViewNavigationBoundaryInterface impl) {
-        mImpl = impl;
-    }
-
-    @Override
-    public @Nullable Page getPage() {
-        if (mImpl.getPage() == null) return null;
-        // Once the Page is non-null, it won't change so there's no need to do an extra casting.
-        if (mPage == null) {
-            WebViewPageBoundaryInterface boundaryInterface =
-                    BoundaryInterfaceReflectionUtil.castToSuppLibClass(
-                            WebViewPageBoundaryInterface.class, mImpl.getPage());
-            mPage = new PageImpl(boundaryInterface);
-        }
-        return mPage;
-    }
-
-
-    @Override
-    public boolean wasInitiatedByPage() {
-        return mImpl.wasInitiatedByPage();
-    }
-
-    @Override
-    public boolean isSameDocument() {
-        return mImpl.isSameDocument();
-    }
-
-    @Override
-    public boolean isReload() {
-        return mImpl.isReload();
-    }
-
-    @Override
-    public boolean isHistory() {
-        return mImpl.isHistory();
-    }
-
-    @Override
-    public boolean isRestore() {
-        return mImpl.isRestore();
-    }
-
-    @Override
-    public boolean isBack() {
-        return mImpl.isBack();
-    }
-
-    @Override
-    public boolean isForward() {
-        return mImpl.isForward();
-    }
-
-    @Override
-    public boolean didCommit() {
-        return mImpl.didCommit();
-    }
-
-    @Override
-    public boolean didCommitErrorPage() {
-        return mImpl.didCommitErrorPage();
-    }
-
-    @Override
-    public int getStatusCode() {
-        return mImpl.getStatusCode();
-    }
-
-}
diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/PageImpl.java b/webkit/webkit/src/main/java/androidx/webkit/internal/PageImpl.java
deleted file mode 100644
index 3c20689..0000000
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/PageImpl.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.webkit.internal;
-
-import androidx.webkit.Page;
-
-import org.chromium.support_lib_boundary.WebViewPageBoundaryInterface;
-import org.jspecify.annotations.NonNull;
-
-public class PageImpl implements Page {
-    private final WebViewPageBoundaryInterface mPageBoundaryInterface;
-
-    public PageImpl(@NonNull WebViewPageBoundaryInterface impl) {
-        mPageBoundaryInterface = impl;
-    }
-
-}
diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/WebNavigationClientAdapter.java b/webkit/webkit/src/main/java/androidx/webkit/internal/WebNavigationClientAdapter.java
deleted file mode 100644
index b49659d..0000000
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/WebNavigationClientAdapter.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.webkit.internal;
-
-
-import androidx.webkit.WebNavigationClient;
-
-import org.chromium.support_lib_boundary.WebViewNavigationBoundaryInterface;
-import org.chromium.support_lib_boundary.WebViewNavigationClientBoundaryInterface;
-import org.chromium.support_lib_boundary.WebViewPageBoundaryInterface;
-import org.chromium.support_lib_boundary.util.BoundaryInterfaceReflectionUtil;
-import org.chromium.support_lib_boundary.util.Features;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
-import java.lang.reflect.InvocationHandler;
-
-/**
- * Adapter between {@link WebNavigationClient} and
- * {@link WebViewNavigationClientBoundaryInterface}. It handles the delegation for callback
- * triggers.
- */
-public class WebNavigationClientAdapter implements
-        WebViewNavigationClientBoundaryInterface {
-    WebNavigationClient mWebNavigationClient;
-
-    public WebNavigationClientAdapter(@NonNull WebNavigationClient client) {
-        mWebNavigationClient = client;
-    }
-
-    public @Nullable WebNavigationClient getWebNavigationClient() {
-        return mWebNavigationClient;
-    }
-
-    @Override
-    public void onNavigationStarted(@NonNull InvocationHandler navigation) {
-        WebViewNavigationBoundaryInterface boundaryInterface =
-                BoundaryInterfaceReflectionUtil.castToSuppLibClass(
-                        WebViewNavigationBoundaryInterface.class, navigation);
-
-        mWebNavigationClient.onNavigationStarted(
-                (NavigationAdapter) boundaryInterface.getOrCreatePeer(
-                        () -> new NavigationAdapter(boundaryInterface)));
-    }
-
-    @Override
-    public void onNavigationRedirected(@NonNull InvocationHandler navigation) {
-        WebViewNavigationBoundaryInterface boundaryInterface =
-                BoundaryInterfaceReflectionUtil.castToSuppLibClass(
-                        WebViewNavigationBoundaryInterface.class, navigation);
-
-        mWebNavigationClient.onNavigationRedirected(
-                (NavigationAdapter) boundaryInterface.getOrCreatePeer(
-                        () -> new NavigationAdapter(boundaryInterface)));
-    }
-
-    @Override
-    public void onNavigationCompleted(@NonNull InvocationHandler navigation) {
-        WebViewNavigationBoundaryInterface boundaryInterface =
-                BoundaryInterfaceReflectionUtil.castToSuppLibClass(
-                        WebViewNavigationBoundaryInterface.class, navigation);
-
-        mWebNavigationClient.onNavigationCompleted(
-                (NavigationAdapter) boundaryInterface.getOrCreatePeer(
-                        () -> new NavigationAdapter(boundaryInterface)));
-    }
-
-    @Override
-    public void onPageDeleted(@NonNull InvocationHandler page) {
-        final WebViewPageBoundaryInterface boundaryInterface =
-                BoundaryInterfaceReflectionUtil.castToSuppLibClass(
-                        WebViewPageBoundaryInterface.class, page);
-        mWebNavigationClient.onPageDeleted((PageImpl) boundaryInterface.getOrCreatePeer(
-                () -> new PageImpl(boundaryInterface)));
-    }
-
-    @Override
-    public void onPageLoadEventFired(@NonNull InvocationHandler page) {
-        final WebViewPageBoundaryInterface boundaryInterface =
-                BoundaryInterfaceReflectionUtil.castToSuppLibClass(
-                        WebViewPageBoundaryInterface.class, page);
-        mWebNavigationClient.onPageLoadEventFired((PageImpl) boundaryInterface.getOrCreatePeer(
-                () -> new PageImpl(boundaryInterface)));
-    }
-
-    @Override
-    public void onPageDOMContentLoadedEventFired(@NonNull InvocationHandler page) {
-        final WebViewPageBoundaryInterface boundaryInterface =
-                BoundaryInterfaceReflectionUtil.castToSuppLibClass(
-                        WebViewPageBoundaryInterface.class, page);
-        mWebNavigationClient.onPageDomContentLoadedEventFired(
-                (PageImpl) boundaryInterface.getOrCreatePeer(
-                        () -> new PageImpl(boundaryInterface)));
-    }
-
-    @Override
-    public void onFirstContentfulPaint(@NonNull InvocationHandler page) {
-        final WebViewPageBoundaryInterface boundaryInterface =
-                BoundaryInterfaceReflectionUtil.castToSuppLibClass(
-                        WebViewPageBoundaryInterface.class, page);
-        mWebNavigationClient.onFirstContentfulPaint((PageImpl) boundaryInterface.getOrCreatePeer(
-                () -> new PageImpl(boundaryInterface)));
-    }
-
-    @NonNull
-    @Override
-    public String[] getSupportedFeatures() {
-        return new String[]{Features.WEB_VIEW_NAVIGATION_CLIENT_BASIC_USAGE};
-    }
-}
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 a7036f3..459f7eb 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
@@ -30,9 +30,7 @@
 
 import androidx.annotation.RestrictTo;
 import androidx.annotation.VisibleForTesting;
-import androidx.webkit.Navigation;
 import androidx.webkit.OutcomeReceiverCompat;
-import androidx.webkit.Page;
 import androidx.webkit.PrerenderOperationCallback;
 import androidx.webkit.Profile;
 import androidx.webkit.ProfileStore;
@@ -46,7 +44,6 @@
 import androidx.webkit.TracingController;
 import androidx.webkit.WebMessageCompat;
 import androidx.webkit.WebMessagePortCompat;
-import androidx.webkit.WebNavigationClient;
 import androidx.webkit.WebResourceErrorCompat;
 import androidx.webkit.WebResourceRequestCompat;
 import androidx.webkit.WebViewClientCompat;
@@ -115,7 +112,7 @@
 
     /**
      * This feature covers {@link androidx.webkit.WebViewCompat#setSafeBrowsingWhitelist(
-     *java.util.List, ValueCallback)}, plumbing through the deprecated boundary interface.
+     * java.util.List, ValueCallback)}, plumbing through the deprecated boundary interface.
      *
      * <p>Don't use this value directly. This exists only so
      * {@link WebViewFeatureInternal#isSupported(String)} supports the <b>deprecated</b> public
@@ -131,7 +128,7 @@
 
     /**
      * This feature covers {@link androidx.webkit.WebViewCompat#setSafeBrowsingWhitelist(
-     *java.util.List, ValueCallback)}, plumbing through the new boundary interface.
+     * java.util.List, ValueCallback)}, plumbing through the new boundary interface.
      *
      * <p>Don't use this value directly. This exists only so
      * {@link WebViewFeatureInternal#isSupported(String)} supports the <b>deprecated</b> public
@@ -437,7 +434,6 @@
     public static final ApiFeature.T ALGORITHMIC_DARKENING =
             new ApiFeature.T(WebViewFeature.ALGORITHMIC_DARKENING, Features.ALGORITHMIC_DARKENING) {
                 private final Pattern mVersionPattern = Pattern.compile("\\A\\d+");
-
                 @Override
                 public boolean isSupportedByWebView() {
                     boolean supported = super.isSupportedByWebView();
@@ -554,6 +550,7 @@
      * This feature covers
      * {@link androidx.webkit.WebSettingsCompat#setUserAgentMetadata(WebSettings, androidx.webkit.UserAgentMetadata)} and
      * {@link androidx.webkit.WebSettingsCompat#getUserAgentMetadata(WebSettings)}.
+     *
      */
     public static final ApiFeature.NoFramework USER_AGENT_METADATA =
             new ApiFeature.NoFramework(WebViewFeature.USER_AGENT_METADATA,
@@ -719,16 +716,6 @@
 
     /**
      * Feature for {@link WebViewFeature#isFeatureSupported(String)}.
-     * This feature covers {@link WebNavigationClient} and all methods within.
-     * This feature covers basic methods in {@link Navigation}.
-     * This feature covers basic version of {@link Page}.
-     */
-    public static final ApiFeature.NoFramework NAVIGATION_CALLBACK_BASIC =
-            new ApiFeature.NoFramework(WebViewFeature.NAVIGATION_CALLBACK_BASIC,
-                    Features.WEB_VIEW_NAVIGATION_CLIENT_BASIC_USAGE);
-
-    /**
-     * Feature for {@link WebViewFeature#isFeatureSupported(String)}.
      * This feature covers {@link WebViewCompat#setShouldCacheProvider(boolean)}.
      */
     public static final ApiFeature.NoFramework CACHE_PROVIDER =
@@ -764,7 +751,7 @@
      * defined in {@code internalFeatures}.
      *
      * @throws RuntimeException if {@code publicFeatureValue} is not matched in
-     *                          {@code internalFeatures}
+     *      {@code internalFeatures}
      */
     @VisibleForTesting
     public static <T extends ConditionallySupportedFeature> boolean isSupported(
@@ -790,7 +777,7 @@
      * defined in {@code internalFeatures}.
      *
      * @throws RuntimeException if {@code publicFeatureValue} is not matched in
-     *                          {@code internalFeatures}
+     *      {@code internalFeatures}
      */
     @VisibleForTesting
     public static boolean isStartupFeatureSupported(
diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderAdapter.java b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderAdapter.java
index 0afc680..4f9fffe 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderAdapter.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderAdapter.java
@@ -32,7 +32,6 @@
 import androidx.webkit.SpeculativeLoadingParameters;
 import androidx.webkit.WebMessageCompat;
 import androidx.webkit.WebMessagePortCompat;
-import androidx.webkit.WebNavigationClient;
 import androidx.webkit.WebViewCompat;
 import androidx.webkit.WebViewRenderProcess;
 import androidx.webkit.WebViewRenderProcessClient;
@@ -264,28 +263,4 @@
             boolean includeForwardState) {
         mImpl.saveState(outState, maxSizeBytes, includeForwardState);
     }
-
-    /**
-     * Adapter method for {@link WebViewCompat#saveState(WebView, Bundle, int, boolean)}.
-     */
-    @UiThread
-    public void setWebNavigationClient(
-            @NonNull WebNavigationClient client) {
-        InvocationHandler clientBoundaryInterface =
-                BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
-                        new WebNavigationClientAdapter(client));
-        mImpl.setWebViewNavigationClient(clientBoundaryInterface);
-    }
-
-    /**
-     * Adapter method for {@link WebViewCompat#getWebN(WebView, Bundle, int, boolean)}.
-     */
-    @UiThread
-    public @NonNull WebNavigationClient getWebNavigationClient() {
-        InvocationHandler client = mImpl.getWebViewNavigationClient();
-        if (client == null) return null;
-        return ((WebNavigationClientAdapter)
-                BoundaryInterfaceReflectionUtil.getDelegateFromInvocationHandler(
-                        client)).getWebNavigationClient();
-    }
 }
diff --git a/window/extensions/extensions/api/current.txt b/window/extensions/extensions/api/current.txt
index b47fdb3..8c45b062 100644
--- a/window/extensions/extensions/api/current.txt
+++ b/window/extensions/extensions/api/current.txt
@@ -66,7 +66,6 @@
     method public default boolean pinTopActivityStack(int, androidx.window.extensions.embedding.SplitPinRule);
     method public default void registerActivityStackCallback(java.util.concurrent.Executor, androidx.window.extensions.core.util.function.Consumer<java.util.List<androidx.window.extensions.embedding.ActivityStack!>!>);
     method public default void setActivityStackAttributesCalculator(androidx.window.extensions.core.util.function.Function<androidx.window.extensions.embedding.ActivityStackAttributesCalculatorParams!,androidx.window.extensions.embedding.ActivityStackAttributes!>);
-    method public default void setAutoSaveEmbeddingState(boolean);
     method public default void setEmbeddedActivityWindowInfoCallback(java.util.concurrent.Executor, androidx.window.extensions.core.util.function.Consumer<androidx.window.extensions.embedding.EmbeddedActivityWindowInfo!>);
     method public void setEmbeddingRules(java.util.Set<androidx.window.extensions.embedding.EmbeddingRule!>);
     method @Deprecated public default android.app.ActivityOptions setLaunchingActivityStack(android.app.ActivityOptions, android.os.IBinder);
@@ -140,35 +139,14 @@
     method @ColorInt public int getColor();
   }
 
-  public final class AnimationParams {
-    method public androidx.window.extensions.embedding.AnimationBackground getAnimationBackground();
-    method @AnimRes public int getChangeAnimationResId();
-    method @AnimRes public int getCloseAnimationResId();
-    method @AnimRes public int getOpenAnimationResId();
-    field @AnimRes public static final int DEFAULT_ANIMATION_RESOURCES_ID = -1; // 0xffffffff
-  }
-
-  public static final class AnimationParams.Builder {
-    ctor public AnimationParams.Builder();
-    method public androidx.window.extensions.embedding.AnimationParams build();
-    method public androidx.window.extensions.embedding.AnimationParams.Builder setAnimationBackground(androidx.window.extensions.embedding.AnimationBackground);
-    method public androidx.window.extensions.embedding.AnimationParams.Builder setChangeAnimationResId(@AnimRes int);
-    method public androidx.window.extensions.embedding.AnimationParams.Builder setCloseAnimationResId(@AnimRes int);
-    method public androidx.window.extensions.embedding.AnimationParams.Builder setOpenAnimationResId(@AnimRes int);
-  }
-
   public final class DividerAttributes {
     method @ColorInt public int getDividerColor();
     method public int getDividerType();
     method public float getPrimaryMaxRatio();
     method public float getPrimaryMinRatio();
-    method @ColorInt public int getPrimaryVeilColor();
-    method @ColorInt public int getSecondaryVeilColor();
     method @Dimension public int getWidthDp();
-    method public boolean isDraggingToFullscreenAllowed();
     field public static final int DIVIDER_TYPE_DRAGGABLE = 2; // 0x2
     field public static final int DIVIDER_TYPE_FIXED = 1; // 0x1
-    field public static final int DIVIDER_VEIL_COLOR_DEFAULT = 0; // 0x0
     field public static final float RATIO_SYSTEM_DEFAULT = -1.0f;
     field public static final int WIDTH_SYSTEM_DEFAULT = -1; // 0xffffffff
   }
@@ -178,11 +156,8 @@
     ctor public DividerAttributes.Builder(int);
     method public androidx.window.extensions.embedding.DividerAttributes build();
     method public androidx.window.extensions.embedding.DividerAttributes.Builder setDividerColor(@ColorInt int);
-    method public androidx.window.extensions.embedding.DividerAttributes.Builder setDraggingToFullscreenAllowed(boolean);
     method public androidx.window.extensions.embedding.DividerAttributes.Builder setPrimaryMaxRatio(float);
     method public androidx.window.extensions.embedding.DividerAttributes.Builder setPrimaryMinRatio(float);
-    method public androidx.window.extensions.embedding.DividerAttributes.Builder setPrimaryVeilColor(@ColorInt int);
-    method public androidx.window.extensions.embedding.DividerAttributes.Builder setSecondaryVeilColor(@ColorInt int);
     method public androidx.window.extensions.embedding.DividerAttributes.Builder setWidthDp(@Dimension int);
   }
 
@@ -204,8 +179,7 @@
   }
 
   public class SplitAttributes {
-    method @Deprecated public androidx.window.extensions.embedding.AnimationBackground getAnimationBackground();
-    method public androidx.window.extensions.embedding.AnimationParams getAnimationParams();
+    method public androidx.window.extensions.embedding.AnimationBackground getAnimationBackground();
     method public androidx.window.extensions.embedding.DividerAttributes? getDividerAttributes();
     method public int getLayoutDirection();
     method public androidx.window.extensions.embedding.SplitAttributes.SplitType getSplitType();
@@ -216,8 +190,7 @@
     ctor public SplitAttributes.Builder();
     ctor public SplitAttributes.Builder(androidx.window.extensions.embedding.SplitAttributes);
     method public androidx.window.extensions.embedding.SplitAttributes build();
-    method @Deprecated public androidx.window.extensions.embedding.SplitAttributes.Builder setAnimationBackground(androidx.window.extensions.embedding.AnimationBackground);
-    method public androidx.window.extensions.embedding.SplitAttributes.Builder setAnimationParams(androidx.window.extensions.embedding.AnimationParams);
+    method public androidx.window.extensions.embedding.SplitAttributes.Builder setAnimationBackground(androidx.window.extensions.embedding.AnimationBackground);
     method public androidx.window.extensions.embedding.SplitAttributes.Builder setDividerAttributes(androidx.window.extensions.embedding.DividerAttributes?);
     method public androidx.window.extensions.embedding.SplitAttributes.Builder setLayoutDirection(int);
     method public androidx.window.extensions.embedding.SplitAttributes.Builder setSplitType(androidx.window.extensions.embedding.SplitAttributes.SplitType);
@@ -394,7 +367,6 @@
   public interface WindowLayoutComponent {
     method @Deprecated public void addWindowLayoutInfoListener(android.app.Activity, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
     method public default void addWindowLayoutInfoListener(@UiContext android.content.Context, androidx.window.extensions.core.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
-    method public default androidx.window.extensions.layout.WindowLayoutInfo getCurrentWindowLayoutInfo(@UiContext android.content.Context);
     method public default androidx.window.extensions.layout.SupportedWindowFeatures getSupportedWindowFeatures();
     method public default void removeWindowLayoutInfoListener(androidx.window.extensions.core.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
     method @Deprecated public void removeWindowLayoutInfoListener(java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
diff --git a/window/extensions/extensions/api/restricted_current.txt b/window/extensions/extensions/api/restricted_current.txt
index b47fdb3..8c45b062 100644
--- a/window/extensions/extensions/api/restricted_current.txt
+++ b/window/extensions/extensions/api/restricted_current.txt
@@ -66,7 +66,6 @@
     method public default boolean pinTopActivityStack(int, androidx.window.extensions.embedding.SplitPinRule);
     method public default void registerActivityStackCallback(java.util.concurrent.Executor, androidx.window.extensions.core.util.function.Consumer<java.util.List<androidx.window.extensions.embedding.ActivityStack!>!>);
     method public default void setActivityStackAttributesCalculator(androidx.window.extensions.core.util.function.Function<androidx.window.extensions.embedding.ActivityStackAttributesCalculatorParams!,androidx.window.extensions.embedding.ActivityStackAttributes!>);
-    method public default void setAutoSaveEmbeddingState(boolean);
     method public default void setEmbeddedActivityWindowInfoCallback(java.util.concurrent.Executor, androidx.window.extensions.core.util.function.Consumer<androidx.window.extensions.embedding.EmbeddedActivityWindowInfo!>);
     method public void setEmbeddingRules(java.util.Set<androidx.window.extensions.embedding.EmbeddingRule!>);
     method @Deprecated public default android.app.ActivityOptions setLaunchingActivityStack(android.app.ActivityOptions, android.os.IBinder);
@@ -140,35 +139,14 @@
     method @ColorInt public int getColor();
   }
 
-  public final class AnimationParams {
-    method public androidx.window.extensions.embedding.AnimationBackground getAnimationBackground();
-    method @AnimRes public int getChangeAnimationResId();
-    method @AnimRes public int getCloseAnimationResId();
-    method @AnimRes public int getOpenAnimationResId();
-    field @AnimRes public static final int DEFAULT_ANIMATION_RESOURCES_ID = -1; // 0xffffffff
-  }
-
-  public static final class AnimationParams.Builder {
-    ctor public AnimationParams.Builder();
-    method public androidx.window.extensions.embedding.AnimationParams build();
-    method public androidx.window.extensions.embedding.AnimationParams.Builder setAnimationBackground(androidx.window.extensions.embedding.AnimationBackground);
-    method public androidx.window.extensions.embedding.AnimationParams.Builder setChangeAnimationResId(@AnimRes int);
-    method public androidx.window.extensions.embedding.AnimationParams.Builder setCloseAnimationResId(@AnimRes int);
-    method public androidx.window.extensions.embedding.AnimationParams.Builder setOpenAnimationResId(@AnimRes int);
-  }
-
   public final class DividerAttributes {
     method @ColorInt public int getDividerColor();
     method public int getDividerType();
     method public float getPrimaryMaxRatio();
     method public float getPrimaryMinRatio();
-    method @ColorInt public int getPrimaryVeilColor();
-    method @ColorInt public int getSecondaryVeilColor();
     method @Dimension public int getWidthDp();
-    method public boolean isDraggingToFullscreenAllowed();
     field public static final int DIVIDER_TYPE_DRAGGABLE = 2; // 0x2
     field public static final int DIVIDER_TYPE_FIXED = 1; // 0x1
-    field public static final int DIVIDER_VEIL_COLOR_DEFAULT = 0; // 0x0
     field public static final float RATIO_SYSTEM_DEFAULT = -1.0f;
     field public static final int WIDTH_SYSTEM_DEFAULT = -1; // 0xffffffff
   }
@@ -178,11 +156,8 @@
     ctor public DividerAttributes.Builder(int);
     method public androidx.window.extensions.embedding.DividerAttributes build();
     method public androidx.window.extensions.embedding.DividerAttributes.Builder setDividerColor(@ColorInt int);
-    method public androidx.window.extensions.embedding.DividerAttributes.Builder setDraggingToFullscreenAllowed(boolean);
     method public androidx.window.extensions.embedding.DividerAttributes.Builder setPrimaryMaxRatio(float);
     method public androidx.window.extensions.embedding.DividerAttributes.Builder setPrimaryMinRatio(float);
-    method public androidx.window.extensions.embedding.DividerAttributes.Builder setPrimaryVeilColor(@ColorInt int);
-    method public androidx.window.extensions.embedding.DividerAttributes.Builder setSecondaryVeilColor(@ColorInt int);
     method public androidx.window.extensions.embedding.DividerAttributes.Builder setWidthDp(@Dimension int);
   }
 
@@ -204,8 +179,7 @@
   }
 
   public class SplitAttributes {
-    method @Deprecated public androidx.window.extensions.embedding.AnimationBackground getAnimationBackground();
-    method public androidx.window.extensions.embedding.AnimationParams getAnimationParams();
+    method public androidx.window.extensions.embedding.AnimationBackground getAnimationBackground();
     method public androidx.window.extensions.embedding.DividerAttributes? getDividerAttributes();
     method public int getLayoutDirection();
     method public androidx.window.extensions.embedding.SplitAttributes.SplitType getSplitType();
@@ -216,8 +190,7 @@
     ctor public SplitAttributes.Builder();
     ctor public SplitAttributes.Builder(androidx.window.extensions.embedding.SplitAttributes);
     method public androidx.window.extensions.embedding.SplitAttributes build();
-    method @Deprecated public androidx.window.extensions.embedding.SplitAttributes.Builder setAnimationBackground(androidx.window.extensions.embedding.AnimationBackground);
-    method public androidx.window.extensions.embedding.SplitAttributes.Builder setAnimationParams(androidx.window.extensions.embedding.AnimationParams);
+    method public androidx.window.extensions.embedding.SplitAttributes.Builder setAnimationBackground(androidx.window.extensions.embedding.AnimationBackground);
     method public androidx.window.extensions.embedding.SplitAttributes.Builder setDividerAttributes(androidx.window.extensions.embedding.DividerAttributes?);
     method public androidx.window.extensions.embedding.SplitAttributes.Builder setLayoutDirection(int);
     method public androidx.window.extensions.embedding.SplitAttributes.Builder setSplitType(androidx.window.extensions.embedding.SplitAttributes.SplitType);
@@ -394,7 +367,6 @@
   public interface WindowLayoutComponent {
     method @Deprecated public void addWindowLayoutInfoListener(android.app.Activity, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
     method public default void addWindowLayoutInfoListener(@UiContext android.content.Context, androidx.window.extensions.core.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
-    method public default androidx.window.extensions.layout.WindowLayoutInfo getCurrentWindowLayoutInfo(@UiContext android.content.Context);
     method public default androidx.window.extensions.layout.SupportedWindowFeatures getSupportedWindowFeatures();
     method public default void removeWindowLayoutInfoListener(androidx.window.extensions.core.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
     method @Deprecated public void removeWindowLayoutInfoListener(java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
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 24f0fa6..3ba69ff 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
@@ -446,25 +446,4 @@
         throw new UnsupportedOperationException("This method must not be called unless there is a"
                 + " corresponding override implementation on the device.");
     }
-
-    /**
-     * Sets whether to auto save the embedding state to the system, which can be used to restore the
-     * app embedding state once the app process is restarted (if applicable).
-     *
-     * The embedding state is not saved by default, in which case the embedding state and the
-     * embedded activities are removed once the app process is killed.
-     *
-     * **Note** that the applications should set the {@link EmbeddingRule}s using
-     * {@link #setEmbeddingRules} when the application is initializing, such as configured in
-     * [android.app.Application.onCreate], in order to allow the library to restore the state
-     * properly. Otherwise, the state may not be restored and the activities may not be started
-     * and layout as expected.
-     *
-     * @param saveEmbeddingState whether to save the embedding state.
-     */
-    @RequiresVendorApiLevel(level = 8)
-    default void setAutoSaveEmbeddingState(boolean saveEmbeddingState) {
-        throw new UnsupportedOperationException("This method must not be called unless there is a"
-                + " corresponding override implementation on the device.");
-    }
 }
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityRule.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityRule.java
index 3d3c2e9e..20fac75 100644
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityRule.java
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityRule.java
@@ -153,6 +153,6 @@
     @Override
     public @NonNull String toString() {
         return "ActivityRule{mTag=" + getTag()
-                + ", mShouldAlwaysExpand=" + mShouldAlwaysExpand + '}';
+                + "mShouldAlwaysExpand=" + mShouldAlwaysExpand + '}';
     }
 }
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/AnimationParams.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/AnimationParams.java
deleted file mode 100644
index 4390b9d..0000000
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/AnimationParams.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window.extensions.embedding;
-
-import android.content.res.Resources;
-
-import androidx.annotation.AnimRes;
-import androidx.window.extensions.RequiresVendorApiLevel;
-
-import org.jspecify.annotations.NonNull;
-
-import java.util.Objects;
-
-/**
- * A class to represent the animation parameters to use while animating embedding activity
- * containers.
- *
- * @see SplitAttributes.Builder#setAnimationParams
- */
-public final class AnimationParams {
-
-    /**
-     * The default value for animation resources ID, which means to use the system default
-     * animation.
-     */
-    @RequiresVendorApiLevel(level = 7)
-    @SuppressWarnings("ResourceType") // Use as a hint to use the system default animation.
-    @AnimRes
-    public static final int DEFAULT_ANIMATION_RESOURCES_ID = 0xFFFFFFFF;
-
-    private final @NonNull AnimationBackground mAnimationBackground;
-
-    @AnimRes
-    private final int mOpenAnimationResId;
-
-    @AnimRes
-    private final int mCloseAnimationResId;
-
-    @AnimRes
-    private final int mChangeAnimationResId;
-
-    /**
-     * Creates an instance of this {@code AnimationParams}.
-     *
-     * @param animationBackground   The {@link AnimationBackground} to use for the animation
-     *                              involving this {@code AnimationParams} object.
-     * @param openAnimationResId    The animation resources ID from the "android" package to use for
-     *                              open transitions.
-     * @param closeAnimationResId   The animation resources ID from the "android" package to use for
-     *                              close transitions.
-     * @param changeAnimationResId  The animation resources ID from the "android" package to use for
-     *                              change (resize or move) transitions.
-     */
-    private AnimationParams(@NonNull AnimationBackground animationBackground,
-            @AnimRes int openAnimationResId, @AnimRes int closeAnimationResId,
-            @AnimRes int changeAnimationResId) {
-        mAnimationBackground = animationBackground;
-        mOpenAnimationResId = openAnimationResId;
-        mCloseAnimationResId = closeAnimationResId;
-        mChangeAnimationResId = changeAnimationResId;
-    }
-
-    /**
-     * Returns the {@link AnimationBackground} to use for the background during the animation.
-     */
-    @RequiresVendorApiLevel(level = 7)
-    public @NonNull AnimationBackground getAnimationBackground() {
-        return mAnimationBackground;
-    }
-
-    /**
-     * Gets the open animation.
-     *
-     * @return the open animation transition resources ID from the "android" package.
-     */
-    @RequiresVendorApiLevel(level = 7)
-    @AnimRes
-    public int getOpenAnimationResId() {
-        return mOpenAnimationResId;
-    }
-
-    /**
-     * Gets the close animation.
-     *
-     * @return the close animation transition resources ID from the "android" package.
-     */
-    @RequiresVendorApiLevel(level = 7)
-    @AnimRes
-    public int getCloseAnimationResId() {
-        return mCloseAnimationResId;
-    }
-
-    /**
-     * Gets the change (resize or move) animation.
-     *
-     * @return the change (resize or move) animation transition resources ID from the "android"
-     * package.
-     */
-    @RequiresVendorApiLevel(level = 7)
-    @AnimRes
-    public int getChangeAnimationResId() {
-        return mChangeAnimationResId;
-    }
-
-    /**
-     * Builder for creating an instance of {@link AnimationParams}.
-     *
-     * - The default animation background is to use the current theme window background color.
-     * - The default animation resources ID's for transitions is the system default.
-     */
-    public static final class Builder {
-        private @NonNull AnimationBackground mAnimationBackground =
-                AnimationBackground.ANIMATION_BACKGROUND_DEFAULT;
-
-        @AnimRes
-        private int mOpenAnimationResId = DEFAULT_ANIMATION_RESOURCES_ID;
-
-        @AnimRes
-        private int mCloseAnimationResId = DEFAULT_ANIMATION_RESOURCES_ID;
-
-        @AnimRes
-        private int mChangeAnimationResId = DEFAULT_ANIMATION_RESOURCES_ID;
-
-        /** Creates a new {@link AnimationParams.Builder} to create {@link AnimationParams}. */
-        @RequiresVendorApiLevel(level = 7)
-        public Builder() {
-        }
-
-        /**
-         * Sets the {@link AnimationBackground} to use for the background during the animation.
-         * The default value is {@link AnimationBackground#ANIMATION_BACKGROUND_DEFAULT}, which
-         * means to use the current theme window background color.
-         *
-         * @param background An {@link AnimationBackground} to be used for the animation.
-         * @return this {@code Builder}.
-         */
-        @RequiresVendorApiLevel(level = 7)
-        public AnimationParams.@NonNull Builder setAnimationBackground(
-                @NonNull AnimationBackground background) {
-            mAnimationBackground = background;
-            return this;
-        }
-
-        /**
-         * Sets the open animation.
-         * Use {@link #DEFAULT_ANIMATION_RESOURCES_ID} for the system default animation.
-         * Use {@code 0} or {@link Resources#ID_NULL} for no animation.
-         *
-         * @param resId The resources ID to set from the "android" package.
-         * @return this {@code Builder}.
-         */
-        @RequiresVendorApiLevel(level = 7)
-        public AnimationParams.@NonNull Builder setOpenAnimationResId(@AnimRes int resId) {
-            mOpenAnimationResId = resId;
-            return this;
-        }
-
-        /**
-         * Sets the close animation.
-         * Use {@link #DEFAULT_ANIMATION_RESOURCES_ID} for the system default animation.
-         * Use {@code 0} or {@link Resources#ID_NULL} for no animation.
-         *
-         * @param resId The resources ID to set from the "android" package.
-         * @return this {@code Builder}.
-         */
-        @RequiresVendorApiLevel(level = 7)
-        public AnimationParams.@NonNull Builder setCloseAnimationResId(@AnimRes int resId) {
-            mCloseAnimationResId = resId;
-            return this;
-        }
-
-        /**
-         * Sets the change (resize or move) animation.
-         * Use {@link #DEFAULT_ANIMATION_RESOURCES_ID} for the system default animation.
-         * Use {@code 0} or {@link Resources#ID_NULL} for no animation.
-         *
-         * @param resId The resources ID to set from the "android" package.
-         * @return this {@code Builder}.
-         */
-        @RequiresVendorApiLevel(level = 7)
-        public AnimationParams.@NonNull Builder setChangeAnimationResId(@AnimRes int resId) {
-            mChangeAnimationResId = resId;
-            return this;
-        }
-
-        /**
-         * Builds a {@link AnimationParams} instance with the attributes
-         * specified by {@link #setAnimationBackground(AnimationBackground)},
-         * {@link #setOpenAnimationResId(int)}, {@link #setCloseAnimationResId(int)},
-         * and {@link #setChangeAnimationResId(int)}.
-         *
-         * @return the new {@code AnimationParams} instance.
-         */
-        @RequiresVendorApiLevel(level = 7)
-        public @NonNull AnimationParams build() {
-            return new AnimationParams(mAnimationBackground, mOpenAnimationResId,
-                    mCloseAnimationResId, mChangeAnimationResId);
-        }
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof AnimationParams)) return false;
-        AnimationParams that = (AnimationParams) o;
-        return mAnimationBackground.equals(that.mAnimationBackground)
-                && mOpenAnimationResId == that.mOpenAnimationResId
-                && mCloseAnimationResId == that.mCloseAnimationResId
-                && mChangeAnimationResId == that.mChangeAnimationResId;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mAnimationBackground, mOpenAnimationResId, mCloseAnimationResId,
-                mChangeAnimationResId);
-    }
-
-    @Override
-    public @NonNull String toString() {
-        return AnimationParams.class.getSimpleName() + "{"
-                + "animationBackground=" + mAnimationBackground
-                + ", openAnimation=" + mOpenAnimationResId
-                + ", closeAnimation=" + mCloseAnimationResId
-                + ", changeAnimation=" + mChangeAnimationResId
-                + "}";
-    }
-}
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/DividerAttributes.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/DividerAttributes.java
index c50e045..9f01b7b 100644
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/DividerAttributes.java
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/DividerAttributes.java
@@ -70,15 +70,6 @@
      */
     public static final int WIDTH_SYSTEM_DEFAULT = -1;
 
-    /**
-     * The default value for the veil color. When used, the activity window background color will be
-     * used.
-     *
-     * @see #getPrimaryVeilColor()
-     * @see #getSecondaryVeilColor()
-     */
-    public static final int DIVIDER_VEIL_COLOR_DEFAULT = Color.TRANSPARENT;
-
     /** The {@link DividerType}. */
     private final @DividerType int mDividerType;
 
@@ -93,13 +84,6 @@
      * the system will choose a default value based on the display size and form factor. Will only
      * be used when the divider type is {@link #DIVIDER_TYPE_DRAGGABLE}.
      *
-     * If {@link #isDraggingToFullscreenAllowed()} is {@code true}, the user is allowed to drag
-     * beyond this ratio, and when dragging is finished, the system will choose to either fully
-     * expand the secondary container or move the divider back to this ratio.
-     *
-     * If {@link #isDraggingToFullscreenAllowed()} is {@code false}, the user is not allowed to
-     * drag beyond this ratio.
-     *
      * @see SplitAttributes.SplitType.RatioSplitType#getRatio()
      */
     private final float mPrimaryMinRatio;
@@ -109,13 +93,6 @@
      * the system will choose a default value based on the display size and form factor. Will only
      * be used when the divider type is {@link #DIVIDER_TYPE_DRAGGABLE}.
      *
-     * If {@link #isDraggingToFullscreenAllowed()} is {@code true}, the user is allowed to drag
-     * beyond this ratio, and when dragging is finished, the system will choose to either fully
-     * expand the primary container or move the divider back to this ratio.
-     *
-     * If {@link #isDraggingToFullscreenAllowed()} is {@code false}, the user is not allowed to
-     * drag beyond this ratio.
-     *
      * @see SplitAttributes.SplitType.RatioSplitType#getRatio()
      */
     private final float mPrimaryMaxRatio;
@@ -123,15 +100,6 @@
     /** The color of the divider. */
     private final @ColorInt int mDividerColor;
 
-    /** Whether it is allowed to expand a container to full screen by dragging the divider. */
-    private final boolean mIsDraggingToFullscreenAllowed;
-
-    /** The veil color of the primary container while dragging. */
-    private final @ColorInt int mPrimaryVeilColor;
-
-    /** The veil color of the secondary container while dragging. */
-    private final @ColorInt int mSecondaryVeilColor;
-
     /**
      * Constructor of {@link DividerAttributes}.
      *
@@ -140,14 +108,6 @@
      * @param primaryMinRatio               the min split ratio for the primary container.
      * @param primaryMaxRatio               the max split ratio for the primary container.
      * @param dividerColor                  the color of the divider.
-     * @param isDraggingToFullscreenAllowed whether it is allowed to expand a container to full
-     *                                      screen by dragging the divider.
-     * @param primaryVeilColor              the veil color of the primary container while dragging.
-     *                                      If {@link #DIVIDER_VEIL_COLOR_DEFAULT}, activity window
-     *                                      background color is used.
-     * @param secondaryVeilColor            the veil color of the secondary container while
-     *                                      dragging. If {@link #DIVIDER_VEIL_COLOR_DEFAULT},
-     *                                      activity window background color is used.
      * @throws IllegalStateException if the provided values are invalid.
      */
     private DividerAttributes(
@@ -155,10 +115,7 @@
             @Dimension int widthDp,
             float primaryMinRatio,
             float primaryMaxRatio,
-            @ColorInt int dividerColor,
-            boolean isDraggingToFullscreenAllowed,
-            @ColorInt int primaryVeilColor,
-            @ColorInt int secondaryVeilColor) {
+            @ColorInt int dividerColor) {
         if (dividerType == DIVIDER_TYPE_FIXED
                 && (primaryMinRatio != RATIO_SYSTEM_DEFAULT
                 || primaryMaxRatio != RATIO_SYSTEM_DEFAULT)) {
@@ -166,13 +123,6 @@
                     "primaryMinRatio and primaryMaxRatio must be RATIO_SYSTEM_DEFAULT for "
                             + "DIVIDER_TYPE_FIXED.");
         }
-        if (dividerType == DIVIDER_TYPE_FIXED
-                && (primaryVeilColor != DIVIDER_VEIL_COLOR_DEFAULT
-                || secondaryVeilColor != DIVIDER_VEIL_COLOR_DEFAULT)) {
-            throw new IllegalStateException(
-                    "primaryVeilColor and secondaryVeilColor must be unset for"
-                            + "DIVIDER_TYPE_FIXED.");
-        }
         if (primaryMinRatio != RATIO_SYSTEM_DEFAULT && primaryMaxRatio != RATIO_SYSTEM_DEFAULT
                 && primaryMinRatio > primaryMaxRatio) {
             throw new IllegalStateException(
@@ -183,9 +133,6 @@
         mPrimaryMinRatio = primaryMinRatio;
         mPrimaryMaxRatio = primaryMaxRatio;
         mDividerColor = dividerColor;
-        mIsDraggingToFullscreenAllowed = isDraggingToFullscreenAllowed;
-        mPrimaryVeilColor = primaryVeilColor;
-        mSecondaryVeilColor = secondaryVeilColor;
     }
 
     /**
@@ -214,13 +161,6 @@
      * based on the display size and form factor. Will only be used when the divider type is
      * {@link #DIVIDER_TYPE_DRAGGABLE}.
      *
-     * If {@link #isDraggingToFullscreenAllowed()} is {@code true}, the user is allowed to drag
-     * beyond this ratio, and when dragging is finished, the system will choose to either fully
-     * expand the secondary container or move the divider back to this ratio.
-     *
-     * If {@link #isDraggingToFullscreenAllowed()} is {@code false}, the user is not allowed to
-     * drag beyond this ratio.
-     *
      * @see SplitAttributes.SplitType.RatioSplitType#getRatio()
      */
     @RequiresVendorApiLevel(level = 6)
@@ -234,13 +174,6 @@
      * based on the display size and form factor. Will only be used when the divider type is
      * {@link #DIVIDER_TYPE_DRAGGABLE}.
      *
-     * If {@link #isDraggingToFullscreenAllowed()} is {@code true}, the user is allowed to drag
-     * beyond this ratio, and when dragging is finished, the system will choose to either fully
-     * expand the primary container or move the divider back to this ratio.
-     *
-     * If {@link #isDraggingToFullscreenAllowed()} is {@code false}, the user is not allowed to
-     * drag beyond this ratio.
-     *
      * @see SplitAttributes.SplitType.RatioSplitType#getRatio()
      */
     @RequiresVendorApiLevel(level = 6)
@@ -254,33 +187,6 @@
         return mDividerColor;
     }
 
-    /**
-     * Returns whether it is allowed to expand a container to full screen by dragging the
-     * divider. Default is {@code true}.
-     */
-    @RequiresVendorApiLevel(level = 7)
-    public boolean isDraggingToFullscreenAllowed() {
-        return mIsDraggingToFullscreenAllowed;
-    }
-
-    /**
-     * Returns the veil color of the primary container. {@link #DIVIDER_VEIL_COLOR_DEFAULT}
-     * indicates that activity window background color should be used.
-     */
-    @RequiresVendorApiLevel(level = 8)
-    public @ColorInt int getPrimaryVeilColor() {
-        return mPrimaryVeilColor;
-    }
-
-    /**
-     * Returns the veil color of the secondary container. {@link #DIVIDER_VEIL_COLOR_DEFAULT}
-     * indicates that activity window background color should be used.
-     */
-    @RequiresVendorApiLevel(level = 8)
-    public @ColorInt int getSecondaryVeilColor() {
-        return mSecondaryVeilColor;
-    }
-
     @Override
     public boolean equals(@Nullable Object obj) {
         if (this == obj) return true;
@@ -290,16 +196,12 @@
                 && mWidthDp == other.mWidthDp
                 && mPrimaryMinRatio == other.mPrimaryMinRatio
                 && mPrimaryMaxRatio == other.mPrimaryMaxRatio
-                && mDividerColor == other.mDividerColor
-                && mIsDraggingToFullscreenAllowed == other.mIsDraggingToFullscreenAllowed
-                && mPrimaryVeilColor == other.mPrimaryVeilColor
-                && mSecondaryVeilColor == other.mSecondaryVeilColor;
+                && mDividerColor == other.mDividerColor;
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(mDividerType, mWidthDp, mPrimaryMinRatio, mPrimaryMaxRatio,
-                mIsDraggingToFullscreenAllowed, mPrimaryVeilColor, mSecondaryVeilColor);
+        return Objects.hash(mDividerType, mWidthDp, mPrimaryMinRatio, mPrimaryMaxRatio);
     }
 
     @Override
@@ -310,9 +212,6 @@
                 + ", minPrimaryRatio=" + mPrimaryMinRatio
                 + ", maxPrimaryRatio=" + mPrimaryMaxRatio
                 + ", dividerColor=" + mDividerColor
-                + ", isDraggingToFullscreenAllowed=" + mIsDraggingToFullscreenAllowed
-                + ", mPrimaryVeilColor=" + mPrimaryVeilColor
-                + ", mSecondaryVeilColor=" + mSecondaryVeilColor
                 + "}";
     }
 
@@ -329,12 +228,6 @@
 
         private @ColorInt int mDividerColor = Color.BLACK;
 
-        private boolean mIsDraggingToFullscreenAllowed = false;
-
-        private @ColorInt int mPrimaryVeilColor = DIVIDER_VEIL_COLOR_DEFAULT;
-
-        private @ColorInt int  mSecondaryVeilColor = DIVIDER_VEIL_COLOR_DEFAULT;
-
         /**
          * The {@link DividerAttributes} builder constructor.
          *
@@ -360,9 +253,6 @@
             mPrimaryMinRatio = original.mPrimaryMinRatio;
             mPrimaryMaxRatio = original.mPrimaryMaxRatio;
             mDividerColor = original.mDividerColor;
-            mIsDraggingToFullscreenAllowed = original.mIsDraggingToFullscreenAllowed;
-            mPrimaryVeilColor = original.mPrimaryVeilColor;
-            mSecondaryVeilColor = original.mSecondaryVeilColor;
         }
 
         /**
@@ -387,13 +277,6 @@
          * on the display size and form factor. Will only be used when the divider type is
          * {@link #DIVIDER_TYPE_DRAGGABLE}.
          *
-         * If {@link #isDraggingToFullscreenAllowed()} is {@code true}, the user is allowed to drag
-         * beyond this ratio, and when dragging is finished, the system will choose to either fully
-         * expand the secondary container or move the divider back to this ratio.
-         *
-         * If {@link #isDraggingToFullscreenAllowed()} is {@code false}, the user is not allowed to
-         * drag beyond this ratio.
-         *
          * @param primaryMinRatio the min ratio for the primary container. Must be in range
          *                        [0.0, 1.0) or {@link #RATIO_SYSTEM_DEFAULT}.
          * @throws IllegalArgumentException if the provided value is invalid.
@@ -416,13 +299,6 @@
          * based on the display size and form factor. Will only be used when the divider type is
          * {@link #DIVIDER_TYPE_DRAGGABLE}.
          *
-         * If {@link #isDraggingToFullscreenAllowed()} is {@code true}, the user is allowed to drag
-         * beyond this ratio, and when dragging is finished, the system will choose to either fully
-         * expand the primary container or move the divider back to this ratio.
-         *
-         * If {@link #isDraggingToFullscreenAllowed()} is {@code false}, the user is not allowed to
-         * drag beyond this ratio.
-         *
          * @param primaryMaxRatio the max ratio for the primary container. Must be in range
          *                        (0.0, 1.0] or {@link #RATIO_SYSTEM_DEFAULT}.
          * @throws IllegalArgumentException if the provided value is invalid.
@@ -441,8 +317,7 @@
 
         /**
          * Sets the color of the divider. If not set, the default color {@link Color#BLACK} is
-         * used. Only the RGB components are used and the alpha value is ignored and always
-         * considered as fully opaque.
+         * used.
          */
         @RequiresVendorApiLevel(level = 6)
         public @NonNull Builder setDividerColor(@ColorInt int dividerColor) {
@@ -451,53 +326,6 @@
         }
 
         /**
-         * Sets whether it is allowed to expand a container to full screen by dragging the divider.
-         * Default is {@code true}.
-         */
-        @RequiresVendorApiLevel(level = 7)
-        public @NonNull Builder setDraggingToFullscreenAllowed(
-                boolean isDraggingToFullscreenAllowed) {
-            mIsDraggingToFullscreenAllowed = isDraggingToFullscreenAllowed;
-            return this;
-        }
-
-        /**
-         * Sets the veil color of the primary container. Solid color veils are used to cover
-         * activity content while dragging.
-         *
-         * The default value is {@link #DIVIDER_VEIL_COLOR_DEFAULT}.
-         *
-         * @param color the veil color for the primary container. If the value equals to
-         *              {@link #DIVIDER_VEIL_COLOR_DEFAULT}, activity window
-         *              background color is used. If {@link Color#TRANSPARENT} is used, it is
-         *              treated as {@link #DIVIDER_VEIL_COLOR_DEFAULT}. Only the RGB components are
-         *              used and the alpha value is ignored and always considered as fully opaque.
-         */
-        @RequiresVendorApiLevel(level = 8)
-        public @NonNull Builder setPrimaryVeilColor(@ColorInt int color) {
-            mPrimaryVeilColor = color;
-            return this;
-        }
-
-        /**
-         * Sets the veil color of the secondary container. Solid color veils are used to cover
-         * activity content while dragging.
-         *
-         * The default value is {@link #DIVIDER_VEIL_COLOR_DEFAULT}.
-         *
-         * @param color the veil color for the secondary container. If the value equals to
-         *              {@link #DIVIDER_VEIL_COLOR_DEFAULT}, activity window
-         *              background color is used. If {@link Color#TRANSPARENT} is used, it is
-         *              treated as {@link #DIVIDER_VEIL_COLOR_DEFAULT}. Only the RGB components are
-         *              used and the alpha value is ignored and always considered as fully opaque.
-         */
-        @RequiresVendorApiLevel(level = 8)
-        public @NonNull Builder setSecondaryVeilColor(@ColorInt int color) {
-            mSecondaryVeilColor = color;
-            return this;
-        }
-
-        /**
          * Builds a {@link DividerAttributes} instance.
          *
          * @return a {@link DividerAttributes} instance.
@@ -506,8 +334,7 @@
         @RequiresVendorApiLevel(level = 6)
         public @NonNull DividerAttributes build() {
             return new DividerAttributes(mDividerType, mWidthDp, mPrimaryMinRatio,
-                    mPrimaryMaxRatio, mDividerColor, mIsDraggingToFullscreenAllowed,
-                    mPrimaryVeilColor, mSecondaryVeilColor);
+                    mPrimaryMaxRatio, mDividerColor);
         }
     }
 }
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitAttributes.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitAttributes.java
index 8101f86..163b6c7 100644
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitAttributes.java
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitAttributes.java
@@ -66,7 +66,7 @@
  *
  * @see SplitAttributes.SplitType
  * @see SplitAttributes.LayoutDirection
- * @see AnimationParams
+ * @see AnimationBackground
  */
 @RequiresVendorApiLevel(level = 2)
 public class SplitAttributes {
@@ -371,7 +371,7 @@
 
     private final @NonNull SplitType mSplitType;
 
-    private final @NonNull AnimationParams mAnimationParams;
+    private final @NonNull AnimationBackground mAnimationBackground;
 
     private final @NonNull WindowAttributes mWindowAttributes;
 
@@ -386,8 +386,9 @@
      * @param layoutDirection     The layout direction of the split, such as left to
      *                            right or top to bottom. See
      *                            {@link SplitAttributes.LayoutDirection}.
-     * @param animationParams     The {@link AnimationParams} to use for the during animation
-     *                            of the split involving this {@code SplitAttributes} object.
+     * @param animationBackground The {@link AnimationBackground} to use for the during animation
+     *                            of the split involving this {@code SplitAttributes} object if the
+     *                            animation requires a background.
      * @param attributes          The {@link WindowAttributes} of the split, such as dim area
      *                            behavior.
      * @param dividerAttributes   The {@link DividerAttributes}. If {@code null}, no divider is
@@ -396,13 +397,13 @@
     SplitAttributes(
             @NonNull SplitType splitType,
             @ExtLayoutDirection int layoutDirection,
-            @NonNull AnimationParams animationParams,
+            @NonNull AnimationBackground animationBackground,
             @NonNull WindowAttributes attributes,
             @Nullable DividerAttributes dividerAttributes
     ) {
         mSplitType = splitType;
         mLayoutDirection = layoutDirection;
-        mAnimationParams = animationParams;
+        mAnimationBackground = animationBackground;
         mWindowAttributes = attributes;
         mDividerAttributes = dividerAttributes;
     }
@@ -427,23 +428,12 @@
     }
 
     /**
-     * @deprecated Use {@link #getAnimationParams()} starting with vendor API level 7. Only used if
-     * {@link #getAnimationParams()} can't be called on vendor API level 5 and 6.
+     * Returns the {@link AnimationBackground} to use for the background during the
+     * animation of the split involving this {@code SplitAttributes} object.
      */
-    @RequiresVendorApiLevel(level = 5, deprecatedSince = 7)
-    @Deprecated
-    @SuppressWarnings("Deprecation")
+    @RequiresVendorApiLevel(level = 5)
     public @NonNull AnimationBackground getAnimationBackground() {
-        return mAnimationParams.getAnimationBackground();
-    }
-
-    /**
-     * Returns the {@link AnimationParams} to use during the animation of the split involving
-     * this {@code SplitAttributes} object.
-     */
-    @RequiresVendorApiLevel(level = 7)
-    public @NonNull AnimationParams getAnimationParams() {
-        return mAnimationParams;
+        return mAnimationBackground;
     }
 
     /**
@@ -473,7 +463,8 @@
         @ExtLayoutDirection
         private int mLayoutDirection = LOCALE;
 
-        private @NonNull AnimationParams mAnimationParams = new AnimationParams.Builder().build();
+        private @NonNull AnimationBackground mAnimationBackground =
+                AnimationBackground.ANIMATION_BACKGROUND_DEFAULT;
 
         private @NonNull WindowAttributes mWindowAttributes =
                 new WindowAttributes(DIM_AREA_ON_TASK);
@@ -493,7 +484,7 @@
         public Builder(@NonNull SplitAttributes original) {
             mSplitType = original.mSplitType;
             mLayoutDirection = original.mLayoutDirection;
-            mAnimationParams = original.mAnimationParams;
+            mAnimationBackground = original.mAnimationBackground;
             mWindowAttributes = original.mWindowAttributes;
             mDividerAttributes = original.mDividerAttributes;
         }
@@ -536,29 +527,20 @@
         }
 
         /**
-         * @deprecated Use {@link #setAnimationParams(AnimationParams)} starting with vendor API
-         * level 7. Only used if {@link #setAnimationParams(AnimationParams)} can't be called on
-         * vendor API level 5 and 6.
-         */
-        @RequiresVendorApiLevel(level = 5, deprecatedSince = 7)
-        @Deprecated
-        @SuppressWarnings("Deprecation")
-        public @NonNull Builder setAnimationBackground(@NonNull AnimationBackground background) {
-            mAnimationParams =
-                    new AnimationParams.Builder().setAnimationBackground(background).build();
-            return this;
-        }
-
-        /**
-         * Sets the {@link AnimationParams} to use during the animation of the split involving this
-         * {@code SplitAttributes} object.
+         * Sets the {@link AnimationBackground} to use for the background during the
+         * animation of the split involving this {@code SplitAttributes} object
+         * if the animation requires a background.
          *
-         * @param params The {@link AnimationParams} to be used for the animation of the split.
+         * The default value is {@link AnimationBackground#ANIMATION_BACKGROUND_DEFAULT}, which
+         * means to use the current theme window background color.
+         *
+         * @param background An {@link AnimationBackground} to be used for the animation of the
+         *                   split.
          * @return This {@code Builder}.
          */
-        @RequiresVendorApiLevel(level = 7)
-        public @NonNull Builder setAnimationParams(@NonNull AnimationParams params) {
-            mAnimationParams = params;
+        @RequiresVendorApiLevel(level = 5)
+        public @NonNull Builder setAnimationBackground(@NonNull AnimationBackground background) {
+            mAnimationBackground = background;
             return this;
         }
 
@@ -587,12 +569,12 @@
         /**
          * Builds a {@link SplitAttributes} instance with the attributes
          * specified by {@link #setSplitType}, {@link #setLayoutDirection}, and
-         * {@link #setAnimationParams}.
+         * {@link #setAnimationBackground}.
          *
          * @return The new {@code SplitAttributes} instance.
          */
         public @NonNull SplitAttributes build() {
-            return new SplitAttributes(mSplitType, mLayoutDirection, mAnimationParams,
+            return new SplitAttributes(mSplitType, mLayoutDirection, mAnimationBackground,
                     mWindowAttributes, mDividerAttributes);
         }
     }
@@ -603,14 +585,14 @@
         if (!(o instanceof SplitAttributes)) return false;
         SplitAttributes that = (SplitAttributes) o;
         return mLayoutDirection == that.mLayoutDirection && mSplitType.equals(that.mSplitType)
-                && Objects.equals(mAnimationParams, that.mAnimationParams)
+                && mAnimationBackground.equals(that.mAnimationBackground)
                 && mWindowAttributes.equals(that.mWindowAttributes)
                 && Objects.equals(mDividerAttributes, that.mDividerAttributes);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(mLayoutDirection, mSplitType, mAnimationParams, mWindowAttributes,
+        return Objects.hash(mLayoutDirection, mSplitType, mAnimationBackground, mWindowAttributes,
                 mDividerAttributes);
     }
 
@@ -619,7 +601,7 @@
         return SplitAttributes.class.getSimpleName() + "{"
                 + "layoutDir=" + layoutDirectionToString()
                 + ", splitType=" + mSplitType
-                + ", animationParams=" + mAnimationParams
+                + ", animationBackground=" + mAnimationBackground
                 + ", windowAttributes=" + mWindowAttributes
                 + ", dividerAttributes=" + mDividerAttributes
                 + "}";
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java
index ca2faf0..bbc3f51 100644
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java
@@ -109,25 +109,4 @@
         throw new UnsupportedOperationException("This method will not be called unless there is a"
                 + " corresponding override implementation on the device");
     }
-
-    /**
-     * Returns the current {@link WindowLayoutInfo} for the given {@link Context}.
-     * <p>
-     * This API provides a convenient way to access the current {@link WindowLayoutInfo} without
-     * registering a listener via {@link #addWindowLayoutInfoListener(Context, Consumer)}. It
-     * simplifies the retrieval of {@link WindowLayoutInfo} in scenarios like
-     * {@link Activity#onCreate(Bundle)}.
-     *
-     * @param context a {@link Context} that corresponds to a window or an area on the screen.
-     *                This can be an {@link Activity}, a {@link Context} created with
-     *                {@link Context#createWindowContext(Display, int, Bundle)}, or an
-     *                {@link android.inputmethodservice.InputMethodService}.
-     * @return the current {@link WindowLayoutInfo} for the given {@link Context}.
-     */
-    @RequiresVendorApiLevel(level = 9)
-    default @NonNull WindowLayoutInfo getCurrentWindowLayoutInfo(
-            @UiContext @NonNull Context context) {
-        throw new UnsupportedOperationException("This method will not be called unless there is a"
-                + " corresponding override implementation on the device");
-    }
 }
diff --git a/window/extensions/extensions/src/test/java/androidx/window/extensions/embedding/DividerAttributesTest.java b/window/extensions/extensions/src/test/java/androidx/window/extensions/embedding/DividerAttributesTest.java
index 5ba0207..71805a9 100644
--- a/window/extensions/extensions/src/test/java/androidx/window/extensions/embedding/DividerAttributesTest.java
+++ b/window/extensions/extensions/src/test/java/androidx/window/extensions/embedding/DividerAttributesTest.java
@@ -25,8 +25,6 @@
 
 import static org.junit.Assert.assertThrows;
 
-import android.graphics.Color;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -43,10 +41,6 @@
         assertThat(defaultAttrs.getWidthDp()).isEqualTo(WIDTH_SYSTEM_DEFAULT);
         assertThat(defaultAttrs.getPrimaryMinRatio()).isEqualTo(RATIO_SYSTEM_DEFAULT);
         assertThat(defaultAttrs.getPrimaryMaxRatio()).isEqualTo(RATIO_SYSTEM_DEFAULT);
-        assertThat(defaultAttrs.getPrimaryVeilColor()).isEqualTo(
-                DividerAttributes.DIVIDER_VEIL_COLOR_DEFAULT);
-        assertThat(defaultAttrs.getSecondaryVeilColor()).isEqualTo(
-                DividerAttributes.DIVIDER_VEIL_COLOR_DEFAULT);
     }
 
     @Test
@@ -59,10 +53,7 @@
         assertThat(dividerAttributes1.getWidthDp()).isEqualTo(20);
         assertThat(dividerAttributes1.getPrimaryMinRatio()).isEqualTo(RATIO_SYSTEM_DEFAULT);
         assertThat(dividerAttributes1.getPrimaryMaxRatio()).isEqualTo(RATIO_SYSTEM_DEFAULT);
-        assertThat(dividerAttributes1.getPrimaryVeilColor()).isEqualTo(
-                DividerAttributes.DIVIDER_VEIL_COLOR_DEFAULT);
-        assertThat(dividerAttributes1.getSecondaryVeilColor()).isEqualTo(
-                DividerAttributes.DIVIDER_VEIL_COLOR_DEFAULT);
+
         final DividerAttributes dividerAttributes2 =
                 new DividerAttributes.Builder(DIVIDER_TYPE_DRAGGABLE)
                         .setWidthDp(20)
@@ -73,10 +64,6 @@
         assertThat(dividerAttributes2.getWidthDp()).isEqualTo(20);
         assertThat(dividerAttributes2.getPrimaryMinRatio()).isEqualTo(0.2f);
         assertThat(dividerAttributes2.getPrimaryMaxRatio()).isEqualTo(0.8f);
-        assertThat(dividerAttributes2.getPrimaryVeilColor()).isEqualTo(
-                DividerAttributes.DIVIDER_VEIL_COLOR_DEFAULT);
-        assertThat(dividerAttributes2.getSecondaryVeilColor()).isEqualTo(
-                DividerAttributes.DIVIDER_VEIL_COLOR_DEFAULT);
 
         final DividerAttributes dividerAttributes3 =
                 new DividerAttributes.Builder(DIVIDER_TYPE_DRAGGABLE)
@@ -86,10 +73,6 @@
         assertThat(dividerAttributes3.getWidthDp()).isEqualTo(20);
         assertThat(dividerAttributes3.getPrimaryMinRatio()).isEqualTo(RATIO_SYSTEM_DEFAULT);
         assertThat(dividerAttributes3.getPrimaryMaxRatio()).isEqualTo(RATIO_SYSTEM_DEFAULT);
-        assertThat(dividerAttributes3.getPrimaryVeilColor()).isEqualTo(
-                DividerAttributes.DIVIDER_VEIL_COLOR_DEFAULT);
-        assertThat(dividerAttributes3.getSecondaryVeilColor()).isEqualTo(
-                DividerAttributes.DIVIDER_VEIL_COLOR_DEFAULT);
 
         final DividerAttributes dividerAttributes4 =
                 new DividerAttributes.Builder(DIVIDER_TYPE_DRAGGABLE)
@@ -100,10 +83,6 @@
         assertThat(dividerAttributes4.getWidthDp()).isEqualTo(20);
         assertThat(dividerAttributes4.getPrimaryMinRatio()).isEqualTo(0.2f);
         assertThat(dividerAttributes4.getPrimaryMaxRatio()).isEqualTo(RATIO_SYSTEM_DEFAULT);
-        assertThat(dividerAttributes4.getPrimaryVeilColor()).isEqualTo(
-                DividerAttributes.DIVIDER_VEIL_COLOR_DEFAULT);
-        assertThat(dividerAttributes4.getSecondaryVeilColor()).isEqualTo(
-                DividerAttributes.DIVIDER_VEIL_COLOR_DEFAULT);
 
         final DividerAttributes dividerAttributes5 =
                 new DividerAttributes.Builder(DIVIDER_TYPE_DRAGGABLE)
@@ -114,23 +93,6 @@
         assertThat(dividerAttributes5.getWidthDp()).isEqualTo(20);
         assertThat(dividerAttributes5.getPrimaryMinRatio()).isEqualTo(RATIO_SYSTEM_DEFAULT);
         assertThat(dividerAttributes5.getPrimaryMaxRatio()).isEqualTo(0.2f);
-        assertThat(dividerAttributes5.getPrimaryVeilColor()).isEqualTo(
-                DividerAttributes.DIVIDER_VEIL_COLOR_DEFAULT);
-        assertThat(dividerAttributes5.getSecondaryVeilColor()).isEqualTo(
-                DividerAttributes.DIVIDER_VEIL_COLOR_DEFAULT);
-
-        final DividerAttributes dividerAttributes6 =
-                new DividerAttributes.Builder(DIVIDER_TYPE_DRAGGABLE)
-                        .setWidthDp(20)
-                        .setPrimaryVeilColor(Color.BLUE)
-                        .setSecondaryVeilColor(Color.GREEN)
-                        .build();
-        assertThat(dividerAttributes6.getDividerType()).isEqualTo(DIVIDER_TYPE_DRAGGABLE);
-        assertThat(dividerAttributes6.getWidthDp()).isEqualTo(20);
-        assertThat(dividerAttributes6.getPrimaryMinRatio()).isEqualTo(RATIO_SYSTEM_DEFAULT);
-        assertThat(dividerAttributes6.getPrimaryMaxRatio()).isEqualTo(RATIO_SYSTEM_DEFAULT);
-        assertThat(dividerAttributes6.getPrimaryVeilColor()).isEqualTo(Color.BLUE);
-        assertThat(dividerAttributes6.getSecondaryVeilColor()).isEqualTo(Color.GREEN);
     }
 
     @Test
@@ -154,30 +116,8 @@
                         .setWidthDp(20)
                         .build();
 
-        final DividerAttributes dividerAttributes4 =
-                new DividerAttributes.Builder(DIVIDER_TYPE_DRAGGABLE)
-                        .setWidthDp(20)
-                        .setPrimaryMinRatio(0.2f)
-                        .setPrimaryMaxRatio(0.8f)
-                        .setPrimaryVeilColor(
-                                DividerAttributes.DIVIDER_VEIL_COLOR_DEFAULT)
-                        .setSecondaryVeilColor(
-                                DividerAttributes.DIVIDER_VEIL_COLOR_DEFAULT)
-                        .build();
-
-        final DividerAttributes dividerAttributes5 =
-                new DividerAttributes.Builder(DIVIDER_TYPE_DRAGGABLE)
-                        .setWidthDp(20)
-                        .setPrimaryMinRatio(0.2f)
-                        .setPrimaryMaxRatio(0.8f)
-                        .setPrimaryVeilColor(Color.BLUE)
-                        .setSecondaryVeilColor(Color.GREEN)
-                        .build();
-
         assertThat(dividerAttributes1).isEqualTo(dividerAttributes2);
         assertThat(dividerAttributes1).isNotEqualTo(dividerAttributes3);
-        assertThat(dividerAttributes1).isEqualTo(dividerAttributes4);
-        assertThat(dividerAttributes1).isNotEqualTo(dividerAttributes5);
     }
 
     @Test
@@ -192,22 +132,6 @@
         );
 
         assertThrows(
-                "Must not set primary veil color for DIVIDER_TYPE_FIXED",
-                IllegalStateException.class,
-                () -> new DividerAttributes.Builder(DIVIDER_TYPE_FIXED)
-                        .setPrimaryVeilColor(Color.BLUE)
-                        .build()
-        );
-
-        assertThrows(
-                "Must not set primary veil color for DIVIDER_TYPE_FIXED",
-                IllegalStateException.class,
-                () -> new DividerAttributes.Builder(DIVIDER_TYPE_FIXED)
-                        .setSecondaryVeilColor(Color.BLUE)
-                        .build()
-        );
-
-        assertThrows(
                 "Min ratio must be less than or equal to max ratio",
                 IllegalStateException.class,
                 () -> new DividerAttributes.Builder(DIVIDER_TYPE_DRAGGABLE)
diff --git a/window/extensions/extensions/src/test/java/androidx/window/extensions/embedding/SplitAttributesTest.java b/window/extensions/extensions/src/test/java/androidx/window/extensions/embedding/SplitAttributesTest.java
index f8daaf2..160adb8 100644
--- a/window/extensions/extensions/src/test/java/androidx/window/extensions/embedding/SplitAttributesTest.java
+++ b/window/extensions/extensions/src/test/java/androidx/window/extensions/embedding/SplitAttributesTest.java
@@ -34,51 +34,30 @@
 public class SplitAttributesTest {
     @Test
     public void testSplitAttributesEquals() {
-        final AnimationParams animParams1 =
-                new AnimationParams.Builder()
-                        .setAnimationBackground(AnimationBackground.ANIMATION_BACKGROUND_DEFAULT)
-                        .setOpenAnimationResId(AnimationParams.DEFAULT_ANIMATION_RESOURCES_ID)
-                        .build();
         final SplitAttributes attrs1 = new SplitAttributes.Builder()
                 .setSplitType(splitEqually())
                 .setLayoutDirection(LayoutDirection.LOCALE)
-                .setAnimationParams(animParams1)
+                .setAnimationBackground(AnimationBackground.ANIMATION_BACKGROUND_DEFAULT)
                 .build();
-        final AnimationParams animParams2 =
-                new AnimationParams.Builder()
-                        .setAnimationBackground(AnimationBackground.ANIMATION_BACKGROUND_DEFAULT)
-                        .setOpenAnimationResId(AnimationParams.DEFAULT_ANIMATION_RESOURCES_ID)
-                        .build();
         final SplitAttributes attrs2 = new SplitAttributes.Builder()
                 .setSplitType(new SplitAttributes.SplitType.HingeSplitType(splitEqually()))
                 .setLayoutDirection(LayoutDirection.LOCALE)
-                .setAnimationParams(animParams2)
+                .setAnimationBackground(AnimationBackground.ANIMATION_BACKGROUND_DEFAULT)
                 .build();
-        final AnimationParams animParams3 =
-                new AnimationParams.Builder()
-                        .setAnimationBackground(AnimationBackground.ANIMATION_BACKGROUND_DEFAULT)
-                        .setOpenAnimationResId(AnimationParams.DEFAULT_ANIMATION_RESOURCES_ID)
-                        .build();
         final SplitAttributes attrs3 = new SplitAttributes.Builder()
                 .setSplitType(new SplitAttributes.SplitType.HingeSplitType(splitEqually()))
                 .setLayoutDirection(LayoutDirection.TOP_TO_BOTTOM)
-                .setAnimationParams(animParams3)
+                .setAnimationBackground(AnimationBackground.ANIMATION_BACKGROUND_DEFAULT)
                 .build();
-        final AnimationParams animParams4and5 =
-                new AnimationParams.Builder()
-                        .setAnimationBackground(
-                                AnimationBackground.createColorBackground(Color.BLUE))
-                        .setOpenAnimationResId(android.R.anim.fade_in)
-                        .build();
         final SplitAttributes attrs4 = new SplitAttributes.Builder()
                 .setSplitType(new SplitAttributes.SplitType.HingeSplitType(splitEqually()))
                 .setLayoutDirection(LayoutDirection.TOP_TO_BOTTOM)
-                .setAnimationParams(animParams4and5)
+                .setAnimationBackground(AnimationBackground.createColorBackground(Color.BLUE))
                 .build();
         final SplitAttributes attrs5 = new SplitAttributes.Builder()
                 .setSplitType(new SplitAttributes.SplitType.HingeSplitType(splitEqually()))
                 .setLayoutDirection(LayoutDirection.TOP_TO_BOTTOM)
-                .setAnimationParams(animParams4and5)
+                .setAnimationBackground(AnimationBackground.createColorBackground(Color.BLUE))
                 .build();
 
         assertNotEquals(attrs1, attrs2);
@@ -99,11 +78,10 @@
 
     @Test
     public void testSplitAttributesEqualsUsingBuilderFromExistingInstance() {
-        final AnimationParams animParamsDefault = new AnimationParams.Builder().build();
         final SplitAttributes attrs1 = new SplitAttributes.Builder()
                 .setSplitType(splitEqually())
                 .setLayoutDirection(LayoutDirection.LOCALE)
-                .setAnimationParams(animParamsDefault)
+                .setAnimationBackground(AnimationBackground.ANIMATION_BACKGROUND_DEFAULT)
                 .build();
         final SplitAttributes attrs2 = new SplitAttributes.Builder(attrs1).build();
         assertEquals(attrs1, attrs2);
diff --git a/window/integration-tests/macrobenchmark-target/build.gradle b/window/integration-tests/macrobenchmark-target/build.gradle
index 7b29663..71c5952 100644
--- a/window/integration-tests/macrobenchmark-target/build.gradle
+++ b/window/integration-tests/macrobenchmark-target/build.gradle
@@ -42,7 +42,7 @@
     implementation(libs.constraintLayout)
     implementation(libs.kotlinStdlib)
     implementation(libs.material)
-    implementation("androidx.activity:activity:1.10.1")
+    implementation(project(":activity:activity-ktx"))
     implementation(project(":profileinstaller:profileinstaller"))
     implementation(project(":window:window-java"))
 }
diff --git a/window/window-core/src/commonMain/kotlin/androidx/window/core/layout/WindowSizeClass.kt b/window/window-core/src/commonMain/kotlin/androidx/window/core/layout/WindowSizeClass.kt
index 2d27bb2..c70b393 100644
--- a/window/window-core/src/commonMain/kotlin/androidx/window/core/layout/WindowSizeClass.kt
+++ b/window/window-core/src/commonMain/kotlin/androidx/window/core/layout/WindowSizeClass.kt
@@ -195,7 +195,7 @@
 
         /**
          * The recommended breakpoints for window size classes. This includes all the breakpoints
-         * from [BREAKPOINTS_V1] plus new breakpoints to account for the Large and Extra Large width
+         * from [BREAKPOINTS_V1] plus new breakpoints to account for Large and Extra Large width
          * breakpoints.
          *
          * @sample androidx.window.core.samples.layout.calculateWindowSizeClass
diff --git a/window/window-demos/demo/src/main/AndroidManifest.xml b/window/window-demos/demo/src/main/AndroidManifest.xml
index f2ab6a6..214ca2d 100644
--- a/window/window-demos/demo/src/main/AndroidManifest.xml
+++ b/window/window-demos/demo/src/main/AndroidManifest.xml
@@ -344,10 +344,10 @@
             android:taskAffinity="androidx.window.demo.overlay_activity_affinity" />
         <!-- endregion Overlay features -->
 
-        <!-- region WindowLayoutInfo and display configuration callbacks -->
-        <!-- The demo app shows how to get WindowLayoutInfo and display configuration update from different system callbacks. -->
+        <!-- region Display configuration callbacks -->
+        <!-- The demo app to show display configuration from different system callbacks. -->
         <activity
-            android:name=".layout.WindowStateCallbackActivity"
+            android:name=".coresdk.WindowStateCallbackActivity"
             android:exported="true"
             android:label="Window State Callbacks"
             android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
@@ -357,17 +357,7 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        <!-- The demo app shows how to get WindowLayoutInfo with the Java-supported API. -->
-        <activity
-            android:name=".layout.WindowInfoJavaApiDemoActivity"
-            android:exported="true"
-            android:label="Window Info Java Api Demo">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-        <!-- endregion WindowLayoutInfo and display configuration callbacks -->
+        <!-- endregion Display configuration callbacks -->
 
         <!-- region Activity embedding initializer -->
         <provider android:name="androidx.startup.InitializationProvider"
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/layout/WindowStateCallbackActivity.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/coresdk/WindowStateCallbackActivity.kt
similarity index 88%
rename from window/window-demos/demo/src/main/java/androidx/window/demo/layout/WindowStateCallbackActivity.kt
rename to window/window-demos/demo/src/main/java/androidx/window/demo/coresdk/WindowStateCallbackActivity.kt
index e606436..5e71bee 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/layout/WindowStateCallbackActivity.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/coresdk/WindowStateCallbackActivity.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2024 The Android Open Source Project
+ * Copyright 2023 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.window.demo.layout
+package androidx.window.demo.coresdk
 
 import android.content.ComponentCallbacks
 import android.content.Context
@@ -32,7 +32,6 @@
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.lifecycleScope
 import androidx.lifecycle.repeatOnLifecycle
-import androidx.window.WindowSdkExtensions
 import androidx.window.demo.R
 import androidx.window.demo.common.DemoTheme
 import androidx.window.layout.WindowInfoTracker
@@ -43,7 +42,6 @@
 /** Activity to show display configuration from different system callbacks. */
 class WindowStateCallbackActivity : ComponentActivity() {
     private val viewModel: WindowStateViewModel by viewModels()
-    private val extensionVersion = WindowSdkExtensions.getInstance().extensionVersion
 
     /**
      * [DisplayManager]s from `Activity` and `Application` are updated from different resource
@@ -126,24 +124,14 @@
         applicationDisplayManager.registerDisplayListener(applicationDisplayListener, handler)
         activityDisplayManager.registerDisplayListener(activityDisplayListener, handler)
         application.registerComponentCallbacks(applicationComponentCallback)
-
-        val tracker = WindowInfoTracker.getOrCreate(this)
-        val getterValue: Any =
-            if (extensionVersion >= 9) {
-                tracker.getCurrentWindowLayoutInfo(this)
-            } else {
-                "WindowLayoutInfo getter is not available on this device. " +
-                    "The WM extension version must be at least 9, " +
-                    "but this device has version $extensionVersion."
-            }
-        onWindowStateCallbackInvoked(R.string.window_layout_info_getter_title, getterValue)
-
         // Collect windowInfo when STARTED and stop when STOPPED.
         lifecycleScope.launch(Dispatchers.Main) {
             lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
-                tracker.windowLayoutInfo(this@WindowStateCallbackActivity).collect { info ->
-                    onWindowStateCallbackInvoked(R.string.window_layout_info_flow_title, info)
-                }
+                WindowInfoTracker.getOrCreate(this@WindowStateCallbackActivity)
+                    .windowLayoutInfo(this@WindowStateCallbackActivity)
+                    .collect { info ->
+                        onWindowStateCallbackInvoked(R.string.display_feature_title, info)
+                    }
             }
         }
     }
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/layout/WindowStateScreen.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/coresdk/WindowStateScreen.kt
similarity index 99%
rename from window/window-demos/demo/src/main/java/androidx/window/demo/layout/WindowStateScreen.kt
rename to window/window-demos/demo/src/main/java/androidx/window/demo/coresdk/WindowStateScreen.kt
index f695595..3ff2766 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/layout/WindowStateScreen.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/coresdk/WindowStateScreen.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.window.demo.layout
+package androidx.window.demo.coresdk
 
 import android.graphics.Rect
 import android.view.Surface.ROTATION_0
@@ -144,7 +144,7 @@
                 activityDisplayBounds = Rect(0, 0, 2208, 1840),
             ),
             WindowState(
-                name = stringResource(R.string.window_layout_info_flow_title),
+                name = stringResource(R.string.display_feature_title),
                 applicationDisplayBounds = Rect(0, 0, 960, 2142),
                 activityDisplayBounds = Rect(0, 0, 960, 2142),
             ),
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/layout/WindowStateViewModel.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/coresdk/WindowStateViewModel.kt
similarity index 98%
rename from window/window-demos/demo/src/main/java/androidx/window/demo/layout/WindowStateViewModel.kt
rename to window/window-demos/demo/src/main/java/androidx/window/demo/coresdk/WindowStateViewModel.kt
index 1ab278b..3ecab868 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/layout/WindowStateViewModel.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/coresdk/WindowStateViewModel.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.window.demo.layout
+package androidx.window.demo.coresdk
 
 import android.graphics.Rect
 import android.view.Surface.ROTATION_0
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/DemoActivityEmbeddingController.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/DemoActivityEmbeddingController.kt
index b5b677a..2325804 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/DemoActivityEmbeddingController.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/DemoActivityEmbeddingController.kt
@@ -20,7 +20,6 @@
 import androidx.annotation.GuardedBy
 import androidx.window.demo.embedding.OverlayActivityBase.Companion.DEFAULT_OVERLAY_ATTRIBUTES
 import androidx.window.embedding.EmbeddingAnimationBackground
-import androidx.window.embedding.EmbeddingAnimationParams
 import androidx.window.embedding.OverlayAttributes
 import androidx.window.embedding.SplitAttributes
 import java.util.concurrent.atomic.AtomicBoolean
@@ -63,15 +62,6 @@
 
     @GuardedBy("lock") private var animationBackgroundLocked = EmbeddingAnimationBackground.DEFAULT
 
-    @GuardedBy("lock")
-    private var openAnimationLocked = EmbeddingAnimationParams.AnimationSpec.DEFAULT
-
-    @GuardedBy("lock")
-    private var closeAnimationLocked = EmbeddingAnimationParams.AnimationSpec.DEFAULT
-
-    @GuardedBy("lock")
-    private var changeAnimationLocked = EmbeddingAnimationParams.AnimationSpec.DEFAULT
-
     internal var animationBackground: EmbeddingAnimationBackground
         get() {
             lock.withLock {
@@ -82,36 +72,6 @@
             lock.withLock { animationBackgroundLocked = value }
         }
 
-    internal var openAnimation: EmbeddingAnimationParams.AnimationSpec
-        get() {
-            lock.withLock {
-                return openAnimationLocked
-            }
-        }
-        set(value) {
-            lock.withLock { openAnimationLocked = value }
-        }
-
-    internal var closeAnimation: EmbeddingAnimationParams.AnimationSpec
-        get() {
-            lock.withLock {
-                return closeAnimationLocked
-            }
-        }
-        set(value) {
-            lock.withLock { closeAnimationLocked = value }
-        }
-
-    internal var changeAnimation: EmbeddingAnimationParams.AnimationSpec
-        get() {
-            lock.withLock {
-                return changeAnimationLocked
-            }
-        }
-        set(value) {
-            lock.withLock { changeAnimationLocked = value }
-        }
-
     internal var overlayAttributes: OverlayAttributes
         get() {
             lock.withLock {
@@ -152,13 +112,5 @@
                 EmbeddingAnimationBackground.createColorBackground(Color.GREEN),
                 EmbeddingAnimationBackground.createColorBackground(Color.YELLOW)
             )
-
-        /** Animation spec constants. */
-        val ANIMATION_SPEC_TEXTS = arrayOf("DEFAULT", "JUMP_CUT")
-        val ANIMATION_SPEC_VALUES =
-            arrayOf(
-                EmbeddingAnimationParams.AnimationSpec.DEFAULT,
-                EmbeddingAnimationParams.AnimationSpec.JUMP_CUT
-            )
     }
 }
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExampleWindowInitializer.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExampleWindowInitializer.kt
index 4fd53cf..162392a 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExampleWindowInitializer.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExampleWindowInitializer.kt
@@ -36,7 +36,6 @@
 import androidx.window.demo.embedding.SplitDeviceStateActivityBase.Companion.TAG_SHOW_LAYOUT_FOLLOWING_HINGE_WHEN_SEPARATING
 import androidx.window.embedding.ActivityEmbeddingController
 import androidx.window.embedding.EmbeddingAnimationParams
-import androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec
 import androidx.window.embedding.EmbeddingBounds
 import androidx.window.embedding.EmbeddingConfiguration
 import androidx.window.embedding.EmbeddingConfiguration.DimAreaBehavior.Companion.ON_TASK
@@ -116,12 +115,11 @@
         val isBookMode = windowLayoutInfo.isBookMode()
         val config = params.parentConfiguration
         val shouldReversed = tag?.contains(SUFFIX_REVERSED) ?: false
-        // Always use the Demo app specified animation background.
+        // Make a copy of the default splitAttributes, but replace the animation background
+        // to what is configured in the Demo app.
+        val animationBackground = demoActivityEmbeddingController.animationBackground
         val animationParams =
-            EmbeddingAnimationParams.Builder()
-                .setAnimationBackground(demoActivityEmbeddingController.animationBackground)
-                .setDemoAppAnimations(params.defaultSplitAttributes.animationParams)
-                .build()
+            EmbeddingAnimationParams.Builder().setAnimationBackground(animationBackground).build()
         val defaultSplitAttributes =
             SplitAttributes.Builder()
                 .setLayoutDirection(params.defaultSplitAttributes.layoutDirection)
@@ -269,27 +267,6 @@
         }
     }
 
-    private fun EmbeddingAnimationParams.Builder.setDemoAppAnimations(
-        params: EmbeddingAnimationParams
-    ): EmbeddingAnimationParams.Builder {
-        // Replace the transition animations with what is configured in the Demo app if the default
-        // splitAttributes' transition animations are applicable (all configured to default).
-        val useDemoAppAnimations =
-            params.openAnimation == AnimationSpec.DEFAULT &&
-                params.closeAnimation == AnimationSpec.DEFAULT &&
-                params.changeAnimation == AnimationSpec.DEFAULT
-        if (useDemoAppAnimations) {
-            setOpenAnimation(demoActivityEmbeddingController.openAnimation)
-            setCloseAnimation(demoActivityEmbeddingController.closeAnimation)
-            setChangeAnimation(demoActivityEmbeddingController.changeAnimation)
-        } else {
-            setOpenAnimation(params.openAnimation)
-            setCloseAnimation(params.closeAnimation)
-            setChangeAnimation(params.changeAnimation)
-        }
-        return this
-    }
-
     private fun sampleOverlayAttributesCalculator(
         params: OverlayAttributesCalculatorParams
     ): OverlayAttributes =
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityBase.java b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityBase.java
index e45d8f0..1e5f958 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityBase.java
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityBase.java
@@ -50,8 +50,6 @@
 import androidx.window.embedding.DividerAttributes.DraggableDividerAttributes;
 import androidx.window.embedding.DividerAttributes.FixedDividerAttributes;
 import androidx.window.embedding.EmbeddedActivityWindowInfo;
-import androidx.window.embedding.EmbeddingAnimationParams;
-import androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec;
 import androidx.window.embedding.EmbeddingRule;
 import androidx.window.embedding.RuleController;
 import androidx.window.embedding.SplitAttributes;
@@ -233,7 +231,6 @@
         ActivityRule configE = getRuleFor(SplitActivityE.class);
         mRecyclerViewBindingData.fullscreenECheckBox.setChecked(
                 configE != null && configE.getAlwaysExpand());
-
         mUpdatingConfigs = false;
     }
 
@@ -462,16 +459,6 @@
             setCheckedChanged(mRecyclerViewBindingData.draggableDividerCheckBox);
         }
 
-        if (extensionVersion < 7) {
-            mRecyclerViewBindingData.openAnimationJumpCutCheckBox.setVisible(false);
-            mRecyclerViewBindingData.closeAnimationJumpCutCheckBox.setVisible(false);
-            mRecyclerViewBindingData.changeAnimationJumpCutCheckBox.setVisible(false);
-        } else {
-            setCheckedChanged(mRecyclerViewBindingData.openAnimationJumpCutCheckBox);
-            setCheckedChanged(mRecyclerViewBindingData.closeAnimationJumpCutCheckBox);
-            setCheckedChanged(mRecyclerViewBindingData.changeAnimationJumpCutCheckBox);
-        }
-
         // Listen for split configuration checkboxes to update the rules before launching
         // activities.
         setCheckedChanged(
@@ -494,6 +481,7 @@
                         mRecyclerViewBindingData.useStickyPlaceholderCheckBox.setChecked(false);
                     }
                 });
+
         setCheckedChanged(mRecyclerViewBindingData.splitMainCheckBox);
         setCheckedChanged(mRecyclerViewBindingData.useStickyPlaceholderCheckBox);
         setCheckedChanged(mRecyclerViewBindingData.finishBCCheckBox);
@@ -544,7 +532,6 @@
                 dividerAttributes =
                         new DraggableDividerAttributes.Builder()
                                 .setWidthDp(1)
-                                .setDraggingToFullscreenAllowed(true)
                                 .build();
             } else {
                 dividerAttributes = new FixedDividerAttributes.Builder().setWidthDp(1).build();
@@ -553,24 +540,10 @@
             dividerAttributes = DividerAttributes.NO_DIVIDER;
         }
 
-        final EmbeddingAnimationParams.Builder animationParamsBuilder =
-                new EmbeddingAnimationParams.Builder();
-        if (mRecyclerViewBindingData.openAnimationJumpCutCheckBox.isChecked()) {
-            animationParamsBuilder.setOpenAnimation(AnimationSpec.JUMP_CUT);
-        }
-        if (mRecyclerViewBindingData.closeAnimationJumpCutCheckBox.isChecked()) {
-            animationParamsBuilder.setCloseAnimation(AnimationSpec.JUMP_CUT);
-        }
-        if (mRecyclerViewBindingData.changeAnimationJumpCutCheckBox.isChecked()) {
-            animationParamsBuilder.setChangeAnimation(AnimationSpec.JUMP_CUT);
-        }
-        final EmbeddingAnimationParams animationParams = animationParamsBuilder.build();
-
         final SplitAttributes defaultSplitAttributes =
                 new SplitAttributes.Builder()
                         .setSplitType(SplitAttributes.SplitType.ratio(SPLIT_RATIO))
                         .setDividerAttributes(dividerAttributes)
-                        .setAnimationParams(animationParams)
                         .build();
 
         if (mRecyclerViewBindingData.splitMainCheckBox.isChecked()) {
@@ -596,12 +569,6 @@
 
         mRecyclerViewBindingData.draggableDividerCheckBox.setEnabled(
                 mRecyclerViewBindingData.dividerCheckBox.isChecked());
-        final boolean isEnabled = mRecyclerViewBindingData.splitMainCheckBox.isChecked();
-        mRecyclerViewBindingData.openAnimationJumpCutCheckBox.setEnabled(isEnabled);
-        mRecyclerViewBindingData.closeAnimationJumpCutCheckBox.setEnabled(
-                mRecyclerViewBindingData.splitMainCheckBox.isChecked());
-        mRecyclerViewBindingData.changeAnimationJumpCutCheckBox.setEnabled(
-                mRecyclerViewBindingData.splitMainCheckBox.isChecked());
 
         if (mRecyclerViewBindingData.usePlaceholderCheckBox.isChecked()) {
             // Split B with placeholder.
@@ -699,7 +666,7 @@
 
     /** Updates the status label that says when an activity is embedded. */
     private void updateEmbeddedStatus(boolean isEmbedded) {
-        mRecyclerViewBindingData.embeddedBoundsTextView.setVisible(isEmbedded);
+        mRecyclerViewBindingData.embeddedStatusTextView.setVisible(isEmbedded);
     }
 
     private void updateEmbeddedWindowInfo(@NonNull EmbeddedActivityWindowInfo info) {
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityDetail.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityDetail.kt
index 483b683..7e79b83 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityDetail.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityDetail.kt
@@ -18,7 +18,6 @@
 
 import android.content.Intent
 import android.graphics.Color
-import android.graphics.drawable.ColorDrawable
 import android.os.Bundle
 import android.widget.TextView
 import androidx.window.demo.common.EdgeToEdgeActivity
@@ -32,15 +31,13 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
-        val color = Color.parseColor("#fff3e0")
         viewBinding = ActivitySplitActivityListDetailLayoutBinding.inflate(layoutInflater)
-        viewBinding.rootSplitActivityLayout.setBackgroundColor(color)
+        viewBinding.rootSplitActivityLayout.setBackgroundColor(Color.parseColor("#fff3e0"))
         setContentView(viewBinding.root)
         itemDetailTextView = viewBinding.itemDetailText
 
         itemDetailTextView.text = intent.getStringExtra(EXTRA_SELECTED_ITEM)
 
-        window.setBackgroundDrawable(ColorDrawable(color))
         window.decorView.setOnFocusChangeListener { _, focus ->
             itemDetailTextView.text = "${itemDetailTextView.text} focus=$focus"
         }
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityList.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityList.kt
index 6cf85b2..d7e1cf4 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityList.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityList.kt
@@ -18,7 +18,6 @@
 
 import android.content.Intent
 import android.graphics.Color
-import android.graphics.drawable.ColorDrawable
 import android.os.Bundle
 import android.view.View
 import android.widget.TextView
@@ -38,15 +37,11 @@
 open class SplitActivityList : EdgeToEdgeActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-
-        val color = Color.parseColor("#e0f7fa")
         viewBinding = ActivitySplitActivityListLayoutBinding.inflate(layoutInflater)
         setContentView(viewBinding.root)
-        viewBinding.root.setBackgroundColor(color)
+        viewBinding.root.setBackgroundColor(Color.parseColor("#e0f7fa"))
         val splitController = SplitController.getInstance(this)
 
-        window.setBackgroundDrawable(ColorDrawable(color))
-
         lifecycleScope.launch {
             // The block passed to repeatOnLifecycle is executed when the lifecycle
             // is at least STARTED and is cancelled when the lifecycle is STOPPED.
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityRecyclerViewAdapter.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityRecyclerViewAdapter.kt
index 6e45ebb..9abedcf 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityRecyclerViewAdapter.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityRecyclerViewAdapter.kt
@@ -105,7 +105,6 @@
 
         fun bind(item: Item) {
             binding.itemCheckbox.visibility = if (item.isVisible) View.VISIBLE else View.GONE
-            binding.itemCheckbox.setOnCheckedChangeListener(null)
             binding.itemCheckbox.isChecked = item.isChecked
             binding.itemCheckbox.setOnCheckedChangeListener { _, isChecked ->
                 item.isChecked = isChecked
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityRecyclerViewBindingData.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityRecyclerViewBindingData.kt
index 242632b..aa868a6 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityRecyclerViewBindingData.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityRecyclerViewBindingData.kt
@@ -23,7 +23,7 @@
  * corresponding views in each item.
  */
 class SplitActivityRecyclerViewBindingData {
-    class Item(
+    data class Item(
         val type: Int,
         val withDivider: Boolean = false,
     ) {
@@ -93,6 +93,12 @@
     }
 
     @JvmField
+    val embeddedStatusTextView =
+        Item(Item.TYPE_TEXT).apply {
+            text = "Activity is embedded"
+            isVisible = false
+        }
+    @JvmField
     val embeddedBoundsTextView =
         Item(Item.TYPE_TEXT).apply {
             text = "Embedded bounds not available"
@@ -188,13 +194,11 @@
 
     fun getItems() =
         listOf(
+            embeddedStatusTextView,
             embeddedBoundsTextView,
             splitMainCheckBox,
             dividerCheckBox,
             draggableDividerCheckBox,
-            openAnimationJumpCutCheckBox,
-            closeAnimationJumpCutCheckBox,
-            changeAnimationJumpCutCheckBox,
             launchBButton,
             usePlaceholderCheckBox,
             useStickyPlaceholderCheckBox,
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitAttributesToggleMainActivity.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitAttributesToggleMainActivity.kt
index 1ef955d..588b87c 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitAttributesToggleMainActivity.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitAttributesToggleMainActivity.kt
@@ -440,15 +440,6 @@
             R.id.animation_background_dropdown ->
                 demoActivityEmbeddingController.animationBackground =
                     DemoActivityEmbeddingController.ANIMATION_BACKGROUND_VALUES[position]
-            R.id.open_animation_dropdown ->
-                demoActivityEmbeddingController.openAnimation =
-                    DemoActivityEmbeddingController.ANIMATION_SPEC_VALUES[position]
-            R.id.close_animation_dropdown ->
-                demoActivityEmbeddingController.closeAnimation =
-                    DemoActivityEmbeddingController.ANIMATION_SPEC_VALUES[position]
-            R.id.change_animation_dropdown ->
-                demoActivityEmbeddingController.changeAnimation =
-                    DemoActivityEmbeddingController.ANIMATION_SPEC_VALUES[position]
         }
         activityEmbeddingController.invalidateVisibleActivityStacks()
     }
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitAttributesTogglePrimaryActivity.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitAttributesTogglePrimaryActivity.kt
index 38587a7..3544ddfd 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitAttributesTogglePrimaryActivity.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitAttributesTogglePrimaryActivity.kt
@@ -83,45 +83,6 @@
             animationBackgroundDropdown.onItemSelectedListener = this
         }
 
-        // Animation transitions
-        if (WindowSdkExtensions.getInstance().extensionVersion >= 7) {
-            val openAnimationDropdown = viewBinding.openAnimationDropdown
-            openAnimationDropdown.visibility = View.VISIBLE
-            viewBinding.openAnimationDivider.visibility = View.VISIBLE
-            viewBinding.openAnimationTextView.visibility = View.VISIBLE
-            openAnimationDropdown.adapter =
-                ArrayAdapter(
-                    this,
-                    android.R.layout.simple_spinner_dropdown_item,
-                    DemoActivityEmbeddingController.ANIMATION_SPEC_TEXTS
-                )
-            openAnimationDropdown.onItemSelectedListener = this
-
-            val closeAnimationDropdown = viewBinding.closeAnimationDropdown
-            closeAnimationDropdown.visibility = View.VISIBLE
-            viewBinding.closeAnimationDivider.visibility = View.VISIBLE
-            viewBinding.closeAnimationTextView.visibility = View.VISIBLE
-            closeAnimationDropdown.adapter =
-                ArrayAdapter(
-                    this,
-                    android.R.layout.simple_spinner_dropdown_item,
-                    DemoActivityEmbeddingController.ANIMATION_SPEC_TEXTS
-                )
-            closeAnimationDropdown.onItemSelectedListener = this
-
-            val changeAnimationDropdown = viewBinding.changeAnimationDropdown
-            changeAnimationDropdown.visibility = View.VISIBLE
-            viewBinding.changeAnimationDivider.visibility = View.VISIBLE
-            viewBinding.changeAnimationTextView.visibility = View.VISIBLE
-            changeAnimationDropdown.adapter =
-                ArrayAdapter(
-                    this,
-                    android.R.layout.simple_spinner_dropdown_item,
-                    DemoActivityEmbeddingController.ANIMATION_SPEC_TEXTS
-                )
-            changeAnimationDropdown.onItemSelectedListener = this
-        }
-
         lifecycleScope.launch {
             // The block passed to repeatOnLifecycle is executed when the lifecycle
             // is at least STARTED and is cancelled when the lifecycle is STOPPED.
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityBase.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityBase.kt
index ff94d18..04ca1a5b 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityBase.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityBase.kt
@@ -143,46 +143,6 @@
             animationBackgroundDropdown.onItemSelectedListener = this
         }
 
-        // Animation transitions
-        if (WindowSdkExtensions.getInstance().extensionVersion >= 7 && componentName == activityA) {
-            // Show on only the primary activity.
-            val openAnimationDropdown = viewBinding.openAnimationDropdown
-            openAnimationDropdown.visibility = View.VISIBLE
-            viewBinding.openAnimationDivider.visibility = View.VISIBLE
-            viewBinding.openAnimationTextView.visibility = View.VISIBLE
-            openAnimationDropdown.adapter =
-                ArrayAdapter(
-                    this,
-                    android.R.layout.simple_spinner_dropdown_item,
-                    DemoActivityEmbeddingController.ANIMATION_SPEC_TEXTS
-                )
-            openAnimationDropdown.onItemSelectedListener = this
-
-            val closeAnimationDropdown = viewBinding.closeAnimationDropdown
-            closeAnimationDropdown.visibility = View.VISIBLE
-            viewBinding.closeAnimationDivider.visibility = View.VISIBLE
-            viewBinding.closeAnimationTextView.visibility = View.VISIBLE
-            closeAnimationDropdown.adapter =
-                ArrayAdapter(
-                    this,
-                    android.R.layout.simple_spinner_dropdown_item,
-                    DemoActivityEmbeddingController.ANIMATION_SPEC_TEXTS
-                )
-            closeAnimationDropdown.onItemSelectedListener = this
-
-            val changeAnimationDropdown = viewBinding.changeAnimationDropdown
-            changeAnimationDropdown.visibility = View.VISIBLE
-            viewBinding.changeAnimationDivider.visibility = View.VISIBLE
-            viewBinding.changeAnimationTextView.visibility = View.VISIBLE
-            changeAnimationDropdown.adapter =
-                ArrayAdapter(
-                    this,
-                    android.R.layout.simple_spinner_dropdown_item,
-                    DemoActivityEmbeddingController.ANIMATION_SPEC_TEXTS
-                )
-            changeAnimationDropdown.onItemSelectedListener = this
-        }
-
         lifecycleScope.launch {
             // The block passed to repeatOnLifecycle is executed when the lifecycle
             // is at least STARTED and is cancelled when the lifecycle is STOPPED.
@@ -236,20 +196,8 @@
     }
 
     override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
-        when (parent?.id) {
-            R.id.animation_background_dropdown ->
-                demoActivityEmbeddingController.animationBackground =
-                    DemoActivityEmbeddingController.ANIMATION_BACKGROUND_VALUES[position]
-            R.id.open_animation_dropdown ->
-                demoActivityEmbeddingController.openAnimation =
-                    DemoActivityEmbeddingController.ANIMATION_SPEC_VALUES[position]
-            R.id.close_animation_dropdown ->
-                demoActivityEmbeddingController.closeAnimation =
-                    DemoActivityEmbeddingController.ANIMATION_SPEC_VALUES[position]
-            R.id.change_animation_dropdown ->
-                demoActivityEmbeddingController.changeAnimation =
-                    DemoActivityEmbeddingController.ANIMATION_SPEC_VALUES[position]
-        }
+        demoActivityEmbeddingController.animationBackground =
+            DemoActivityEmbeddingController.ANIMATION_BACKGROUND_VALUES[position]
         updateSplitPairRuleWithRadioButtonId(lastCheckedRuleId)
     }
 
@@ -328,9 +276,6 @@
                 .setAnimationParams(
                     EmbeddingAnimationParams.Builder()
                         .setAnimationBackground(demoActivityEmbeddingController.animationBackground)
-                        .setOpenAnimation(demoActivityEmbeddingController.openAnimation)
-                        .setCloseAnimation(demoActivityEmbeddingController.closeAnimation)
-                        .setChangeAnimation(demoActivityEmbeddingController.changeAnimation)
                         .build()
                 )
                 .build()
@@ -384,9 +329,6 @@
                 .setAnimationParams(
                     EmbeddingAnimationParams.Builder()
                         .setAnimationBackground(demoActivityEmbeddingController.animationBackground)
-                        .setOpenAnimation(demoActivityEmbeddingController.openAnimation)
-                        .setCloseAnimation(demoActivityEmbeddingController.closeAnimation)
-                        .setChangeAnimation(demoActivityEmbeddingController.changeAnimation)
                         .build()
                 )
                 .build()
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/layout/WindowInfoJavaApiDemoActivity.java b/window/window-demos/demo/src/main/java/androidx/window/demo/layout/WindowInfoJavaApiDemoActivity.java
deleted file mode 100644
index 9abc1a5..0000000
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/layout/WindowInfoJavaApiDemoActivity.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window.demo.layout;
-
-import android.os.Bundle;
-import android.util.Log;
-import android.widget.TextView;
-
-import androidx.core.content.ContextCompat;
-import androidx.core.util.Consumer;
-import androidx.window.WindowSdkExtensions;
-import androidx.window.demo.common.EdgeToEdgeActivity;
-import androidx.window.demo.databinding.ActivityLayoutWindowInfoJavaApiDemoLayoutBinding;
-import androidx.window.java.layout.WindowInfoTrackerCallbackAdapter;
-import androidx.window.layout.WindowInfoTracker;
-import androidx.window.layout.WindowLayoutInfo;
-
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
-/** Activity to show how to get WindowLayoutInfo with the Java-supported API. */
-public class WindowInfoJavaApiDemoActivity extends EdgeToEdgeActivity {
-    // Logcat tag length must be <= 23 characters.
-    private static final String TAG = "WinInfoJavaApiDemo";
-
-    private @NonNull WindowInfoTrackerCallbackAdapter mWindowInfoTrackerCallbackAdapter;
-    private @NonNull TextView mWindowLayoutInfoGetterValue;
-    private @NonNull TextView mWindowLayoutInfoFlowValue;
-
-    /** The Window Manager extension version available on this device. */
-    private final int mExtensionVersion = WindowSdkExtensions.getInstance().getExtensionVersion();
-
-    /** WindowLayoutInfoListener callback. */
-    private final Consumer<WindowLayoutInfo> mWindowLayoutInfoChangedConsumer =
-            this::onWindowLayoutInfoUpdated;
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        final ActivityLayoutWindowInfoJavaApiDemoLayoutBinding viewBinding =
-                ActivityLayoutWindowInfoJavaApiDemoLayoutBinding.inflate(getLayoutInflater());
-        setContentView(viewBinding.getRoot());
-        mWindowLayoutInfoGetterValue = viewBinding.windowLayoutInfoGetterValue;
-        mWindowLayoutInfoFlowValue = viewBinding.windowLayoutInfoFlowValue;
-
-        final WindowInfoTracker tracker = WindowInfoTracker.getOrCreate(this);
-        if (mExtensionVersion >= 9) {
-            mWindowLayoutInfoGetterValue.setText(
-                    tracker.getCurrentWindowLayoutInfo(this).toString());
-        } else {
-            mWindowLayoutInfoGetterValue.setText(
-                    "WindowLayoutInfo getter is not available on this device. "
-                            + "The WM extension version must be at least 9, "
-                            + "but this device has version " + mExtensionVersion + ".");
-        }
-
-        mWindowInfoTrackerCallbackAdapter = new WindowInfoTrackerCallbackAdapter(tracker);
-        mWindowInfoTrackerCallbackAdapter.addWindowLayoutInfoListener(
-                this, Runnable::run, this::onWindowLayoutInfoUpdated);
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        if (mWindowInfoTrackerCallbackAdapter != null) {
-            mWindowInfoTrackerCallbackAdapter.addWindowLayoutInfoListener(
-                    this, Runnable::run, mWindowLayoutInfoChangedConsumer);
-        }
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        if (mWindowInfoTrackerCallbackAdapter != null) {
-            mWindowInfoTrackerCallbackAdapter.removeWindowLayoutInfoListener(
-                    mWindowLayoutInfoChangedConsumer);
-        }
-    }
-
-    private void onWindowLayoutInfoUpdated(@NonNull WindowLayoutInfo windowLayoutInfo) {
-        Log.d(TAG, "onWindowLayoutInfoUpdated: " + windowLayoutInfo);
-        ContextCompat.getMainExecutor(this).execute(
-                () -> mWindowLayoutInfoFlowValue.setText(windowLayoutInfo.toString()));
-    }
-}
diff --git a/window/window-demos/demo/src/main/res/layout/activity_layout_window_info_java_api_demo_layout.xml b/window/window-demos/demo/src/main/res/layout/activity_layout_window_info_java_api_demo_layout.xml
deleted file mode 100644
index 7638404..0000000
--- a/window/window-demos/demo/src/main/res/layout/activity_layout_window_info_java_api_demo_layout.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  Copyright 2024 The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="5dp"
-        android:text="@string/window_layout_info_getter_title"
-        android:textStyle="bold" />
-
-    <TextView
-        android:id="@+id/window_layout_info_getter_value"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginLeft="10dp"
-        android:text="@string/window_state_placeholder" />
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="5dp"
-        android:text="@string/window_layout_info_flow_title"
-        android:textStyle="bold" />
-
-    <TextView
-        android:id="@+id/window_layout_info_flow_value"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginLeft="10dp"
-        android:text="@string/window_state_placeholder" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/res/layout/activity_split_attributes_toggle_primary_activity.xml b/window/window-demos/demo/src/main/res/layout/activity_split_attributes_toggle_primary_activity.xml
index 6acd57f..c4e0ef7 100644
--- a/window/window-demos/demo/src/main/res/layout/activity_split_attributes_toggle_primary_activity.xml
+++ b/window/window-demos/demo/src/main/res/layout/activity_split_attributes_toggle_primary_activity.xml
@@ -217,81 +217,6 @@
             android:spinnerMode="dropdown"
             android:visibility="gone"/>
 
-        <!-- Dropdown for open animation transition -->
-
-        <View
-            android:id="@+id/open_animation_divider"
-            android:layout_width="match_parent"
-            android:layout_height="1dp"
-            android:layout_marginTop="10dp"
-            android:layout_marginBottom="10dp"
-            android:background="#AAAAAA"
-            android:visibility="gone"/>
-
-        <TextView
-            android:id="@+id/open_animation_text_view"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/current_open_animation"
-            android:visibility="gone"/>
-
-        <Spinner
-            android:id="@+id/open_animation_dropdown"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:spinnerMode="dropdown"
-            android:visibility="gone"/>
-
-        <!-- Dropdown for close animation transition -->
-
-        <View
-            android:id="@+id/close_animation_divider"
-            android:layout_width="match_parent"
-            android:layout_height="1dp"
-            android:layout_marginTop="10dp"
-            android:layout_marginBottom="10dp"
-            android:background="#AAAAAA"
-            android:visibility="gone"/>
-
-        <TextView
-            android:id="@+id/close_animation_text_view"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/current_close_animation"
-            android:visibility="gone"/>
-
-        <Spinner
-            android:id="@+id/close_animation_dropdown"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:spinnerMode="dropdown"
-            android:visibility="gone"/>
-
-        <!-- Dropdown for change animation transition -->
-
-        <View
-            android:id="@+id/change_animation_divider"
-            android:layout_width="match_parent"
-            android:layout_height="1dp"
-            android:layout_marginTop="10dp"
-            android:layout_marginBottom="10dp"
-            android:background="#AAAAAA"
-            android:visibility="gone"/>
-
-        <TextView
-            android:id="@+id/change_animation_text_view"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/current_change_animation"
-            android:visibility="gone"/>
-
-        <Spinner
-            android:id="@+id/change_animation_dropdown"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:spinnerMode="dropdown"
-            android:visibility="gone"/>
-
         <View
             android:id="@+id/finish_secondary_activities_divider"
             android:layout_width="match_parent"
diff --git a/window/window-demos/demo/src/main/res/layout/activity_split_device_state_layout.xml b/window/window-demos/demo/src/main/res/layout/activity_split_device_state_layout.xml
index 4d6e260..4bd1b21 100644
--- a/window/window-demos/demo/src/main/res/layout/activity_split_device_state_layout.xml
+++ b/window/window-demos/demo/src/main/res/layout/activity_split_device_state_layout.xml
@@ -168,81 +168,6 @@
             android:spinnerMode="dropdown"
             android:visibility="gone"/>
 
-        <!-- Dropdown for open animation transition -->
-
-        <View
-            android:id="@+id/open_animation_divider"
-            android:layout_width="match_parent"
-            android:layout_height="1dp"
-            android:layout_marginTop="10dp"
-            android:layout_marginBottom="10dp"
-            android:background="#AAAAAA"
-            android:visibility="gone"/>
-
-        <TextView
-            android:id="@+id/open_animation_text_view"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/current_open_animation"
-            android:visibility="gone"/>
-
-        <Spinner
-            android:id="@+id/open_animation_dropdown"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:spinnerMode="dropdown"
-            android:visibility="gone"/>
-
-        <!-- Dropdown for close animation transition -->
-
-        <View
-            android:id="@+id/close_animation_divider"
-            android:layout_width="match_parent"
-            android:layout_height="1dp"
-            android:layout_marginTop="10dp"
-            android:layout_marginBottom="10dp"
-            android:background="#AAAAAA"
-            android:visibility="gone"/>
-
-        <TextView
-            android:id="@+id/close_animation_text_view"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/current_close_animation"
-            android:visibility="gone"/>
-
-        <Spinner
-            android:id="@+id/close_animation_dropdown"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:spinnerMode="dropdown"
-            android:visibility="gone"/>
-
-        <!-- Dropdown for change animation transition -->
-
-        <View
-            android:id="@+id/change_animation_divider"
-            android:layout_width="match_parent"
-            android:layout_height="1dp"
-            android:layout_marginTop="10dp"
-            android:layout_marginBottom="10dp"
-            android:background="#AAAAAA"
-            android:visibility="gone"/>
-
-        <TextView
-            android:id="@+id/change_animation_text_view"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/current_change_animation"
-            android:visibility="gone"/>
-
-        <Spinner
-            android:id="@+id/change_animation_dropdown"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:spinnerMode="dropdown"
-            android:visibility="gone"/>
-
         <Button
             android:id="@+id/launch_activity_to_side"
             android:layout_width="wrap_content"
diff --git a/window/window-demos/demo/src/main/res/values/strings.xml b/window/window-demos/demo/src/main/res/values/strings.xml
index c29ba3b..357ce1c 100644
--- a/window/window-demos/demo/src/main/res/values/strings.xml
+++ b/window/window-demos/demo/src/main/res/values/strings.xml
@@ -51,9 +51,6 @@
     <string name="rear_display_description">Demo of observing to WindowAreaStatus and enabling/disabling RearDisplay mode</string>
     <string name="current_split_attributes">Current SplitAttributes:</string>>
     <string name="current_animation_background">Current Animation Background:</string>>
-    <string name="current_open_animation">Current Open Animation:</string>>
-    <string name="current_close_animation">Current Close Animation:</string>>
-    <string name="current_change_animation">Current Change Animation:</string>>
     <string name="test_ime">Test IME</string>
     <string name="test_ime_button_clear">Clear Logs</string>
     <string name="test_ime_button_close">Close Test IME</string>
@@ -71,8 +68,7 @@
     <string name="activity_display_listener_title">Activity DisplayListener#onDisplayChanged</string>
     <string name="application_configuration_title">Application#onConfigurationChanged</string>
     <string name="activity_configuration_title">Activity#onConfigurationChanged</string>
-    <string name="window_layout_info_getter_title">WindowInfoTracker#getCurrentWindowLayoutInfo</string>
-    <string name="window_layout_info_flow_title">WindowInfoTracker#windowLayoutInfo</string>
+    <string name="display_feature_title">WindowInfoTracker#windowLayoutInfo</string>
     <string name="timestamp_title">Timestamp:</string>
     <string name="application_display_rotation_title">Application Display Rotation:</string>
     <string name="activity_display_rotation_title">Activity Display Rotation:</string>
diff --git a/window/window-demos/demo/src/main/res/xml/main_split_config.xml b/window/window-demos/demo/src/main/res/xml/main_split_config.xml
index fb4facd..7576a23 100644
--- a/window/window-demos/demo/src/main/res/xml/main_split_config.xml
+++ b/window/window-demos/demo/src/main/res/xml/main_split_config.xml
@@ -30,8 +30,7 @@
             window:embeddingDividerColor="@color/colorAccent"
             window:embeddingDividerWidthDp="1"
             window:dragRangeMinRatio="0.2"
-            window:dragRangeMaxRatio="0.8"
-            window:isDraggingToFullscreenAllowed="true" />
+            window:dragRangeMaxRatio="0.8" />
     </SplitPairRule>
 
     <SplitPlaceholderRule
@@ -45,8 +44,7 @@
             window:embeddingDividerColor="@color/colorAccent"
             window:embeddingDividerWidthDp="0"
             window:dragRangeMinRatio="0.2"
-            window:dragRangeMaxRatio="0.8"
-            window:isDraggingToFullscreenAllowed="true" />
+            window:dragRangeMaxRatio="0.8" />
     </SplitPlaceholderRule>
 
     <!-- Rules for SplitImeActivityMain -->
diff --git a/window/window/api/current.txt b/window/window/api/current.txt
index dc16ea0..09d411c 100644
--- a/window/window/api/current.txt
+++ b/window/window/api/current.txt
@@ -223,9 +223,7 @@
 
   public static final class DividerAttributes.DraggableDividerAttributes extends androidx.window.embedding.DividerAttributes {
     method public androidx.window.embedding.DividerAttributes.DragRange getDragRange();
-    method public boolean isDraggingToFullscreenAllowed();
     property public androidx.window.embedding.DividerAttributes.DragRange dragRange;
-    property public boolean isDraggingToFullscreenAllowed;
   }
 
   @androidx.window.RequiresWindowSdkExtension(version=6) public static final class DividerAttributes.DraggableDividerAttributes.Builder {
@@ -234,7 +232,6 @@
     method @androidx.window.RequiresWindowSdkExtension(version=6) public androidx.window.embedding.DividerAttributes.DraggableDividerAttributes build();
     method @androidx.window.RequiresWindowSdkExtension(version=6) public androidx.window.embedding.DividerAttributes.DraggableDividerAttributes.Builder setColor(@ColorInt int color);
     method @androidx.window.RequiresWindowSdkExtension(version=6) public androidx.window.embedding.DividerAttributes.DraggableDividerAttributes.Builder setDragRange(androidx.window.embedding.DividerAttributes.DragRange dragRange);
-    method @androidx.window.RequiresWindowSdkExtension(version=7) public androidx.window.embedding.DividerAttributes.DraggableDividerAttributes.Builder setDraggingToFullscreenAllowed(boolean allowed);
     method @androidx.window.RequiresWindowSdkExtension(version=6) public androidx.window.embedding.DividerAttributes.DraggableDividerAttributes.Builder setWidthDp(@IntRange(from=androidx.window.embedding.DividerAttributes.WIDTH_SYSTEM_DEFAULT.toLong()) int widthDp);
   }
 
@@ -276,33 +273,13 @@
 
   public final class EmbeddingAnimationParams {
     method public androidx.window.embedding.EmbeddingAnimationBackground getAnimationBackground();
-    method public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec getChangeAnimation();
-    method public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec getCloseAnimation();
-    method public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec getOpenAnimation();
     property public androidx.window.embedding.EmbeddingAnimationBackground animationBackground;
-    property public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec changeAnimation;
-    property public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec closeAnimation;
-    property public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec openAnimation;
-  }
-
-  public static final class EmbeddingAnimationParams.AnimationSpec {
-    field public static final androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec.Companion Companion;
-    field public static final androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec DEFAULT;
-    field public static final androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec JUMP_CUT;
-  }
-
-  public static final class EmbeddingAnimationParams.AnimationSpec.Companion {
-    property public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec DEFAULT;
-    property public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec JUMP_CUT;
   }
 
   public static final class EmbeddingAnimationParams.Builder {
     ctor public EmbeddingAnimationParams.Builder();
     method public androidx.window.embedding.EmbeddingAnimationParams build();
     method @androidx.window.RequiresWindowSdkExtension(version=5) public androidx.window.embedding.EmbeddingAnimationParams.Builder setAnimationBackground(androidx.window.embedding.EmbeddingAnimationBackground background);
-    method @androidx.window.RequiresWindowSdkExtension(version=7) public androidx.window.embedding.EmbeddingAnimationParams.Builder setChangeAnimation(androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec spec);
-    method @androidx.window.RequiresWindowSdkExtension(version=7) public androidx.window.embedding.EmbeddingAnimationParams.Builder setCloseAnimation(androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec spec);
-    method @androidx.window.RequiresWindowSdkExtension(version=7) public androidx.window.embedding.EmbeddingAnimationParams.Builder setOpenAnimation(androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec spec);
   }
 
   public final class EmbeddingAspectRatio {
@@ -320,15 +297,12 @@
 
   public final class EmbeddingConfiguration {
     method public androidx.window.embedding.EmbeddingConfiguration.DimAreaBehavior getDimAreaBehavior();
-    method public boolean isAutoSaveEmbeddingState();
     property public androidx.window.embedding.EmbeddingConfiguration.DimAreaBehavior dimAreaBehavior;
-    property public boolean isAutoSaveEmbeddingState;
   }
 
   public static final class EmbeddingConfiguration.Builder {
     ctor public EmbeddingConfiguration.Builder();
     method public androidx.window.embedding.EmbeddingConfiguration build();
-    method @androidx.window.RequiresWindowSdkExtension(version=8) public androidx.window.embedding.EmbeddingConfiguration.Builder setAutoSaveEmbeddingState(boolean saveState);
     method @androidx.window.RequiresWindowSdkExtension(version=5) public androidx.window.embedding.EmbeddingConfiguration.Builder setDimAreaBehavior(androidx.window.embedding.EmbeddingConfiguration.DimAreaBehavior area);
   }
 
@@ -661,7 +635,6 @@
   }
 
   public interface WindowInfoTracker {
-    method @androidx.window.RequiresWindowSdkExtension(version=9) public default androidx.window.layout.WindowLayoutInfo getCurrentWindowLayoutInfo(@UiContext android.content.Context context);
     method public static androidx.window.layout.WindowInfoTracker getOrCreate(android.content.Context context);
     method @androidx.window.RequiresWindowSdkExtension(version=6) public default java.util.List<androidx.window.layout.SupportedPosture> getSupportedPostures();
     method public kotlinx.coroutines.flow.Flow<androidx.window.layout.WindowLayoutInfo> windowLayoutInfo(android.app.Activity activity);
diff --git a/window/window/api/res-current.txt b/window/window/api/res-current.txt
index 8d9de80..7dced15 100644
--- a/window/window/api/res-current.txt
+++ b/window/window/api/res-current.txt
@@ -11,7 +11,6 @@
 attr finishPrimaryWithPlaceholder
 attr finishPrimaryWithSecondary
 attr finishSecondaryWithPrimary
-attr isDraggingToFullscreenAllowed
 attr placeholderActivityName
 attr primaryActivityName
 attr secondaryActivityAction
diff --git a/window/window/api/restricted_current.txt b/window/window/api/restricted_current.txt
index c0b1fbe..c936de5 100644
--- a/window/window/api/restricted_current.txt
+++ b/window/window/api/restricted_current.txt
@@ -224,9 +224,7 @@
 
   public static final class DividerAttributes.DraggableDividerAttributes extends androidx.window.embedding.DividerAttributes {
     method public androidx.window.embedding.DividerAttributes.DragRange getDragRange();
-    method public boolean isDraggingToFullscreenAllowed();
     property public androidx.window.embedding.DividerAttributes.DragRange dragRange;
-    property public boolean isDraggingToFullscreenAllowed;
   }
 
   @androidx.window.RequiresWindowSdkExtension(version=6) public static final class DividerAttributes.DraggableDividerAttributes.Builder {
@@ -235,7 +233,6 @@
     method @androidx.window.RequiresWindowSdkExtension(version=6) public androidx.window.embedding.DividerAttributes.DraggableDividerAttributes build();
     method @androidx.window.RequiresWindowSdkExtension(version=6) public androidx.window.embedding.DividerAttributes.DraggableDividerAttributes.Builder setColor(@ColorInt int color);
     method @androidx.window.RequiresWindowSdkExtension(version=6) public androidx.window.embedding.DividerAttributes.DraggableDividerAttributes.Builder setDragRange(androidx.window.embedding.DividerAttributes.DragRange dragRange);
-    method @androidx.window.RequiresWindowSdkExtension(version=7) public androidx.window.embedding.DividerAttributes.DraggableDividerAttributes.Builder setDraggingToFullscreenAllowed(boolean allowed);
     method @androidx.window.RequiresWindowSdkExtension(version=6) public androidx.window.embedding.DividerAttributes.DraggableDividerAttributes.Builder setWidthDp(@IntRange(from=androidx.window.embedding.DividerAttributes.WIDTH_SYSTEM_DEFAULT.toLong()) int widthDp);
   }
 
@@ -277,33 +274,13 @@
 
   public final class EmbeddingAnimationParams {
     method public androidx.window.embedding.EmbeddingAnimationBackground getAnimationBackground();
-    method public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec getChangeAnimation();
-    method public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec getCloseAnimation();
-    method public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec getOpenAnimation();
     property public androidx.window.embedding.EmbeddingAnimationBackground animationBackground;
-    property public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec changeAnimation;
-    property public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec closeAnimation;
-    property public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec openAnimation;
-  }
-
-  public static final class EmbeddingAnimationParams.AnimationSpec {
-    field public static final androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec.Companion Companion;
-    field public static final androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec DEFAULT;
-    field public static final androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec JUMP_CUT;
-  }
-
-  public static final class EmbeddingAnimationParams.AnimationSpec.Companion {
-    property public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec DEFAULT;
-    property public androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec JUMP_CUT;
   }
 
   public static final class EmbeddingAnimationParams.Builder {
     ctor public EmbeddingAnimationParams.Builder();
     method public androidx.window.embedding.EmbeddingAnimationParams build();
     method @androidx.window.RequiresWindowSdkExtension(version=5) public androidx.window.embedding.EmbeddingAnimationParams.Builder setAnimationBackground(androidx.window.embedding.EmbeddingAnimationBackground background);
-    method @androidx.window.RequiresWindowSdkExtension(version=7) public androidx.window.embedding.EmbeddingAnimationParams.Builder setChangeAnimation(androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec spec);
-    method @androidx.window.RequiresWindowSdkExtension(version=7) public androidx.window.embedding.EmbeddingAnimationParams.Builder setCloseAnimation(androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec spec);
-    method @androidx.window.RequiresWindowSdkExtension(version=7) public androidx.window.embedding.EmbeddingAnimationParams.Builder setOpenAnimation(androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec spec);
   }
 
   public final class EmbeddingAspectRatio {
@@ -375,15 +352,12 @@
 
   public final class EmbeddingConfiguration {
     method public androidx.window.embedding.EmbeddingConfiguration.DimAreaBehavior getDimAreaBehavior();
-    method public boolean isAutoSaveEmbeddingState();
     property public androidx.window.embedding.EmbeddingConfiguration.DimAreaBehavior dimAreaBehavior;
-    property public boolean isAutoSaveEmbeddingState;
   }
 
   public static final class EmbeddingConfiguration.Builder {
     ctor public EmbeddingConfiguration.Builder();
     method public androidx.window.embedding.EmbeddingConfiguration build();
-    method @androidx.window.RequiresWindowSdkExtension(version=8) public androidx.window.embedding.EmbeddingConfiguration.Builder setAutoSaveEmbeddingState(boolean saveState);
     method @androidx.window.RequiresWindowSdkExtension(version=5) public androidx.window.embedding.EmbeddingConfiguration.Builder setDimAreaBehavior(androidx.window.embedding.EmbeddingConfiguration.DimAreaBehavior area);
   }
 
@@ -788,7 +762,6 @@
   }
 
   public interface WindowInfoTracker {
-    method @androidx.window.RequiresWindowSdkExtension(version=9) public default androidx.window.layout.WindowLayoutInfo getCurrentWindowLayoutInfo(@UiContext android.content.Context context);
     method public static androidx.window.layout.WindowInfoTracker getOrCreate(android.content.Context context);
     method @androidx.window.RequiresWindowSdkExtension(version=6) public default java.util.List<androidx.window.layout.SupportedPosture> getSupportedPostures();
     method public kotlinx.coroutines.flow.Flow<androidx.window.layout.WindowLayoutInfo> windowLayoutInfo(android.app.Activity activity);
diff --git a/window/window/build.gradle b/window/window/build.gradle
index 82894b51..206291a 100644
--- a/window/window/build.gradle
+++ b/window/window/build.gradle
@@ -58,7 +58,7 @@
     implementation(project(":window:window-core"))
 
     def extensions_core_version = "androidx.window.extensions.core:core:1.0.0"
-    def extensions_version = project(":window:extensions:extensions")
+    def extensions_version = "androidx.window.extensions:extensions:1.4.0"
     // A compile only dependency on extensions.core so that other libraries do not expose it
     // transitively.
     compileOnly(extensions_core_version)
diff --git a/window/window/dependencyAnalysis-baseline.json b/window/window/dependencyAnalysis-baseline.json
index 49554b3..fed829e 100644
--- a/window/window/dependencyAnalysis-baseline.json
+++ b/window/window/dependencyAnalysis-baseline.json
@@ -54,6 +54,22 @@
     {
       "coordinates": {
         "type": "module",
+        "identifier": "androidx.window.extensions:extensions",
+        "resolvedVersion": "1.4.0"
+      },
+      "fromConfiguration": "androidTestImplementation"
+    },
+    {
+      "coordinates": {
+        "type": "module",
+        "identifier": "androidx.window.extensions:extensions",
+        "resolvedVersion": "1.4.0"
+      },
+      "fromConfiguration": "testImplementation"
+    },
+    {
+      "coordinates": {
+        "type": "module",
         "identifier": "com.google.guava:guava",
         "resolvedVersion": "33.3.1-jre"
       },
@@ -104,20 +120,6 @@
     {
       "coordinates": {
         "type": "project",
-        "identifier": ":window:extensions:extensions"
-      },
-      "fromConfiguration": "androidTestImplementation"
-    },
-    {
-      "coordinates": {
-        "type": "project",
-        "identifier": ":window:extensions:extensions"
-      },
-      "fromConfiguration": "testImplementation"
-    },
-    {
-      "coordinates": {
-        "type": "project",
         "identifier": ":window:sidecar:sidecar"
       },
       "fromConfiguration": "androidTestImplementation"
diff --git a/window/window/samples/src/main/java/androidx.window.samples.embedding/SplitAttributesCalculatorSamples.kt b/window/window/samples/src/main/java/androidx.window.samples.embedding/SplitAttributesCalculatorSamples.kt
index 7126476..eb7c311 100644
--- a/window/window/samples/src/main/java/androidx.window.samples.embedding/SplitAttributesCalculatorSamples.kt
+++ b/window/window/samples/src/main/java/androidx.window.samples.embedding/SplitAttributesCalculatorSamples.kt
@@ -60,14 +60,13 @@
                         SplitAttributes.LayoutDirection.LOCALE
                     }
                 )
-                // Optionally set the animation background and change transition animation to use
-                // when switching between vertical and horizontal
+                // Optionally set the animation background to use when switching between
+                // vertical and horizontal
                 .setAnimationParams(
                     EmbeddingAnimationParams.Builder()
                         .setAnimationBackground(
                             EmbeddingAnimationBackground.createColorBackground(Color.GRAY)
                         )
-                        .setChangeAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
                         .build()
                 )
                 .build()
@@ -79,14 +78,13 @@
             SplitAttributes.Builder()
                 .setSplitType(SPLIT_TYPE_EQUAL)
                 .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
-                // Optionally set the animation background and change transition animation to use
-                // when switching between vertical and horizontal
+                // Optionally set the animation background to use when switching between
+                // vertical and horizontal
                 .setAnimationParams(
                     EmbeddingAnimationParams.Builder()
                         .setAnimationBackground(
                             EmbeddingAnimationBackground.createColorBackground(Color.GRAY)
                         )
-                        .setChangeAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
                         .build()
                 )
                 .build()
@@ -107,28 +105,26 @@
         return@setSplitAttributesCalculator if (parentConfiguration.screenWidthDp >= 600) {
             builder
                 .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
-                // Optionally set the animation background and change transition animation to use
-                // when switching between vertical and horizontal
+                // Optionally set the animation background to use when switching between
+                // vertical and horizontal
                 .setAnimationParams(
                     EmbeddingAnimationParams.Builder()
                         .setAnimationBackground(
                             EmbeddingAnimationBackground.createColorBackground(Color.GRAY)
                         )
-                        .setChangeAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
                         .build()
                 )
                 .build()
         } else if (parentConfiguration.screenHeightDp >= 600) {
             builder
                 .setLayoutDirection(SplitAttributes.LayoutDirection.TOP_TO_BOTTOM)
-                // Optionally set the animation background and change transition animation to use
-                // when switching between vertical and horizontal
+                // Optionally set the animation background to use when switching between
+                // vertical and horizontal
                 .setAnimationParams(
                     EmbeddingAnimationParams.Builder()
                         .setAnimationBackground(
                             EmbeddingAnimationBackground.createColorBackground(Color.GRAY)
                         )
-                        .setChangeAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
                         .build()
                 )
                 .build()
diff --git a/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt b/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt
index b360898..afe4ef6 100644
--- a/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt
@@ -17,16 +17,9 @@
 package androidx.window.embedding
 
 import android.app.Activity
-import android.content.res.Configuration
-import android.content.res.Resources
 import android.graphics.Color
-import android.graphics.Rect
 import android.os.Binder
-import android.os.Build
 import android.os.IBinder
-import android.view.WindowInsets
-import android.view.WindowMetrics
-import androidx.annotation.RequiresApi
 import androidx.window.WindowSdkExtensions
 import androidx.window.WindowTestUtils
 import androidx.window.core.PredicateAdapter
@@ -38,15 +31,12 @@
 import androidx.window.extensions.embedding.ActivityStack as OEMActivityStack
 import androidx.window.extensions.embedding.ActivityStack.Token as OEMActivityStackToken
 import androidx.window.extensions.embedding.AnimationBackground as OEMEmbeddingAnimationBackground
-import androidx.window.extensions.embedding.AnimationParams as OEMEmbeddingAnimationParams
 import androidx.window.extensions.embedding.DividerAttributes as OEMDividerAttributes
 import androidx.window.extensions.embedding.SplitAttributes as OEMSplitAttributes
 import androidx.window.extensions.embedding.SplitAttributes.LayoutDirection.TOP_TO_BOTTOM
 import androidx.window.extensions.embedding.SplitAttributes.SplitType.RatioSplitType
-import androidx.window.extensions.embedding.SplitAttributesCalculatorParams as OEMSplitAttributesCalculatorParams
 import androidx.window.extensions.embedding.SplitInfo as OEMSplitInfo
 import androidx.window.extensions.embedding.SplitInfo.Token as OEMSplitInfoToken
-import androidx.window.extensions.layout.WindowLayoutInfo
 import org.junit.Assert.assertEquals
 import org.junit.Assume.assumeTrue
 import org.junit.Before
@@ -340,75 +330,19 @@
     }
 
     @Test
-    fun testTranslateAnimationBackgroundWithApiLevel7() {
-        WindowTestUtils.assumeAtLeastWindowExtensionVersion(7)
+    fun testTranslateAnimationBackgroundWithApiLevel5() {
+        WindowTestUtils.assumeAtLeastWindowExtensionVersion(5)
 
         val colorBackground = EmbeddingAnimationBackground.createColorBackground(Color.BLUE)
-        val animationParamsWithColorBackground =
-            EmbeddingAnimationParams.Builder().setAnimationBackground(colorBackground).build()
         val splitAttributesWithColorBackground =
-            SplitAttributes.Builder().setAnimationParams(animationParamsWithColorBackground).build()
-        val defaultAnimationParams = EmbeddingAnimationParams.Builder().build()
-        val splitAttributesWithDefaultBackground =
-            SplitAttributes.Builder().setAnimationParams(defaultAnimationParams).build()
-
-        val extensionsColorBackground =
-            OEMEmbeddingAnimationBackground.createColorBackground(Color.BLUE)
-        val extensionAnimationParamsWithColorBackground =
-            OEMEmbeddingAnimationParams.Builder()
-                .setAnimationBackground(extensionsColorBackground)
-                .build()
-        val extensionsSplitAttributesWithColorBackground =
-            OEMSplitAttributes.Builder()
-                .setAnimationParams(extensionAnimationParamsWithColorBackground)
-                .build()
-
-        val extensionAnimationParamsWithDefaultBackground =
-            OEMEmbeddingAnimationParams.Builder()
-                .setAnimationBackground(
-                    OEMEmbeddingAnimationBackground.ANIMATION_BACKGROUND_DEFAULT
+            SplitAttributes.Builder()
+                .setAnimationParams(
+                    EmbeddingAnimationParams.Builder()
+                        .setAnimationBackground(colorBackground)
+                        .build()
                 )
                 .build()
-        val extensionsSplitAttributesWithDefaultBackground =
-            OEMSplitAttributes.Builder()
-                .setAnimationParams(extensionAnimationParamsWithDefaultBackground)
-                .build()
-
-        // Translate from Window to Extensions
-        assertEquals(
-            extensionsSplitAttributesWithColorBackground,
-            adapter.translateSplitAttributes(splitAttributesWithColorBackground)
-        )
-        assertEquals(
-            extensionsSplitAttributesWithDefaultBackground,
-            adapter.translateSplitAttributes(splitAttributesWithDefaultBackground)
-        )
-
-        // Translate from Extensions to Window
-        assertEquals(
-            splitAttributesWithColorBackground,
-            adapter.translate(extensionsSplitAttributesWithColorBackground)
-        )
-        assertEquals(
-            splitAttributesWithDefaultBackground,
-            adapter.translate(extensionsSplitAttributesWithDefaultBackground)
-        )
-    }
-
-    @Test
-    @Suppress("DEPRECATION")
-    fun testTranslateAnimationBackgroundWithApiLevel5And6() {
-        WindowTestUtils.assumeAtLeastWindowExtensionVersion(5)
-        WindowTestUtils.assumeBeforeWindowExtensionVersion(7)
-
-        val colorBackground = EmbeddingAnimationBackground.createColorBackground(Color.BLUE)
-        val animationParamsWithColorBackground =
-            EmbeddingAnimationParams.Builder().setAnimationBackground(colorBackground).build()
-        val splitAttributesWithColorBackground =
-            SplitAttributes.Builder().setAnimationParams(animationParamsWithColorBackground).build()
-        val defaultAnimationParams = EmbeddingAnimationParams.Builder().build()
-        val splitAttributesWithDefaultBackground =
-            SplitAttributes.Builder().setAnimationParams(defaultAnimationParams).build()
+        val splitAttributesWithDefaultBackground = SplitAttributes.Builder().build()
 
         val extensionsColorBackground =
             OEMEmbeddingAnimationBackground.createColorBackground(Color.BLUE)
@@ -443,19 +377,20 @@
     }
 
     @Test
-    @Suppress("DEPRECATION")
     fun testTranslateAnimationBackgroundBeforeApiLevel5() {
         WindowTestUtils.assumeAtLeastWindowExtensionVersion(2)
         WindowTestUtils.assumeBeforeWindowExtensionVersion(5)
 
         val colorBackground = EmbeddingAnimationBackground.createColorBackground(Color.BLUE)
-        val animationParamsWithColorBackground =
-            EmbeddingAnimationParams.Builder().setAnimationBackground(colorBackground).build()
         val splitAttributesWithColorBackground =
-            SplitAttributes.Builder().setAnimationParams(animationParamsWithColorBackground).build()
-        val defaultAnimationParams = EmbeddingAnimationParams.Builder().build()
-        val splitAttributesWithDefaultBackground =
-            SplitAttributes.Builder().setAnimationParams(defaultAnimationParams).build()
+            SplitAttributes.Builder()
+                .setAnimationParams(
+                    EmbeddingAnimationParams.Builder()
+                        .setAnimationBackground(colorBackground)
+                        .build()
+                )
+                .build()
+        val splitAttributesWithDefaultBackground = SplitAttributes.Builder().build()
 
         // No difference after translate before API level 5
         assertEquals(
@@ -464,81 +399,6 @@
         )
     }
 
-    @Test
-    fun testTranslateAnimationSpecWithApiLevel7() {
-        WindowTestUtils.assumeAtLeastWindowExtensionVersion(7)
-
-        val animationParamsWithJumpCut =
-            EmbeddingAnimationParams.Builder()
-                .setOpenAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
-                .setCloseAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
-                .setChangeAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
-                .build()
-        val splitAttributesWithJumpCutAnimationParams =
-            SplitAttributes.Builder().setAnimationParams(animationParamsWithJumpCut).build()
-        val defaultAnimationParams = EmbeddingAnimationParams.Builder().build()
-        val splitAttributesWithDefaultAnimationParams =
-            SplitAttributes.Builder().setAnimationParams(defaultAnimationParams).build()
-
-        val extensionsAnimationParamsWithJumpCut =
-            OEMEmbeddingAnimationParams.Builder()
-                .setOpenAnimationResId(Resources.ID_NULL)
-                .setCloseAnimationResId(Resources.ID_NULL)
-                .setChangeAnimationResId(Resources.ID_NULL)
-                .build()
-        val extensionsSplitAttributesWithJumpCutAnimationParams =
-            OEMSplitAttributes.Builder()
-                .setAnimationParams(extensionsAnimationParamsWithJumpCut)
-                .build()
-        val oemDefaultAnimationParams = OEMEmbeddingAnimationParams.Builder().build()
-        val extensionsSplitAttributesWithDefaultAnimationParams =
-            OEMSplitAttributes.Builder().setAnimationParams(oemDefaultAnimationParams).build()
-
-        // Translate from Window to Extensions
-        assertEquals(
-            extensionsSplitAttributesWithJumpCutAnimationParams,
-            adapter.translateSplitAttributes(splitAttributesWithJumpCutAnimationParams)
-        )
-        assertEquals(
-            extensionsSplitAttributesWithDefaultAnimationParams,
-            adapter.translateSplitAttributes(splitAttributesWithDefaultAnimationParams)
-        )
-
-        // Translate from Extensions to Window
-        assertEquals(
-            splitAttributesWithJumpCutAnimationParams,
-            adapter.translate(extensionsSplitAttributesWithJumpCutAnimationParams)
-        )
-        assertEquals(
-            splitAttributesWithDefaultAnimationParams,
-            adapter.translate(extensionsSplitAttributesWithDefaultAnimationParams)
-        )
-    }
-
-    @Test
-    fun testTranslateAnimationSpecBeforeApiLevel7() {
-        WindowTestUtils.assumeAtLeastWindowExtensionVersion(2)
-        WindowTestUtils.assumeBeforeWindowExtensionVersion(7)
-
-        val animationParamsWithJumpCut =
-            EmbeddingAnimationParams.Builder()
-                .setOpenAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
-                .setCloseAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
-                .setChangeAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
-                .build()
-        val splitAttributesWithJumpCutAnimationParams =
-            SplitAttributes.Builder().setAnimationParams(animationParamsWithJumpCut).build()
-        val defaultAnimationParams = EmbeddingAnimationParams.Builder().build()
-        val splitAttributesWithDefaultAnimationParams =
-            SplitAttributes.Builder().setAnimationParams(defaultAnimationParams).build()
-
-        // No difference after translate before API level 7
-        assertEquals(
-            adapter.translateSplitAttributes(splitAttributesWithJumpCutAnimationParams),
-            adapter.translateSplitAttributes(splitAttributesWithDefaultAnimationParams)
-        )
-    }
-
     @OptIn(androidx.window.core.ExperimentalWindowApi::class)
     @Test
     fun testTranslateEmbeddingConfigurationToWindowAttributes() {
@@ -569,65 +429,8 @@
                 .setDividerColor(Color.GRAY)
                 .build()
 
-        assertEquals(
-            oemDividerAttributes,
-            adapter.translateToOemDividerAttributes(dividerAttributes)
-        )
-        assertEquals(
-            dividerAttributes,
-            adapter.translateToJetpackDividerAttributes(oemDividerAttributes)
-        )
-    }
-
-    @Test
-    fun testTranslateDividerAttributes_dragToFullscreen() {
-        WindowTestUtils.assumeAtLeastWindowExtensionVersion(7)
-        val dividerAttributes =
-            DraggableDividerAttributes.Builder()
-                .setWidthDp(20)
-                .setDragRange(SplitRatioDragRange(0.3f, 0.7f))
-                .setColor(Color.GRAY)
-                .setDraggingToFullscreenAllowed(true)
-                .build()
-        val oemDividerAttributes =
-            OEMDividerAttributes.Builder(OEMDividerAttributes.DIVIDER_TYPE_DRAGGABLE)
-                .setWidthDp(20)
-                .setPrimaryMinRatio(0.3f)
-                .setPrimaryMaxRatio(0.7f)
-                .setDividerColor(Color.GRAY)
-                .setDraggingToFullscreenAllowed(true)
-                .build()
-
-        val dividerAttributes2 =
-            DraggableDividerAttributes.Builder()
-                .setWidthDp(20)
-                .setDragRange(SplitRatioDragRange(0.3f, 0.7f))
-                .setColor(Color.GRAY)
-                .build()
-        val oemDividerAttributes2 =
-            OEMDividerAttributes.Builder(OEMDividerAttributes.DIVIDER_TYPE_DRAGGABLE)
-                .setWidthDp(20)
-                .setPrimaryMinRatio(0.3f)
-                .setPrimaryMaxRatio(0.7f)
-                .setDividerColor(Color.GRAY)
-                .build()
-
-        assertEquals(
-            oemDividerAttributes,
-            adapter.translateToOemDividerAttributes(dividerAttributes)
-        )
-        assertEquals(
-            dividerAttributes,
-            adapter.translateToJetpackDividerAttributes(oemDividerAttributes)
-        )
-        assertEquals(
-            oemDividerAttributes2,
-            adapter.translateToOemDividerAttributes(dividerAttributes2)
-        )
-        assertEquals(
-            dividerAttributes2,
-            adapter.translateToJetpackDividerAttributes(oemDividerAttributes2)
-        )
+        assertEquals(oemDividerAttributes, adapter.translateDividerAttributes(dividerAttributes))
+        assertEquals(dividerAttributes, adapter.translateDividerAttributes(oemDividerAttributes))
     }
 
     @Test
@@ -641,14 +444,8 @@
                 .setDividerColor(Color.GRAY)
                 .build()
 
-        assertEquals(
-            oemDividerAttributes,
-            adapter.translateToOemDividerAttributes(dividerAttributes)
-        )
-        assertEquals(
-            dividerAttributes,
-            adapter.translateToJetpackDividerAttributes(oemDividerAttributes)
-        )
+        assertEquals(oemDividerAttributes, adapter.translateDividerAttributes(dividerAttributes))
+        assertEquals(dividerAttributes, adapter.translateDividerAttributes(oemDividerAttributes))
     }
 
     @Test
@@ -664,14 +461,8 @@
                 .setDividerColor(Color.GRAY)
                 .build()
 
-        assertEquals(
-            oemDividerAttributes,
-            adapter.translateToOemDividerAttributes(dividerAttributes),
-        )
-        assertEquals(
-            dividerAttributes,
-            adapter.translateToJetpackDividerAttributes(oemDividerAttributes),
-        )
+        assertEquals(oemDividerAttributes, adapter.translateDividerAttributes(dividerAttributes))
+        assertEquals(dividerAttributes, adapter.translateDividerAttributes(oemDividerAttributes))
     }
 
     @Test
@@ -688,10 +479,7 @@
                 .setDividerColor(Color.GRAY)
                 .build()
 
-        assertEquals(
-            oemDividerAttributes,
-            adapter.translateToOemDividerAttributes(dividerAttributes),
-        )
+        assertEquals(oemDividerAttributes, adapter.translateDividerAttributes(dividerAttributes))
     }
 
     @Test
@@ -700,33 +488,8 @@
         val dividerAttributes = DividerAttributes.NO_DIVIDER
         val oemDividerAttributes = null
 
-        assertEquals(
-            oemDividerAttributes,
-            adapter.translateToOemDividerAttributes(dividerAttributes)
-        )
-        assertEquals(
-            dividerAttributes,
-            adapter.translateToJetpackDividerAttributes(oemDividerAttributes)
-        )
-    }
-
-    @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
-    @Test
-    fun testAutoGeneratedTag_removedFromSplitAttributesCalculatorParams() {
-        assumeTrue(Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
-
-        val oemCalculatorParams =
-            mock<OEMSplitAttributesCalculatorParams>().apply {
-                whenever(parentWindowMetrics)
-                    .thenReturn(WindowMetrics(Rect(), WindowInsets.Builder().build(), 320F))
-                whenever(parentConfiguration).thenReturn(Configuration())
-                whenever(parentWindowLayoutInfo).thenReturn(mock<WindowLayoutInfo>())
-                whenever(defaultSplitAttributes).thenReturn(OEMSplitAttributes.Builder().build())
-                whenever(areDefaultConstraintsSatisfied()).thenReturn(true)
-                whenever(splitRuleTag).thenReturn(EmbeddingAdapter.RULE_TAG_PREFIX + "0001")
-            }
-
-        assertEquals(null, adapter.translate(oemCalculatorParams).splitRuleTag)
+        assertEquals(oemDividerAttributes, adapter.translateDividerAttributes(dividerAttributes))
+        assertEquals(dividerAttributes, adapter.translateDividerAttributes(oemDividerAttributes))
     }
 
     private fun createTestOEMSplitInfo(
diff --git a/window/window/src/androidTest/java/androidx/window/embedding/RuleParserTests.kt b/window/window/src/androidTest/java/androidx/window/embedding/RuleParserTests.kt
index 67970ff..bf5b019 100644
--- a/window/window/src/androidTest/java/androidx/window/embedding/RuleParserTests.kt
+++ b/window/window/src/androidTest/java/androidx/window/embedding/RuleParserTests.kt
@@ -143,9 +143,6 @@
                         .setAnimationBackground(
                             EmbeddingAnimationBackground.createColorBackground(Color.BLUE)
                         )
-                        .setOpenAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
-                        .setCloseAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
-                        .setChangeAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
                         .build()
                 )
                 .build()
@@ -189,7 +186,6 @@
             DividerAttributes.DraggableDividerAttributes.Builder()
                 .setWidthDp(1)
                 .setColor(expectedDividerColor.toInt())
-                .setDraggingToFullscreenAllowed(true)
                 .setDragRange(DividerAttributes.DragRange.SplitRatioDragRange(0.2f, 0.8f))
                 .build()
 
@@ -324,9 +320,6 @@
                                 application.resources.getColor(R.color.testColor, null)
                             )
                         )
-                        .setOpenAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
-                        .setCloseAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
-                        .setChangeAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
                         .build()
                 )
                 .build()
diff --git a/window/window/src/androidTest/java/androidx/window/embedding/SafeActivityEmbeddingComponentProviderTest.kt b/window/window/src/androidTest/java/androidx/window/embedding/SafeActivityEmbeddingComponentProviderTest.kt
index cea283c..42e58df 100644
--- a/window/window/src/androidTest/java/androidx/window/embedding/SafeActivityEmbeddingComponentProviderTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/embedding/SafeActivityEmbeddingComponentProviderTest.kt
@@ -69,8 +69,6 @@
                     in 3..4 -> assertTrue(safeProvider.hasValidVendorApiLevel3())
                     5 -> assertTrue(safeProvider.hasValidVendorApiLevel5())
                     6 -> assertTrue(safeProvider.hasValidVendorApiLevel6())
-                    7 -> assertTrue(safeProvider.hasValidVendorApiLevel7())
-                    8 -> assertTrue(safeProvider.hasValidVendorApiLevel8())
                 }
             }
         } catch (e: UnsupportedOperationException) {
diff --git a/window/window/src/androidTest/java/androidx/window/layout/WindowInfoTrackerImplTest.kt b/window/window/src/androidTest/java/androidx/window/layout/WindowInfoTrackerImplTest.kt
index 1b6ee44..30c985d 100644
--- a/window/window/src/androidTest/java/androidx/window/layout/WindowInfoTrackerImplTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/layout/WindowInfoTrackerImplTest.kt
@@ -29,9 +29,6 @@
 import androidx.window.WindowTestUtils
 import androidx.window.WindowTestUtils.Companion.assumeAtLeastWindowExtensionVersion
 import androidx.window.WindowTestUtils.Companion.assumeBeforeWindowExtensionVersion
-import androidx.window.core.Bounds
-import androidx.window.layout.FoldingFeature.State.Companion.FLAT
-import androidx.window.layout.HardwareFoldingFeature.Type.Companion.HINGE
 import androidx.window.layout.adapter.WindowBackend
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.TruthJUnit.assume
@@ -182,61 +179,8 @@
         }
     }
 
-    @Test
-    fun testGetCurrentWindowLayoutInfo_throwsBeforeApi9() {
-        assumeBeforeWindowExtensionVersion(9)
-        activityScenario.scenario.onActivity { testActivity ->
-            assertFailsWith<UnsupportedOperationException> {
-                tracker.getCurrentWindowLayoutInfo(testActivity)
-            }
-        }
-    }
-
-    @Test
-    fun testGetCurrentWindowLayoutInfo_nonUiContext_throwsError() {
-        assumeAtLeastWindowExtensionVersion(9)
-        val context: Context = ApplicationProvider.getApplicationContext()
-        val tracker = WindowInfoTracker.getOrCreate(context)
-
-        assertFailsWith<IllegalArgumentException> { tracker.getCurrentWindowLayoutInfo(context) }
-    }
-
-    @Test
-    fun testGetCurrentWindowLayoutInfo_activityAsContext() {
-        assumeAtLeastWindowExtensionVersion(9)
-        activityScenario.scenario.onActivity { testActivity ->
-            val displayFeature: DisplayFeature =
-                HardwareFoldingFeature(Bounds(0, 0, 100, 200), HINGE, FLAT)
-            val currentWindowLayoutInfo = WindowLayoutInfo(listOf(displayFeature))
-            val fakeBackend = FakeWindowBackend(currentWindowLayoutInfo = currentWindowLayoutInfo)
-            val tracker =
-                WindowInfoTrackerImpl(windowMetricsCalculator, fakeBackend, windowSdkExtensions)
-
-            assertThat(tracker.getCurrentWindowLayoutInfo(testActivity))
-                .isEqualTo(currentWindowLayoutInfo)
-        }
-    }
-
-    @Test
-    @RequiresApi(Build.VERSION_CODES.R)
-    fun testGetCurrentWindowLayoutInfo_overlayWindowAsContext() {
-        assume().that(Build.VERSION.SDK_INT).isAtLeast(Build.VERSION_CODES.R)
-        assumeAtLeastWindowExtensionVersion(9)
-        val displayFeature: DisplayFeature =
-            HardwareFoldingFeature(Bounds(0, 0, 100, 200), HINGE, FLAT)
-        val currentWindowLayoutInfo = WindowLayoutInfo(listOf(displayFeature))
-        val fakeBackend = FakeWindowBackend(currentWindowLayoutInfo = currentWindowLayoutInfo)
-        val tracker =
-            WindowInfoTrackerImpl(windowMetricsCalculator, fakeBackend, windowSdkExtensions)
-        val windowContext = WindowTestUtils.createOverlayWindowContext()
-
-        assertThat(tracker.getCurrentWindowLayoutInfo(windowContext))
-            .isEqualTo(currentWindowLayoutInfo)
-    }
-
     private class FakeWindowBackend(
-        override val supportedPostures: List<SupportedPosture> = emptyList(),
-        val currentWindowLayoutInfo: WindowLayoutInfo = WindowLayoutInfo(emptyList()),
+        override val supportedPostures: List<SupportedPosture> = emptyList()
     ) : WindowBackend {
         val consumers = mutableMapOf<Consumer<WindowLayoutInfo>, Executor>()
 
@@ -255,7 +199,5 @@
         override fun unregisterLayoutChangeCallback(callback: Consumer<WindowLayoutInfo>) {
             consumers.remove(callback)
         }
-
-        override fun getCurrentWindowLayoutInfo(context: Context) = currentWindowLayoutInfo
     }
 }
diff --git a/window/window/src/androidTest/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendTest.kt b/window/window/src/androidTest/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendTest.kt
index 63885e9..e4f0e55 100644
--- a/window/window/src/androidTest/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendTest.kt
@@ -679,51 +679,6 @@
         assertEquals(listOf(SupportedPosture.TABLETOP), actual)
     }
 
-    @Test
-    fun testGetCurrentWindowLayoutInfo_throwsBeforeApi9() {
-        assumeBeforeWindowExtensionVersion(9)
-        val component = FakeWindowComponent()
-        val backend = ExtensionWindowBackend.newInstance(component, consumerAdapter)
-
-        activityScenario.scenario.onActivity { activity ->
-            assertThrows(UnsupportedOperationException::class.java) {
-                backend.getCurrentWindowLayoutInfo(activity)
-            }
-        }
-    }
-
-    @Test
-    fun testGetCurrentWindowLayoutInfo_activityContext_returnsWindowLayoutInfo() {
-        assumeAtLeastWindowExtensionVersion(9)
-        activityScenario.scenario.onActivity { activity ->
-            val windowLayoutInfoFromActivity = newTestOEMWindowLayoutInfo(activity)
-            val expected = translate(activity, windowLayoutInfoFromActivity)
-            val component =
-                FakeWindowComponent(currentWindowLayoutInfo = windowLayoutInfoFromActivity)
-            val backend = ExtensionWindowBackend.newInstance(component, consumerAdapter)
-
-            val actual = backend.getCurrentWindowLayoutInfo(activity)
-
-            assertEquals(expected, actual)
-        }
-    }
-
-    @Test
-    @RequiresApi(Build.VERSION_CODES.R)
-    fun testGetCurrentWindowLayoutInfo_overlayWindowContext_returnsWindowLayoutInfo() {
-        assumeTrue(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
-        assumeAtLeastWindowExtensionVersion(9)
-        val windowContext = WindowTestUtils.createOverlayWindowContext()
-        val windowLayoutInfoFromContext = newTestOEMWindowLayoutInfo(windowContext)
-        val expected = translate(windowContext, windowLayoutInfoFromContext)
-        val component = FakeWindowComponent(currentWindowLayoutInfo = windowLayoutInfoFromContext)
-        val backend = ExtensionWindowBackend.newInstance(component, consumerAdapter)
-
-        val actual = backend.getCurrentWindowLayoutInfo(windowContext)
-
-        assertEquals(expected, actual)
-    }
-
     internal companion object {
         private fun newTestOEMWindowLayoutInfo(activity: Activity): OEMWindowLayoutInfo {
             val bounds =
@@ -776,10 +731,8 @@
         }
     }
 
-    private class FakeWindowComponent(
-        private val windowFeatures: SupportedWindowFeatures? = null,
-        private val currentWindowLayoutInfo: OEMWindowLayoutInfo = OEMWindowLayoutInfo(emptyList()),
-    ) : WindowLayoutComponent {
+    private class FakeWindowComponent(private val windowFeatures: SupportedWindowFeatures? = null) :
+        WindowLayoutComponent {
 
         val consumers = mutableListOf<JavaConsumer<OEMWindowLayoutInfo>>()
         val oemConsumers = mutableListOf<OEMConsumer<OEMWindowLayoutInfo>>()
@@ -814,10 +767,6 @@
                 )
         }
 
-        override fun getCurrentWindowLayoutInfo(context: Context): OEMWindowLayoutInfo {
-            return currentWindowLayoutInfo
-        }
-
         @SuppressLint("NewApi")
         fun emit(info: OEMWindowLayoutInfo) {
             if (ExtensionsUtil.safeVendorApiLevel < 2) {
diff --git a/window/window/src/androidTest/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackendTest.kt b/window/window/src/androidTest/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackendTest.kt
index 886098a..8daf9752 100644
--- a/window/window/src/androidTest/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackendTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackendTest.kt
@@ -205,13 +205,6 @@
         backend.supportedPostures
     }
 
-    @Test(expected = UnsupportedOperationException::class)
-    fun testGetCurrentWindowLayoutInfo_throws() {
-        val interfaceCompat = SwitchOnUnregisterExtensionInterfaceCompat()
-        val backend = SidecarWindowBackend(interfaceCompat)
-        backend.getCurrentWindowLayoutInfo(context)
-    }
-
     internal companion object {
         private fun newTestWindowLayoutInfo(): WindowLayoutInfo {
             val feature1: DisplayFeature = HardwareFoldingFeature(Bounds(0, 2, 3, 4), HINGE, FLAT)
diff --git a/window/window/src/androidTest/res/xml/test_split_config_custom_split_pair_rule_with_divider.xml b/window/window/src/androidTest/res/xml/test_split_config_custom_split_pair_rule_with_divider.xml
index 34af511..cf01e39 100644
--- a/window/window/src/androidTest/res/xml/test_split_config_custom_split_pair_rule_with_divider.xml
+++ b/window/window/src/androidTest/res/xml/test_split_config_custom_split_pair_rule_with_divider.xml
@@ -49,7 +49,6 @@
             window:embeddingDividerColor="#112233"
             window:embeddingDividerWidthDp="1"
             window:dragRangeMinRatio="0.2"
-            window:dragRangeMaxRatio="0.8"
-            window:isDraggingToFullscreenAllowed="true" />
+            window:dragRangeMaxRatio="0.8" />
     </SplitPairRule>
 </resources>
\ No newline at end of file
diff --git a/window/window/src/androidTest/res/xml/test_split_config_custom_split_pair_rule_with_divider_error.xml b/window/window/src/androidTest/res/xml/test_split_config_custom_split_pair_rule_with_divider_error.xml
index f2ef599..468cd2a 100644
--- a/window/window/src/androidTest/res/xml/test_split_config_custom_split_pair_rule_with_divider_error.xml
+++ b/window/window/src/androidTest/res/xml/test_split_config_custom_split_pair_rule_with_divider_error.xml
@@ -24,7 +24,6 @@
         <DividerAttributes
             window:embeddingDividerType="fixed"
             window:dragRangeMinRatio="0.2"
-            window:dragRangeMaxRatio="0.8"
-            window:isDraggingToFullscreenAllowed="true" />
+            window:dragRangeMaxRatio="0.8" />
     </SplitPairRule>
 </resources>
\ No newline at end of file
diff --git a/window/window/src/androidTest/res/xml/test_split_config_split_pair_rule_horizontal_layout.xml b/window/window/src/androidTest/res/xml/test_split_config_split_pair_rule_horizontal_layout.xml
index 8778c51..5e75a12 100644
--- a/window/window/src/androidTest/res/xml/test_split_config_split_pair_rule_horizontal_layout.xml
+++ b/window/window/src/androidTest/res/xml/test_split_config_split_pair_rule_horizontal_layout.xml
@@ -23,10 +23,7 @@
         window:splitMinHeightDp="600"
         window:splitMinSmallestWidthDp="0"
         window:splitLayoutDirection="topToBottom"
-        window:animationBackgroundColor="#0000FF"
-        window:splitOpenAnimation="jumpCut"
-        window:splitCloseAnimation="jumpCut"
-        window:splitChangeAnimation="jumpCut">
+        window:animationBackgroundColor="#0000FF">
         <SplitPairFilter
             window:primaryActivityName="A"
             window:secondaryActivityName="B"/>
diff --git a/window/window/src/androidTest/res/xml/test_split_config_split_placeholder_horizontal_layout.xml b/window/window/src/androidTest/res/xml/test_split_config_split_placeholder_horizontal_layout.xml
index ac79a56..df0871f 100644
--- a/window/window/src/androidTest/res/xml/test_split_config_split_placeholder_horizontal_layout.xml
+++ b/window/window/src/androidTest/res/xml/test_split_config_split_placeholder_horizontal_layout.xml
@@ -24,10 +24,7 @@
         window:splitMinHeightDp="600"
         window:splitMinSmallestWidthDp="0"
         window:splitLayoutDirection="bottomToTop"
-        window:animationBackgroundColor="@color/testColor"
-        window:splitOpenAnimation="jumpCut"
-        window:splitCloseAnimation="jumpCut"
-        window:splitChangeAnimation="jumpCut">
+        window:animationBackgroundColor="@color/testColor">
         <ActivityFilter
             window:activityName="androidx.window.sample.embedding.SplitActivityList"/>
     </SplitPlaceholderRule>
diff --git a/window/window/src/main/java/androidx/window/embedding/DividerAttributes.kt b/window/window/src/main/java/androidx/window/embedding/DividerAttributes.kt
index e4ea800..78e46e52 100644
--- a/window/window/src/main/java/androidx/window/embedding/DividerAttributes.kt
+++ b/window/window/src/main/java/androidx/window/embedding/DividerAttributes.kt
@@ -133,10 +133,6 @@
      * @property dragRange the range that a divider is allowed to be dragged. When the user drags
      *   the divider beyond this range, the system will choose to either fully expand the container
      *   or move the divider back into the range.
-     * @property isDraggingToFullscreenAllowed if `true`, the user is allowed to drag beyond the
-     *   specified range temporarily, and when dragging is finished, the system will choose to
-     *   either fully expand the larger container or move the divider back to the range limit.
-     *   Default to `false`.
      * @see SplitAttributes.Builder.setDividerAttributes
      */
     class DraggableDividerAttributes
@@ -145,29 +141,22 @@
         @IntRange(from = WIDTH_SYSTEM_DEFAULT.toLong()) widthDp: Int = WIDTH_SYSTEM_DEFAULT,
         @ColorInt color: Int = COLOR_SYSTEM_DEFAULT,
         val dragRange: DragRange = DragRange.DRAG_RANGE_SYSTEM_DEFAULT,
-        val isDraggingToFullscreenAllowed: Boolean = false,
     ) : DividerAttributes(widthDp, color) {
 
         override fun equals(other: Any?): Boolean {
             if (this === other) return true
             if (other !is DraggableDividerAttributes) return false
-            return widthDp == other.widthDp &&
-                color == other.color &&
-                dragRange == other.dragRange &&
-                isDraggingToFullscreenAllowed == other.isDraggingToFullscreenAllowed
+            return widthDp == other.widthDp && color == other.color && dragRange == other.dragRange
         }
 
-        override fun hashCode(): Int =
-            (((widthDp * 31 + color) * 31 + dragRange.hashCode()) * 31 +
-                isDraggingToFullscreenAllowed.hashCode())
+        override fun hashCode(): Int = (widthDp * 31 + color) * 31 + dragRange.hashCode()
 
         override fun toString(): String =
-            DraggableDividerAttributes::class.java.simpleName +
+            DividerAttributes::class.java.simpleName +
                 "{" +
                 "width=$widthDp, " +
                 "color=$color, " +
-                "primaryContainerDragRange=$dragRange, " +
-                "isDraggingToFullscreenAllowed=$isDraggingToFullscreenAllowed" +
+                "primaryContainerDragRange=$dragRange" +
                 "}"
 
         /**
@@ -184,8 +173,6 @@
 
             private var dragRange: DragRange = DragRange.DRAG_RANGE_SYSTEM_DEFAULT
 
-            private var isDraggingToFullscreenAllowed: Boolean = false
-
             /**
              * The [DraggableDividerAttributes] builder constructor initialized by an existing
              * [DraggableDividerAttributes].
@@ -197,7 +184,6 @@
                 widthDp = original.widthDp
                 dragRange = original.dragRange
                 color = original.color
-                isDraggingToFullscreenAllowed = original.isDraggingToFullscreenAllowed
             }
 
             /**
@@ -243,34 +229,6 @@
             @RequiresWindowSdkExtension(6)
             fun setDragRange(dragRange: DragRange): Builder = apply { this.dragRange = dragRange }
 
-            /**
-             * Sets whether dragging to full screen is allowed.
-             *
-             * If `true`, the user is allowed to drag beyond the specified range temporarily. When
-             * dragging is finished, if the dragging position is below the
-             * [DragRange.SplitRatioDragRange.minRatio] or the default min ratio in
-             * [DragRange.DRAG_RANGE_SYSTEM_DEFAULT], the system will choose to either fully expand
-             * the secondary container or move the divider back to the range limit; if the dragging
-             * position is above the [DragRange.SplitRatioDragRange.maxRatio] or the default max
-             * ratio in [DragRange.DRAG_RANGE_SYSTEM_DEFAULT], the system will choose to either
-             * fully expand the primary container or move the divider back to the range limit.
-             *
-             * When the primary container is fully expanded, the secondary container is dismissed.
-             * When the secondary container is fully expanded, the primary container is hidden
-             * behind the secondary container, and the drag handle is displayed on the edge to allow
-             * the user to drag and bring back the primary container.
-             *
-             * Default to `false`.
-             *
-             * This is only supported on devices with Window SDK extensions version 7 and above. For
-             * devices with Window SDK extensions below version 7, dragging to fullscreen is always
-             * disabled.
-             */
-            @RequiresWindowSdkExtension(7)
-            fun setDraggingToFullscreenAllowed(allowed: Boolean): Builder = apply {
-                this.isDraggingToFullscreenAllowed = allowed
-            }
-
             /** Builds a [DividerAttributes] instance. */
             @RequiresWindowSdkExtension(6)
             fun build(): DraggableDividerAttributes =
@@ -278,7 +236,6 @@
                     widthDp = widthDp,
                     color = color,
                     dragRange = dragRange,
-                    isDraggingToFullscreenAllowed = isDraggingToFullscreenAllowed,
                 )
         }
     }
@@ -370,9 +327,6 @@
         val NO_DIVIDER =
             object : DividerAttributes() {
                 override fun toString(): String = "NO_DIVIDER"
-
-                // Override #hashCode to return consistent value every time.
-                @Suppress("EqualsAndHashCode") override fun hashCode(): Int = toString().hashCode()
             }
 
         /** Specifies a fixed divider. Used by the XML rule parser and must match attrs.xml. */
@@ -394,17 +348,13 @@
             color: Int,
             dragRangeMinRatio: Float,
             dragRangeMaxRatio: Float,
-            isDraggingToFullscreenAllowed: Boolean,
         ): DividerAttributes {
             return when (type) {
                 TYPE_VALUE_FIXED ->
                     FixedDividerAttributes.Builder().setWidthDp(widthDp).setColor(color).build()
                 TYPE_VALUE_DRAGGABLE -> {
                     val builder =
-                        DraggableDividerAttributes.Builder()
-                            .setWidthDp(widthDp)
-                            .setColor(color)
-                            .setDraggingToFullscreenAllowed(isDraggingToFullscreenAllowed)
+                        DraggableDividerAttributes.Builder().setWidthDp(widthDp).setColor(color)
                     if (
                         dragRangeMinRatio == DRAG_RANGE_VALUE_UNSPECIFIED ||
                             dragRangeMaxRatio == DRAG_RANGE_VALUE_UNSPECIFIED
@@ -427,7 +377,6 @@
             type: Int,
             hasDragRangeMinRatio: Boolean,
             hasDragRangeMaxRatio: Boolean,
-            hasIsDraggingToFullscreenAllowed: Boolean,
         ) {
             if (type == TYPE_VALUE_DRAGGABLE) {
                 return
@@ -442,11 +391,6 @@
                     "Fixed divider does not allow attribute dragRangeMaxRatio!"
                 )
             }
-            if (hasIsDraggingToFullscreenAllowed) {
-                throw IllegalArgumentException(
-                    "Fixed divider does not allow attribute isDraggingToFullscreenAllowed!"
-                )
-            }
         }
 
         private fun validateWidth(widthDp: Int) = run {
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
index 33eb587..c700fdc 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
@@ -20,7 +20,6 @@
 import android.app.Activity
 import android.content.Context
 import android.content.Intent
-import android.content.res.Resources
 import android.os.Binder
 import android.util.LayoutDirection
 import android.util.Log
@@ -51,7 +50,6 @@
 import androidx.window.extensions.embedding.ActivityRule.Builder as ActivityRuleBuilder
 import androidx.window.extensions.embedding.ActivityStack as OEMActivityStack
 import androidx.window.extensions.embedding.AnimationBackground as OEMEmbeddingAnimationBackground
-import androidx.window.extensions.embedding.AnimationParams as OEMEmbeddingAnimationParams
 import androidx.window.extensions.embedding.DividerAttributes as OEMDividerAttributes
 import androidx.window.extensions.embedding.DividerAttributes.RATIO_SYSTEM_DEFAULT
 import androidx.window.extensions.embedding.EmbeddingRule as OEMEmbeddingRule
@@ -121,7 +119,6 @@
     internal fun translate(activityStacks: List<OEMActivityStack>): List<ActivityStack> =
         activityStacks.map(this::translate)
 
-    @Suppress("DEPRECATION") // To compat with device with extension versions 5 and 6.
     internal fun translate(splitAttributes: OEMSplitAttributes): SplitAttributes {
         val builder =
             SplitAttributes.Builder()
@@ -146,44 +143,25 @@
                             )
                     }
                 )
-        if (extensionVersion in 5..6) {
-            val animationParams =
-                EmbeddingAnimationParams.Builder()
-                    .setAnimationBackground(
-                        translateToJetpackAnimationBackground(splitAttributes.animationBackground)
-                    )
-                    .build()
-            builder.setAnimationParams(animationParams)
-        }
-        if (extensionVersion >= 7) {
-            val animationParams =
-                EmbeddingAnimationParams.Builder()
-                    .setAnimationBackground(
-                        translateToJetpackAnimationBackground(
-                            splitAttributes.animationParams.animationBackground
+        if (extensionVersion >= 5) {
+            val animationBackground = splitAttributes.animationBackground
+            builder.setAnimationParams(
+                if (animationBackground is OEMEmbeddingAnimationBackground.ColorBackground) {
+                    EmbeddingAnimationParams.Builder()
+                        .setAnimationBackground(
+                            EmbeddingAnimationBackground.createColorBackground(
+                                animationBackground.color
+                            )
                         )
-                    )
-                    .setOpenAnimation(
-                        translateToJetpackAnimationSpec(
-                            splitAttributes.animationParams.openAnimationResId
-                        )
-                    )
-                    .setCloseAnimation(
-                        translateToJetpackAnimationSpec(
-                            splitAttributes.animationParams.closeAnimationResId
-                        )
-                    )
-                    .setChangeAnimation(
-                        translateToJetpackAnimationSpec(
-                            splitAttributes.animationParams.changeAnimationResId
-                        )
-                    )
-                    .build()
-            builder.setAnimationParams(animationParams)
+                        .build()
+                } else {
+                    EmbeddingAnimationParams.Builder().build()
+                }
+            )
         }
         if (extensionVersion >= 6) {
             builder.setDividerAttributes(
-                translateToJetpackDividerAttributes(splitAttributes.dividerAttributes)
+                translateDividerAttributes(splitAttributes.dividerAttributes)
             )
         }
         return builder.build()
@@ -232,9 +210,7 @@
         val windowLayoutInfo = params.parentWindowLayoutInfo
         val defaultSplitAttributes = params.defaultSplitAttributes
         val areDefaultConstraintsSatisfied = params.areDefaultConstraintsSatisfied()
-        val splitRuleTag =
-            if (params.splitRuleTag == null || isTagGenerated(params.splitRuleTag!!)) null
-            else params.splitRuleTag
+        val splitRuleTag = params.splitRuleTag
         val density =
             DensityCompatHelper.getInstance().density(taskConfiguration, taskWindowMetrics)
         val windowMetrics =
@@ -294,7 +270,9 @@
                     )
                     .setShouldClearTop(rule.clearTop)
 
-            builder.setTag(tag ?: generateTag(rule))
+            if (tag != null) {
+                builder.setTag(tag)
+            }
             return builder.build()
         }
     }
@@ -313,12 +291,13 @@
             )
         builder.setSticky(splitPinRule.isSticky)
         val tag = splitPinRule.tag
-        builder.setTag(tag ?: generateTag(splitPinRule))
+        if (tag != null) {
+            builder.setTag(tag)
+        }
         return builder.build()
     }
 
     @OptIn(ExperimentalWindowApi::class)
-    @Suppress("DEPRECATION") // To compat with device with extension versions 5 and 6.
     fun translateSplitAttributes(splitAttributes: SplitAttributes): OEMSplitAttributes {
         require(extensionVersion >= 2)
         // To workaround the "unused" error in ktlint. It is necessary to translate SplitAttributes
@@ -340,40 +319,17 @@
                     }
                 )
         if (extensionVersion >= 5) {
-            builder.setWindowAttributes(translateWindowAttributes())
-        }
-        if (extensionVersion in 5..6) {
-            builder.setAnimationBackground(
-                translateToOemAnimationBackground(
-                    splitAttributes.animationParams.animationBackground
+            builder
+                .setWindowAttributes(translateWindowAttributes())
+                .setAnimationBackground(
+                    translateAnimationBackground(
+                        splitAttributes.animationParams.animationBackground
+                    )
                 )
-            )
-        }
-        if (extensionVersion >= 7) {
-            val animationParams =
-                OEMEmbeddingAnimationParams.Builder()
-                    .setAnimationBackground(
-                        translateToOemAnimationBackground(
-                            splitAttributes.animationParams.animationBackground
-                        )
-                    )
-                    .setOpenAnimationResId(
-                        translateToOemAnimationResId(splitAttributes.animationParams.openAnimation)
-                    )
-                    .setCloseAnimationResId(
-                        translateToOemAnimationResId(splitAttributes.animationParams.closeAnimation)
-                    )
-                    .setChangeAnimationResId(
-                        translateToOemAnimationResId(
-                            splitAttributes.animationParams.changeAnimation
-                        )
-                    )
-                    .build()
-            builder.setAnimationParams(animationParams)
         }
         if (extensionVersion >= 6) {
             builder.setDividerAttributes(
-                translateToOemDividerAttributes(splitAttributes.dividerAttributes)
+                translateDividerAttributes(splitAttributes.dividerAttributes)
             )
         }
         return builder.build()
@@ -445,7 +401,9 @@
                     .setFinishPrimaryWithPlaceholder(
                         translateFinishBehavior(rule.finishPrimaryWithPlaceholder)
                     )
-            builder.setTag(tag ?: generateTag(rule))
+            if (tag != null) {
+                builder.setTag(tag)
+            }
             return builder.build()
         }
     }
@@ -477,7 +435,9 @@
                 ActivityRuleBuilder(activityPredicate, intentPredicate)
                     .setShouldAlwaysExpand(rule.alwaysExpand)
             val tag = rule.tag
-            builder.setTag(tag ?: generateTag(rule))
+            if (tag != null) {
+                builder.setTag(tag)
+            }
             return builder.build()
         }
     }
@@ -497,8 +457,7 @@
             .toSet()
     }
 
-    @RequiresWindowSdkExtension(5)
-    private fun translateToOemAnimationBackground(
+    private fun translateAnimationBackground(
         animationBackground: EmbeddingAnimationBackground
     ): OEMEmbeddingAnimationBackground {
         WindowSdkExtensions.getInstance().requireExtensionVersion(5)
@@ -509,46 +468,8 @@
         }
     }
 
-    @RequiresWindowSdkExtension(5)
-    private fun translateToJetpackAnimationBackground(
-        animationBackground: OEMEmbeddingAnimationBackground
-    ): EmbeddingAnimationBackground {
-        WindowSdkExtensions.getInstance().requireExtensionVersion(5)
-        return if (animationBackground is OEMEmbeddingAnimationBackground.ColorBackground) {
-            EmbeddingAnimationBackground.createColorBackground(animationBackground.color)
-        } else {
-            EmbeddingAnimationBackground.DEFAULT
-        }
-    }
-
-    @RequiresWindowSdkExtension(7)
-    private fun translateToOemAnimationResId(
-        animationSpec: EmbeddingAnimationParams.AnimationSpec
-    ): Int {
-        WindowSdkExtensions.getInstance().requireExtensionVersion(7)
-        return if (animationSpec == EmbeddingAnimationParams.AnimationSpec.JUMP_CUT) {
-            Resources.ID_NULL
-        } else {
-            OEMEmbeddingAnimationParams.DEFAULT_ANIMATION_RESOURCES_ID
-        }
-    }
-
-    @RequiresWindowSdkExtension(7)
-    private fun translateToJetpackAnimationSpec(
-        animationResId: Int
-    ): EmbeddingAnimationParams.AnimationSpec {
-        WindowSdkExtensions.getInstance().requireExtensionVersion(7)
-        return if (animationResId == Resources.ID_NULL) {
-            EmbeddingAnimationParams.AnimationSpec.JUMP_CUT
-        } else {
-            EmbeddingAnimationParams.AnimationSpec.DEFAULT
-        }
-    }
-
     @RequiresWindowSdkExtension(6)
-    fun translateToOemDividerAttributes(
-        dividerAttributes: DividerAttributes
-    ): OEMDividerAttributes? {
+    fun translateDividerAttributes(dividerAttributes: DividerAttributes): OEMDividerAttributes? {
         WindowSdkExtensions.getInstance().requireExtensionVersion(6)
         if (dividerAttributes === DividerAttributes.NO_DIVIDER) {
             return null
@@ -566,17 +487,14 @@
                 )
                 .setDividerColor(dividerAttributes.color)
                 .setWidthDp(dividerAttributes.widthDp)
-        if (dividerAttributes is DraggableDividerAttributes) {
-            if (dividerAttributes.dragRange is SplitRatioDragRange) {
-                builder
-                    .setPrimaryMinRatio(dividerAttributes.dragRange.minRatio)
-                    .setPrimaryMaxRatio(dividerAttributes.dragRange.maxRatio)
-            }
-            if (extensionVersion >= 7) {
-                builder.setDraggingToFullscreenAllowed(
-                    dividerAttributes.isDraggingToFullscreenAllowed
-                )
-            }
+
+        if (
+            dividerAttributes is DraggableDividerAttributes &&
+                dividerAttributes.dragRange is SplitRatioDragRange
+        ) {
+            builder
+                .setPrimaryMinRatio(dividerAttributes.dragRange.minRatio)
+                .setPrimaryMaxRatio(dividerAttributes.dragRange.maxRatio)
         }
         if (extensionVersion == 7 && dividerAttributes.widthDp == 0) {
             // A known compatibility issue causes incorrect rendering of 0-width divider in
@@ -587,9 +505,7 @@
     }
 
     @RequiresWindowSdkExtension(6)
-    fun translateToJetpackDividerAttributes(
-        oemDividerAttributes: OEMDividerAttributes?
-    ): DividerAttributes {
+    fun translateDividerAttributes(oemDividerAttributes: OEMDividerAttributes?): DividerAttributes {
         WindowSdkExtensions.getInstance().requireExtensionVersion(6)
         if (oemDividerAttributes == null) {
             return DividerAttributes.NO_DIVIDER
@@ -616,9 +532,6 @@
                                 oemDividerAttributes.primaryMaxRatio,
                             )
                     )
-                    .setDraggingToFullscreenAllowed(
-                        extensionVersion >= 7 && oemDividerAttributes.isDraggingToFullscreenAllowed
-                    )
                     .build()
             // Default to DividerType.FIXED
             else -> {
@@ -836,20 +749,10 @@
     internal companion object {
         private val TAG = EmbeddingAdapter::class.simpleName
 
-        val RULE_TAG_PREFIX = "ae-gen:"
-
         /**
          * The default token of [SplitInfo], which provides compatibility for device prior to vendor
          * API level 3
          */
         val INVALID_SPLIT_INFO_TOKEN = Binder()
-
-        fun generateTag(rule: EmbeddingRule): String =
-            RULE_TAG_PREFIX + Integer.toHexString(rule.hashCode())
-
-        fun isTagGenerated(tag: String): Boolean {
-            val subTag = tag.removePrefix(RULE_TAG_PREFIX)
-            return subTag != tag && subTag.toIntOrNull(16) != null
-        }
     }
 }
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingAnimationBackground.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingAnimationBackground.kt
index f3ab751..64a354f 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingAnimationBackground.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingAnimationBackground.kt
@@ -59,9 +59,6 @@
     private class DefaultBackground : EmbeddingAnimationBackground() {
 
         override fun toString() = "DefaultBackground"
-
-        // Override #hashCode to return consistent value every time.
-        @Suppress("EqualsAndHashCode") override fun hashCode() = toString().hashCode()
     }
 
     /** Methods that create various [EmbeddingAnimationBackground]. */
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingAnimationParams.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingAnimationParams.kt
index 48e6dd3..1495f52 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingAnimationParams.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingAnimationParams.kt
@@ -16,9 +16,7 @@
 
 package androidx.window.embedding
 
-import androidx.annotation.IntRange
 import androidx.window.RequiresWindowSdkExtension
-import androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec.Companion.DEFAULT
 
 /**
  * Parameters to be used for window transition animations for embedding activities.
@@ -26,12 +24,6 @@
  * @property animationBackground the animation background to use during the animation of the split
  *   involving this `EmbeddingAnimationParams` object if the animation requires a background. The
  *   default is to use the current theme window background color.
- * @property openAnimation the animation spec to use for open transitions (when starting/entering an
- *   activity or when an activity moves to front).
- * @property closeAnimation the animation spec to use for close transitions (when finishing/exiting
- *   an activity or when an activity moves to back).
- * @property changeAnimation the animation spec to use for change transitions (when an activity
- *   resizes or moves).
  * @see Builder
  * @see SplitAttributes.animationParams
  * @see EmbeddingAnimationBackground
@@ -41,59 +33,7 @@
 class EmbeddingAnimationParams
 private constructor(
     val animationBackground: EmbeddingAnimationBackground = EmbeddingAnimationBackground.DEFAULT,
-    val openAnimation: AnimationSpec = DEFAULT,
-    val closeAnimation: AnimationSpec = DEFAULT,
-    val changeAnimation: AnimationSpec = DEFAULT,
 ) {
-
-    /** The animation to use when an activity transitions (e.g. open, close, or change). */
-    class AnimationSpec
-    private constructor(
-        /**
-         * The unique integer value for the `splitAnimationSpec`. This can be used as an enum value
-         * when defining `splitAnimationSpec` attributes in XML.
-         */
-        internal val value: Int,
-    ) {
-
-        /**
-         * A string representation of this `AnimationSpec`.
-         *
-         * @return the string representation of the object.
-         */
-        override fun toString(): String =
-            when (value) {
-                0 -> "DEFAULT"
-                1 -> "JUMP_CUT"
-                else -> "Unknown value: $value"
-            }
-
-        override fun equals(other: Any?): Boolean {
-            if (other === this) return true
-            if (other !is AnimationSpec) return false
-            return value == other.value
-        }
-
-        override fun hashCode(): Int = value * 31
-
-        /** Properties and methods. */
-        companion object {
-            /** Specifies the default animation defined by the system. */
-            @JvmField val DEFAULT = AnimationSpec(0)
-            /** Specifies an animation with zero duration. */
-            @JvmField val JUMP_CUT = AnimationSpec(1)
-
-            /** Returns `AnimationSpec` with the given integer `value`. */
-            @JvmStatic
-            internal fun getAnimationSpecFromValue(@IntRange(from = 0, to = 1) value: Int) =
-                when (value) {
-                    DEFAULT.value -> DEFAULT
-                    JUMP_CUT.value -> JUMP_CUT
-                    else -> throw IllegalArgumentException("Undefined value:$value")
-                }
-        }
-    }
-
     /**
      * Returns a hash code for this `EmbeddingAnimationParams` object.
      *
@@ -101,9 +41,6 @@
      */
     override fun hashCode(): Int {
         var result = animationBackground.hashCode()
-        result = result * 31 + openAnimation.hashCode()
-        result = result * 31 + closeAnimation.hashCode()
-        result = result * 31 + changeAnimation.hashCode()
         return result
     }
 
@@ -116,10 +53,7 @@
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is EmbeddingAnimationParams) return false
-        return animationBackground == other.animationBackground &&
-            openAnimation == other.openAnimation &&
-            closeAnimation == other.closeAnimation &&
-            changeAnimation == other.changeAnimation
+        return animationBackground == other.animationBackground
     }
 
     /**
@@ -129,15 +63,11 @@
      */
     override fun toString(): String =
         "${EmbeddingAnimationParams::class.java.simpleName}:" +
-            "{animationBackground=$animationBackground, openAnimation=$openAnimation, " +
-            "closeAnimation=$closeAnimation, changeAnimation=$changeAnimation }"
+            "{animationBackground=$animationBackground }"
 
     /** Builder for creating an instance of [EmbeddingAnimationParams]. */
     class Builder {
         private var animationBackground = EmbeddingAnimationBackground.DEFAULT
-        private var openAnimation = DEFAULT
-        private var closeAnimation = DEFAULT
-        private var changeAnimation = DEFAULT
 
         /**
          * Sets the animation background.
@@ -157,59 +87,11 @@
         }
 
         /**
-         * Sets the open animation.
-         *
-         * The default is to use the system animation.
-         *
-         * This can be supported only if the Window Extensions version of the target device is
-         * equals or higher than required API level. Otherwise, it would be no-op.
-         *
-         * @param spec the animation transition spec
-         * @return this `Builder`.
-         */
-        @RequiresWindowSdkExtension(7)
-        fun setOpenAnimation(spec: AnimationSpec): Builder = apply { this.openAnimation = spec }
-
-        /**
-         * Sets the close animation.
-         *
-         * The default is to use the system animation.
-         *
-         * This can be supported only if the Window Extensions version of the target device is
-         * equals or higher than required API level. Otherwise, it would be no-op.
-         *
-         * @param spec the animation transition spec
-         * @return this `Builder`.
-         */
-        @RequiresWindowSdkExtension(7)
-        fun setCloseAnimation(spec: AnimationSpec): Builder = apply { this.closeAnimation = spec }
-
-        /**
-         * Sets the change (resize or move) animation.
-         *
-         * The default is to use the system animation.
-         *
-         * This can be supported only if the Window Extensions version of the target device is
-         * equals or higher than required API level. Otherwise, it would be no-op.
-         *
-         * @param spec the animation spec
-         * @return this `Builder`.
-         */
-        @RequiresWindowSdkExtension(7)
-        fun setChangeAnimation(spec: AnimationSpec): Builder = apply { this.changeAnimation = spec }
-
-        /**
          * Builds an `EmbeddingAnimationParams` instance with the attributes specified by the
          * builder's setters.
          *
          * @return the new `EmbeddingAnimationParams` instance.
          */
-        fun build(): EmbeddingAnimationParams =
-            EmbeddingAnimationParams(
-                animationBackground,
-                openAnimation,
-                closeAnimation,
-                changeAnimation
-            )
+        fun build(): EmbeddingAnimationParams = EmbeddingAnimationParams(animationBackground)
     }
 }
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt
index 2abbe2e..eaabe8b 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt
@@ -178,16 +178,6 @@
         adapter.embeddingConfiguration = embeddingConfig
         setDefaultSplitAttributeCalculatorIfNeeded()
 
-        if (windowSdkExtensions.extensionVersion >= 8) {
-            // TODO(b/289875940): remove the try-catch block once handled by the reflection guard
-            try {
-                embeddingExtension.setAutoSaveEmbeddingState(
-                    embeddingConfig.isAutoSaveEmbeddingState
-                )
-            } catch (e: Throwable) {
-                Log.w(TAG, "#setAutoSaveEmbeddingState failed", e)
-            }
-        }
         embeddingExtension.invalidateTopVisibleSplitAttributes()
     }
 
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingConfiguration.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingConfiguration.kt
index dc22255..0b9402a 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingConfiguration.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingConfiguration.kt
@@ -23,15 +23,11 @@
  * Configurations of Activity Embedding environment that defines how the embedded Activities behave.
  *
  * @property dimAreaBehavior The requested dim area behavior.
- * @property isAutoSaveEmbeddingState Is auto-save embedding state enabled.
  * @see Builder
  * @see ActivityEmbeddingController.setEmbeddingConfiguration
  */
 class EmbeddingConfiguration
-private constructor(
-    val dimAreaBehavior: DimAreaBehavior = DimAreaBehavior.UNDEFINED,
-    val isAutoSaveEmbeddingState: Boolean = false
-) {
+private constructor(val dimAreaBehavior: DimAreaBehavior = DimAreaBehavior.UNDEFINED) {
     /**
      * The area of dimming to apply.
      *
@@ -88,23 +84,18 @@
         if (other !is EmbeddingConfiguration) return false
 
         if (dimAreaBehavior != other.dimAreaBehavior) return false
-        if (isAutoSaveEmbeddingState != other.isAutoSaveEmbeddingState) return false
         return true
     }
 
     override fun hashCode(): Int {
-        var result = dimAreaBehavior.hashCode()
-        result = 31 * result + isAutoSaveEmbeddingState.hashCode()
-        return result
+        return dimAreaBehavior.hashCode()
     }
 
-    override fun toString(): String =
-        "EmbeddingConfiguration{dimArea=$dimAreaBehavior, saveState=$isAutoSaveEmbeddingState}"
+    override fun toString(): String = "EmbeddingConfiguration{$dimAreaBehavior}"
 
     /** Builder for creating an instance of [EmbeddingConfiguration]. */
     class Builder {
         private var mDimAreaBehavior = DimAreaBehavior.UNDEFINED
-        private var mSaveEmbeddingState: Boolean = false
 
         /**
          * Sets the dim area behavior. By default, the [DimAreaBehavior.UNDEFINED] is used if not
@@ -121,35 +112,10 @@
         fun setDimAreaBehavior(area: DimAreaBehavior): Builder = apply { mDimAreaBehavior = area }
 
         /**
-         * Sets whether to auto save the embedding state to the system, which can be used to restore
-         * the app embedding state once the app process is restarted (if applicable).
-         *
-         * The embedding state is not saved by default, in which case the embedding state and the
-         * embedded activities are removed once the app process is killed.
-         *
-         * **Note** that the applications should set the [EmbeddingRule]s using
-         * [RuleController.setRules] when the application is initializing, such as configured in
-         * [androidx.startup.Initializer] or in [android.app.Application.onCreate], in order to
-         * allow the library to restore the state properly. Otherwise, the state may not be restored
-         * and the activities may not be started and layout as expected.
-         *
-         * This can be supported only if the Window Extensions version of the target device is
-         * equals or higher than required API level. Otherwise, it would be no-op on a target device
-         * that has lower API level.
-         *
-         * @param saveState whether to save the embedding state
-         */
-        @RequiresWindowSdkExtension(8)
-        fun setAutoSaveEmbeddingState(saveState: Boolean): Builder = apply {
-            mSaveEmbeddingState = saveState
-        }
-
-        /**
          * Builds a[EmbeddingConfiguration] instance.
          *
          * @return The new [EmbeddingConfiguration] instance.
          */
-        fun build(): EmbeddingConfiguration =
-            EmbeddingConfiguration(mDimAreaBehavior, mSaveEmbeddingState)
+        fun build(): EmbeddingConfiguration = EmbeddingConfiguration(mDimAreaBehavior)
     }
 }
diff --git a/window/window/src/main/java/androidx/window/embedding/RuleParser.kt b/window/window/src/main/java/androidx/window/embedding/RuleParser.kt
index 1ad58a5..43b8c6641 100644
--- a/window/window/src/main/java/androidx/window/embedding/RuleParser.kt
+++ b/window/window/src/main/java/androidx/window/embedding/RuleParser.kt
@@ -28,7 +28,6 @@
 import androidx.window.embedding.DividerAttributes.Companion.TYPE_VALUE_FIXED
 import androidx.window.embedding.DividerAttributes.Companion.WIDTH_SYSTEM_DEFAULT
 import androidx.window.embedding.DividerAttributes.Companion.validateXmlDividerAttributes
-import androidx.window.embedding.EmbeddingAnimationParams.AnimationSpec.Companion.DEFAULT
 import androidx.window.embedding.EmbeddingAspectRatio.Companion.buildAspectRatioFromValue
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.LOCALE
 import androidx.window.embedding.SplitRule.FinishBehavior.Companion.ALWAYS
@@ -205,43 +204,23 @@
             val clearTop = typedArray.getBoolean(R.styleable.SplitPairRule_clearTop, false)
             val animationBackgroundColor =
                 typedArray.getColor(R.styleable.SplitPairRule_animationBackgroundColor, 0)
-            val openAnimation =
-                typedArray.getInt(R.styleable.SplitPairRule_splitOpenAnimation, DEFAULT.value)
-            val closeAnimation =
-                typedArray.getInt(R.styleable.SplitPairRule_splitCloseAnimation, DEFAULT.value)
-            val changeAnimation =
-                typedArray.getInt(R.styleable.SplitPairRule_splitChangeAnimation, DEFAULT.value)
             typedArray.recycle()
 
-            val animationParams =
-                EmbeddingAnimationParams.Builder()
-                    .setAnimationBackground(
-                        EmbeddingAnimationBackground.buildFromValue(animationBackgroundColor)
-                    )
-                    .setOpenAnimation(
-                        EmbeddingAnimationParams.AnimationSpec.getAnimationSpecFromValue(
-                            openAnimation
-                        )
-                    )
-                    .setCloseAnimation(
-                        EmbeddingAnimationParams.AnimationSpec.getAnimationSpecFromValue(
-                            closeAnimation
-                        )
-                    )
-                    .setChangeAnimation(
-                        EmbeddingAnimationParams.AnimationSpec.getAnimationSpecFromValue(
-                            changeAnimation
-                        )
-                    )
-                    .build()
-
             val defaultAttrs =
                 SplitAttributes.Builder()
                     .setSplitType(SplitAttributes.SplitType.buildSplitTypeFromValue(ratio))
                     .setLayoutDirection(
                         SplitAttributes.LayoutDirection.getLayoutDirectionFromValue(layoutDir)
                     )
-                    .setAnimationParams(animationParams)
+                    .setAnimationParams(
+                        EmbeddingAnimationParams.Builder()
+                            .setAnimationBackground(
+                                EmbeddingAnimationBackground.buildFromValue(
+                                    animationBackgroundColor
+                                )
+                            )
+                            .build()
+                    )
                     .build()
 
             SplitPairRule.Builder(emptySet())
@@ -318,52 +297,23 @@
                 )
             val animationBackgroundColor =
                 typedArray.getColor(R.styleable.SplitPlaceholderRule_animationBackgroundColor, 0)
-            val openAnimation =
-                typedArray.getInt(
-                    R.styleable.SplitPlaceholderRule_splitOpenAnimation,
-                    DEFAULT.value
-                )
-            val closeAnimation =
-                typedArray.getInt(
-                    R.styleable.SplitPlaceholderRule_splitCloseAnimation,
-                    DEFAULT.value
-                )
-            val changeAnimation =
-                typedArray.getInt(
-                    R.styleable.SplitPlaceholderRule_splitChangeAnimation,
-                    DEFAULT.value
-                )
             typedArray.recycle()
 
-            val animationParams =
-                EmbeddingAnimationParams.Builder()
-                    .setAnimationBackground(
-                        EmbeddingAnimationBackground.buildFromValue(animationBackgroundColor)
-                    )
-                    .setOpenAnimation(
-                        EmbeddingAnimationParams.AnimationSpec.getAnimationSpecFromValue(
-                            openAnimation
-                        )
-                    )
-                    .setCloseAnimation(
-                        EmbeddingAnimationParams.AnimationSpec.getAnimationSpecFromValue(
-                            closeAnimation
-                        )
-                    )
-                    .setChangeAnimation(
-                        EmbeddingAnimationParams.AnimationSpec.getAnimationSpecFromValue(
-                            changeAnimation
-                        )
-                    )
-                    .build()
-
             val defaultAttrs =
                 SplitAttributes.Builder()
                     .setSplitType(SplitAttributes.SplitType.buildSplitTypeFromValue(ratio))
                     .setLayoutDirection(
                         SplitAttributes.LayoutDirection.getLayoutDirectionFromValue(layoutDir)
                     )
-                    .setAnimationParams(animationParams)
+                    .setAnimationParams(
+                        EmbeddingAnimationParams.Builder()
+                            .setAnimationBackground(
+                                EmbeddingAnimationBackground.buildFromValue(
+                                    animationBackgroundColor
+                                )
+                            )
+                            .build()
+                    )
                     .build()
             val packageName = context.applicationContext.packageName
             val placeholderActivityClassName =
@@ -442,7 +392,6 @@
                 type,
                 hasValue(R.styleable.DividerAttributes_dragRangeMinRatio),
                 hasValue(R.styleable.DividerAttributes_dragRangeMaxRatio),
-                hasValue(R.styleable.DividerAttributes_isDraggingToFullscreenAllowed),
             )
 
             val widthDp =
@@ -459,15 +408,12 @@
                     R.styleable.DividerAttributes_dragRangeMaxRatio,
                     DRAG_RANGE_VALUE_UNSPECIFIED
                 )
-            val isDraggingToFullscreenAllowed =
-                getBoolean(R.styleable.DividerAttributes_isDraggingToFullscreenAllowed, false)
             return@parseDividerAttributes DividerAttributes.createDividerAttributes(
                 type,
                 widthDp,
                 color,
                 dragRangeMinRatio,
                 dragRangeMaxRatio,
-                isDraggingToFullscreenAllowed
             )
         }
     }
diff --git a/window/window/src/main/java/androidx/window/embedding/SafeActivityEmbeddingComponentProvider.kt b/window/window/src/main/java/androidx/window/embedding/SafeActivityEmbeddingComponentProvider.kt
index 535a255..61492a9 100644
--- a/window/window/src/main/java/androidx/window/embedding/SafeActivityEmbeddingComponentProvider.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SafeActivityEmbeddingComponentProvider.kt
@@ -27,7 +27,6 @@
 import androidx.window.SafeWindowExtensionsProvider
 import androidx.window.WindowSdkExtensions
 import androidx.window.core.ConsumerAdapter
-import androidx.window.embedding.EmbeddingConfiguration.DimAreaBehavior
 import androidx.window.extensions.WindowExtensions
 import androidx.window.extensions.core.util.function.Consumer
 import androidx.window.extensions.core.util.function.Function
@@ -38,7 +37,6 @@
 import androidx.window.extensions.embedding.ActivityStackAttributes
 import androidx.window.extensions.embedding.ActivityStackAttributesCalculatorParams
 import androidx.window.extensions.embedding.AnimationBackground
-import androidx.window.extensions.embedding.AnimationParams
 import androidx.window.extensions.embedding.DividerAttributes
 import androidx.window.extensions.embedding.EmbeddedActivityWindowInfo
 import androidx.window.extensions.embedding.ParentContainerInfo
@@ -94,9 +92,7 @@
             2 -> hasValidVendorApiLevel2()
             in 3..4 -> hasValidVendorApiLevel3() // No additional API in 4.
             5 -> hasValidVendorApiLevel5()
-            6 -> hasValidVendorApiLevel6()
-            7 -> hasValidVendorApiLevel7()
-            in 8..Int.MAX_VALUE -> hasValidVendorApiLevel8()
+            in 6..Int.MAX_VALUE -> hasValidVendorApiLevel6()
             else -> false
         }
     }
@@ -210,7 +206,6 @@
      * - [ActivityStack.Token]
      * - [WindowAttributes]
      * - [SplitInfo.Token]
-     * - [EmbeddingConfiguration.Builder.setDimAreaBehavior]
      */
     @VisibleForTesting
     internal fun hasValidVendorApiLevel5(): Boolean =
@@ -224,8 +219,7 @@
             isClassAnimationBackgroundValid() &&
             isClassActivityStackTokenValid() &&
             isClassWindowAttributesValid() &&
-            isClassSplitInfoTokenValid() &&
-            isClassEmbeddingConfigurationBuilderApi5Valid()
+            isClassSplitInfoTokenValid()
 
     /**
      * Vendor API level 6 includes the following methods:
@@ -251,35 +245,6 @@
             isClassDividerAttributesBuilderValid()
 
     /**
-     * Vendor API level 7 includes the following methods:
-     * - [SplitAttributes.getAnimationParams]
-     * - [SplitAttributes.Builder.setAnimationParams]
-     * - [DividerAttributes.isDraggingToFullscreenAllowed]
-     * - [DividerAttributes.Builder.setDraggingToFullscreenAllowed] and following classes:
-     * - [AnimationParams]
-     * - [AnimationParams.Builder]
-     */
-    @VisibleForTesting
-    internal fun hasValidVendorApiLevel7(): Boolean =
-        hasValidVendorApiLevel6() &&
-            isMethodGetAnimationParamsValid() &&
-            isMethodSetAnimationParamsValid() &&
-            isMethodIsDraggingToFullscreenAllowedValid() &&
-            isMethodSetDraggingToFullscreenAllowedValid() &&
-            isClassAnimationParamsValid() &&
-            isClassAnimationParamsBuilderValid()
-
-    /**
-     * Vendor API level 8 includes the following methods:
-     * - [EmbeddingConfiguration.Builder.setAutoSaveEmbeddingState]
-     */
-    @VisibleForTesting
-    internal fun hasValidVendorApiLevel8(): Boolean =
-        // TODO(b/289875940): adding #isClassEmbeddingConfigurationBuilderApi8Valid() when API
-        //                    finalized.
-        hasValidVendorApiLevel7()
-
-    /**
      * Overlay features includes the following methods:
      * - [ActivityEmbeddingComponent.clearActivityStackAttributesCalculator]
      * - [ActivityEmbeddingComponent.getActivityStackToken]
@@ -862,20 +827,6 @@
             createFromBinder.isPublic && createFromBinder.doesReturn(splitInfoTokenClass)
         }
 
-    private fun isClassEmbeddingConfigurationBuilderApi5Valid(): Boolean =
-        validateReflection("Class EmbeddingConfiguration.Builder is not valid") {
-            val EmbeddingConfigurationBuilderClass = EmbeddingConfiguration.Builder::class.java
-            val setAutoSaveEmbeddingStateMethod =
-                EmbeddingConfigurationBuilderClass.getMethod(
-                    "setDimAreaBehavior",
-                    DimAreaBehavior::class.java
-                )
-            setAutoSaveEmbeddingStateMethod.isPublic &&
-                setAutoSaveEmbeddingStateMethod.doesReturn(
-                    EmbeddingConfiguration.Builder::class.java
-                )
-        }
-
     /** Vendor API level 6 validation methods */
     private fun isMethodGetEmbeddedActivityWindowInfoValid(): Boolean =
         validateReflection(
@@ -999,112 +950,6 @@
                 setDividerColorMethod.doesReturn(DividerAttributes.Builder::class.java)
         }
 
-    /** Vendor API level 7 validation methods */
-    private fun isMethodGetAnimationParamsValid(): Boolean =
-        validateReflection("SplitAttributes#getAnimationParams is not valid") {
-            val splitAttributesClass = SplitAttributes::class.java
-            val getAnimationParamsMethod = splitAttributesClass.getMethod("getAnimationParams")
-            getAnimationParamsMethod.isPublic &&
-                getAnimationParamsMethod.doesReturn(AnimationParams::class.java)
-        }
-
-    private fun isMethodSetAnimationParamsValid(): Boolean =
-        validateReflection("SplitAttributes#setAnimationParams is not valid") {
-            val splitAttributesBuilderClass = SplitAttributes.Builder::class.java
-            val setAnimationParamsMethod =
-                splitAttributesBuilderClass.getMethod(
-                    "setAnimationParams",
-                    AnimationParams::class.java
-                )
-            setAnimationParamsMethod.isPublic &&
-                setAnimationParamsMethod.doesReturn(SplitAttributes.Builder::class.java)
-        }
-
-    private fun isMethodIsDraggingToFullscreenAllowedValid(): Boolean =
-        validateReflection("DividerAttributes#isDraggingToFullscreenAllowed is not valid") {
-            val dividerAttributesClass = DividerAttributes::class.java
-            val getDividerTypeMethod =
-                dividerAttributesClass.getMethod("isDraggingToFullscreenAllowed")
-            getDividerTypeMethod.isPublic && getDividerTypeMethod.doesReturn(Boolean::class.java)
-        }
-
-    private fun isMethodSetDraggingToFullscreenAllowedValid(): Boolean =
-        validateReflection(
-            "DividerAttributes.Builder#setDraggingToFullscreenAllowed is not valid"
-        ) {
-            val dividerAttributesBuilderClass = DividerAttributes.Builder::class.java
-            val setDividerColorMethod =
-                dividerAttributesBuilderClass.getMethod(
-                    "setDraggingToFullscreenAllowed",
-                    Boolean::class.java
-                )
-            setDividerColorMethod.isPublic &&
-                setDividerColorMethod.doesReturn(DividerAttributes.Builder::class.java)
-        }
-
-    private fun isClassAnimationParamsValid(): Boolean =
-        validateReflection("Class AnimationParams is not valid") {
-            val animationParamsClass = AnimationParams::class.java
-            val animationResourcesIdDefaultField =
-                animationParamsClass.getDeclaredField("DEFAULT_ANIMATION_RESOURCES_ID")
-            val getAnimationBackgroundMethod =
-                animationParamsClass.getMethod("getAnimationBackground")
-            val getOpenAnimationResIdMethod =
-                animationParamsClass.getMethod("getOpenAnimationResId")
-            val getCloseAnimationResIdMethod =
-                animationParamsClass.getMethod("getCloseAnimationResId")
-            val getChangeAnimationResIdMethod =
-                animationParamsClass.getMethod("getChangeAnimationResId")
-            animationResourcesIdDefaultField.isPublic &&
-                getAnimationBackgroundMethod.isPublic &&
-                getAnimationBackgroundMethod.doesReturn(AnimationBackground::class.java) &&
-                getOpenAnimationResIdMethod.isPublic &&
-                getOpenAnimationResIdMethod.doesReturn(Int::class.java) &&
-                getCloseAnimationResIdMethod.isPublic &&
-                getCloseAnimationResIdMethod.doesReturn(Int::class.java) &&
-                getChangeAnimationResIdMethod.isPublic &&
-                getChangeAnimationResIdMethod.doesReturn(Int::class.java)
-        }
-
-    private fun isClassAnimationParamsBuilderValid(): Boolean =
-        validateReflection("Class AnimationParams.Builder is not valid") {
-            val animationParamsBuilderClass = AnimationParams.Builder::class.java
-            val setAnimationBackgroundMethod =
-                animationParamsBuilderClass.getMethod(
-                    "setAnimationBackground",
-                    AnimationBackground::class.java
-                )
-            val setOpenAnimationResIdMethod =
-                animationParamsBuilderClass.getMethod("setOpenAnimationResId", Int::class.java)
-            val setCloseAnimationResIdMethod =
-                animationParamsBuilderClass.getMethod("setCloseAnimationResId", Int::class.java)
-            val setChangeAnimationResIdMethod =
-                animationParamsBuilderClass.getMethod("setChangeAnimationResId", Int::class.java)
-            setAnimationBackgroundMethod.isPublic &&
-                setAnimationBackgroundMethod.doesReturn(AnimationParams.Builder::class.java) &&
-                setOpenAnimationResIdMethod.isPublic &&
-                setOpenAnimationResIdMethod.doesReturn(AnimationParams.Builder::class.java) &&
-                setCloseAnimationResIdMethod.isPublic &&
-                setCloseAnimationResIdMethod.doesReturn(AnimationParams.Builder::class.java) &&
-                setChangeAnimationResIdMethod.isPublic &&
-                setChangeAnimationResIdMethod.doesReturn(AnimationParams.Builder::class.java)
-        }
-
-    /** Vendor API level 8 validation methods */
-    private fun isClassEmbeddingConfigurationBuilderApi8Valid(): Boolean =
-        validateReflection("Class EmbeddingConfiguration.Builder is not valid") {
-            val EmbeddingConfigurationBuilderClass = EmbeddingConfiguration.Builder::class.java
-            val setAutoSaveEmbeddingStateMethod =
-                EmbeddingConfigurationBuilderClass.getMethod(
-                    "setAutoSaveEmbeddingState",
-                    Boolean::class.java
-                )
-            setAutoSaveEmbeddingStateMethod.isPublic &&
-                setAutoSaveEmbeddingStateMethod.doesReturn(
-                    EmbeddingConfiguration.Builder::class.java
-                )
-        }
-
     /** Overlay features validation methods */
     private fun isActivityStackGetTagValid(): Boolean =
         validateReflection("ActivityStack#getTag is not valid") {
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt b/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt
index 4c28e21..7348fcb 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt
@@ -54,15 +54,17 @@
  *   the primary and secondary containers.
  * @property layoutDirection The layout direction of the parent window split. The default is based
  *   on locale value.
- * @property animationParams The animation params to specify the animation transitions of the split
+ * @property animationParams The animation params to specify the animation background of the split
  *   involving this `SplitAttributes` object. The default is to use the current theme window
- *   background color and system transitions.
+ *   background color.
  * @property dividerAttributes The [DividerAttributes] for this split. Defaults to
  *   [DividerAttributes.NO_DIVIDER], which means no divider is requested.
  * @see Builder
  * @see SplitAttributes.SplitType
  * @see SplitAttributes.LayoutDirection
- * @see EmbeddingAnimationParams
+ * @see EmbeddingAnimationBackground
+ * @see EmbeddingAnimationBackground.createColorBackground
+ * @see EmbeddingAnimationBackground.DEFAULT
  */
 class SplitAttributes
 private constructor(
@@ -239,17 +241,6 @@
          */
         override fun toString(): String = description
 
-        override fun equals(other: Any?): Boolean {
-            if (other === this) return true
-            if (other !is LayoutDirection) return false
-            return description == other.description && value == other.value
-        }
-
-        override fun hashCode(): Int {
-            var result = description.hashCode()
-            return 31 * result + value
-        }
-
         /** Non-public properties and methods. */
         companion object {
             /**
@@ -384,8 +375,7 @@
      * Builder for creating an instance of [SplitAttributes].
      * - The default split type is an equal split between primary and secondary containers.
      * - The default layout direction is based on locale.
-     * - The default animation params is to use the current theme window background color and system
-     *   transitions.
+     * - The default animation background color is to use the current theme window background color.
      * - The default divider attributes is not to use divider.
      */
     class Builder() {
@@ -398,7 +388,7 @@
         internal constructor(original: SplitAttributes) : this() {
             this.setSplitType(original.splitType)
                 .setLayoutDirection(original.layoutDirection)
-                .setAnimationParams(original.animationParams)
+                .setAnimationParams(animationParams)
                 .setDividerAttributes(original.dividerAttributes)
         }
 
@@ -428,19 +418,20 @@
 
         /**
          * Sets the animation params to use during animation of the split involving this
-         * `SplitAttributes` object if the animation requires a background color or non-default
-         * transitions.
+         * `SplitAttributes` object if the animation requires a background.
+         *
+         * The default is to use the current theme window background color.
          *
          * [EmbeddingAnimationParams] can be supported only if the Window Extensions version of the
          * target device is equals or higher than required API level. Otherwise, it would be no-op
          * when setting the [EmbeddingAnimationParams] on a target device that has lower API level.
          *
-         * @param params the animation params.
-         * @return this `Builder`.
+         * @param params The animation params.
+         * @return This `Builder`.
          */
         @RequiresWindowSdkExtension(5)
         fun setAnimationParams(params: EmbeddingAnimationParams): Builder = apply {
-            this.animationParams = params
+            animationParams = params
         }
 
         /**
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitPlaceholderRule.kt b/window/window/src/main/java/androidx/window/embedding/SplitPlaceholderRule.kt
index d37863e..30c5661 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitPlaceholderRule.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitPlaceholderRule.kt
@@ -326,7 +326,7 @@
         if (other !is SplitPlaceholderRule) return false
         if (!super.equals(other)) return false
 
-        if (!placeholderIntent.filterEquals(other.placeholderIntent)) return false
+        if (placeholderIntent != other.placeholderIntent) return false
         if (isSticky != other.isSticky) return false
         if (finishPrimaryWithPlaceholder != other.finishPrimaryWithPlaceholder) return false
         if (filters != other.filters) return false
@@ -336,7 +336,7 @@
 
     override fun hashCode(): Int {
         var result = super.hashCode()
-        result = 31 * result + placeholderIntent.filterHashCode()
+        result = 31 * result + placeholderIntent.hashCode()
         result = 31 * result + isSticky.hashCode()
         result = 31 * result + finishPrimaryWithPlaceholder.hashCode()
         result = 31 * result + filters.hashCode()
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitRule.kt b/window/window/src/main/java/androidx/window/embedding/SplitRule.kt
index 383aed3..393862c 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitRule.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitRule.kt
@@ -196,13 +196,6 @@
     ) {
         override fun toString(): String = description
 
-        // Override #hashCode to return consistent value every time.
-        @Suppress("EqualsAndHashCode")
-        override fun hashCode(): Int {
-            var result = description.hashCode()
-            return 31 * result + value
-        }
-
         companion object {
             /** Never finish the associated container. */
             @JvmField val NEVER = FinishBehavior("NEVER", 0)
diff --git a/window/window/src/main/java/androidx/window/layout/WindowInfoTracker.kt b/window/window/src/main/java/androidx/window/layout/WindowInfoTracker.kt
index 321800b..755b83e 100644
--- a/window/window/src/main/java/androidx/window/layout/WindowInfoTracker.kt
+++ b/window/window/src/main/java/androidx/window/layout/WindowInfoTracker.kt
@@ -115,29 +115,6 @@
             throw NotImplementedError("Method was not implemented.")
         }
 
-    /**
-     * Returns the current [WindowLayoutInfo] for the given [context].
-     *
-     * This API provides a convenient way to access the current [WindowLayoutInfo]. It can be used
-     * after the [context] associated window has been created, such as [Activity.onCreate]. Calling
-     * it before that will return an empty info.
-     *
-     * For apps that need to update layout UI based on the [WindowLayoutInfo], it should also listen
-     * to [windowLayoutInfo] for any changes later.
-     *
-     * @param context a [UiContext] such as an [Activity], an [InputMethodService], or an instance
-     *   created via [Context.createWindowContext] that listens to configuration changes.
-     * @return the current [WindowLayoutInfo] for the given [context]. If the [context] is not
-     *   associated with a window, returns an empty [WindowLayoutInfo].
-     * @throws UnsupportedOperationException if [WindowSdkExtensions.extensionVersion] is less
-     *   than 9.
-     * @throws IllegalArgumentException when [context] is not an [UiContext].
-     * @throws NotImplementedError when this method has no supporting implementation.
-     */
-    @RequiresWindowSdkExtension(version = 9)
-    fun getCurrentWindowLayoutInfo(@UiContext context: Context): WindowLayoutInfo =
-        throw NotImplementedError("Method was not implemented.")
-
     companion object {
 
         private val DEBUG = false
diff --git a/window/window/src/main/java/androidx/window/layout/WindowInfoTrackerImpl.kt b/window/window/src/main/java/androidx/window/layout/WindowInfoTrackerImpl.kt
index 2397287..d73f44a 100644
--- a/window/window/src/main/java/androidx/window/layout/WindowInfoTrackerImpl.kt
+++ b/window/window/src/main/java/androidx/window/layout/WindowInfoTrackerImpl.kt
@@ -69,9 +69,4 @@
             windowSdkExtensions.requireExtensionVersion(6)
             return windowBackend.supportedPostures
         }
-
-    override fun getCurrentWindowLayoutInfo(@UiContext context: Context): WindowLayoutInfo {
-        windowSdkExtensions.requireExtensionVersion(9)
-        return windowBackend.getCurrentWindowLayoutInfo(context)
-    }
 }
diff --git a/window/window/src/main/java/androidx/window/layout/adapter/WindowBackend.kt b/window/window/src/main/java/androidx/window/layout/adapter/WindowBackend.kt
index 88a2421..127fbaa 100644
--- a/window/window/src/main/java/androidx/window/layout/adapter/WindowBackend.kt
+++ b/window/window/src/main/java/androidx/window/layout/adapter/WindowBackend.kt
@@ -17,7 +17,6 @@
 
 import android.app.Activity
 import android.content.Context
-import android.inputmethodservice.InputMethodService
 import androidx.annotation.RestrictTo
 import androidx.annotation.UiContext
 import androidx.core.util.Consumer
@@ -62,21 +61,4 @@
     @RequiresWindowSdkExtension(version = 6)
     @get:RequiresWindowSdkExtension(version = 6)
     val supportedPostures: List<SupportedPosture>
-
-    /**
-     * Returns the current [WindowLayoutInfo] for the given [Context].
-     *
-     * This API provides a convenient way to access the current [WindowLayoutInfo] without
-     * registering a listener via [registerLayoutChangeCallback]. It simplifies the retrieval of
-     * [WindowLayoutInfo] in scenarios like [Activity.onCreate].
-     *
-     * @param context a [Context] that corresponds to a window or an area on the screen. This can be
-     *   an [Activity], a [Context] created with [Context.createWindowContext], or an
-     *   [InputMethodService].
-     * @return the current [WindowLayoutInfo] for the given [Context].
-     * @throws UnsupportedOperationException if the Window SDK extension version is less than 9.
-     * @throws IllegalArgumentException when [context] is not an [UiContext].
-     */
-    @RequiresWindowSdkExtension(version = 9)
-    fun getCurrentWindowLayoutInfo(@UiContext context: Context): WindowLayoutInfo
 }
diff --git a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackend.kt b/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackend.kt
index e4c2cfa..9d53488 100644
--- a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackend.kt
+++ b/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackend.kt
@@ -42,7 +42,6 @@
         fun newInstance(component: WindowLayoutComponent, adapter: ConsumerAdapter): WindowBackend {
             val safeVendorApiLevel = ExtensionsUtil.safeVendorApiLevel
             return when {
-                safeVendorApiLevel >= 9 -> ExtensionWindowBackendApi9(component, adapter)
                 safeVendorApiLevel >= 6 -> ExtensionWindowBackendApi6(component, adapter)
                 safeVendorApiLevel >= 2 -> ExtensionWindowBackendApi2(component, adapter)
                 safeVendorApiLevel == 1 -> ExtensionWindowBackendApi1(component, adapter)
diff --git a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi0.kt b/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi0.kt
index 6cbfeda..72b4c87 100644
--- a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi0.kt
+++ b/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi0.kt
@@ -23,7 +23,7 @@
 import androidx.window.layout.adapter.WindowBackend
 import java.util.concurrent.Executor
 
-internal open class ExtensionWindowBackendApi0 : WindowBackend {
+internal class ExtensionWindowBackendApi0 : WindowBackend {
 
     override fun registerLayoutChangeCallback(
         context: Context,
@@ -38,8 +38,8 @@
     }
 
     override val supportedPostures: List<SupportedPosture>
-        get() = throw UnsupportedOperationException("Extensions version must be at least 6")
-
-    override fun getCurrentWindowLayoutInfo(context: Context): WindowLayoutInfo =
-        throw UnsupportedOperationException("Extensions version must be at least 9")
+        get() =
+            throw UnsupportedOperationException(
+                "supportedPostures is only supported on Window SDK 6."
+            )
 }
diff --git a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi1.kt b/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi1.kt
index 1de6f28..33c53a7 100644
--- a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi1.kt
+++ b/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi1.kt
@@ -22,20 +22,20 @@
 import androidx.annotation.UiContext
 import androidx.annotation.VisibleForTesting
 import androidx.core.util.Consumer
-import androidx.window.RequiresWindowSdkExtension
 import androidx.window.core.ConsumerAdapter
 import androidx.window.extensions.layout.WindowLayoutComponent
 import androidx.window.extensions.layout.WindowLayoutInfo as OEMWindowLayoutInfo
+import androidx.window.layout.SupportedPosture
 import androidx.window.layout.WindowLayoutInfo
+import androidx.window.layout.adapter.WindowBackend
 import java.util.concurrent.Executor
 import java.util.concurrent.locks.ReentrantLock
 import kotlin.concurrent.withLock
 
-@RequiresWindowSdkExtension(version = 1)
 internal open class ExtensionWindowBackendApi1(
     val component: WindowLayoutComponent,
     private val consumerAdapter: ConsumerAdapter
-) : ExtensionWindowBackendApi0() {
+) : WindowBackend {
 
     private val globalLock = ReentrantLock()
 
@@ -126,4 +126,7 @@
             listenerToContext.isEmpty() &&
             consumerToToken.isEmpty())
     }
+
+    override val supportedPostures: List<SupportedPosture>
+        get() = throw UnsupportedOperationException("Extensions version must be at least 6")
 }
diff --git a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi2.kt b/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi2.kt
index 8fb5501..0a20ba9 100644
--- a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi2.kt
+++ b/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi2.kt
@@ -22,7 +22,6 @@
 import androidx.annotation.UiContext
 import androidx.annotation.VisibleForTesting
 import androidx.core.util.Consumer
-import androidx.window.RequiresWindowSdkExtension
 import androidx.window.core.ConsumerAdapter
 import androidx.window.extensions.layout.WindowLayoutComponent
 import androidx.window.layout.WindowLayoutInfo
@@ -30,7 +29,6 @@
 import java.util.concurrent.locks.ReentrantLock
 import kotlin.concurrent.withLock
 
-@RequiresWindowSdkExtension(version = 2)
 internal open class ExtensionWindowBackendApi2(
     component: WindowLayoutComponent,
     adapter: ConsumerAdapter
diff --git a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi6.kt b/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi6.kt
index 27562bf..ee9ff3cb8 100644
--- a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi6.kt
+++ b/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi6.kt
@@ -22,7 +22,7 @@
 import androidx.window.layout.SupportedPosture
 
 @RequiresWindowSdkExtension(version = 6)
-internal open class ExtensionWindowBackendApi6(
+internal class ExtensionWindowBackendApi6(
     component: WindowLayoutComponent,
     adapter: ConsumerAdapter
 ) : ExtensionWindowBackendApi2(component, adapter) {
diff --git a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi9.kt b/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi9.kt
deleted file mode 100644
index 76d1dcc..0000000
--- a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowBackendApi9.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window.layout.adapter.extensions
-
-import android.content.Context
-import androidx.window.RequiresWindowSdkExtension
-import androidx.window.core.ConsumerAdapter
-import androidx.window.extensions.layout.WindowLayoutComponent
-import androidx.window.layout.WindowLayoutInfo
-
-@RequiresWindowSdkExtension(version = 9)
-internal open class ExtensionWindowBackendApi9(
-    component: WindowLayoutComponent,
-    adapter: ConsumerAdapter,
-) : ExtensionWindowBackendApi6(component, adapter) {
-    override fun getCurrentWindowLayoutInfo(context: Context): WindowLayoutInfo =
-        ExtensionsWindowLayoutInfoAdapter.translate(
-            context,
-            info = component.getCurrentWindowLayoutInfo(context),
-        )
-}
diff --git a/window/window/src/main/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackend.kt b/window/window/src/main/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackend.kt
index 3244cce..31ee16f 100644
--- a/window/window/src/main/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackend.kt
+++ b/window/window/src/main/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackend.kt
@@ -131,9 +131,6 @@
     override val supportedPostures: List<SupportedPosture>
         get() = throw UnsupportedOperationException("Must be called from extensions.")
 
-    override fun getCurrentWindowLayoutInfo(context: Context): WindowLayoutInfo =
-        throw UnsupportedOperationException("Must be called from extensions.")
-
     /**
      * Checks if there are no more registered callbacks left for the activity and inform extension
      * if needed.
diff --git a/window/window/src/main/res/values/attrs.xml b/window/window/src/main/res/values/attrs.xml
index 1a5c29e..7f6b59e 100644
--- a/window/window/src/main/res/values/attrs.xml
+++ b/window/window/src/main/res/values/attrs.xml
@@ -51,31 +51,6 @@
          The default is to use the current theme's windowBackground. Any non-opaque color will be
          treated the same as default. -->
     <attr name="animationBackgroundColor" format="color" />
-    <!-- An attribute for Activity Embedding rules.
-     Defines the open animation transition spec for the Activity Embedding split. -->
-    <attr name="splitOpenAnimation" format="enum">
-        <!-- The default animation specified by the system. -->
-        <enum name="systemDefault" value="0" />
-        <!-- An animation with zero duration. -->
-        <enum name="jumpCut" value="1" />
-    </attr>
-    <!-- An attribute for Activity Embedding rules.
-     Defines the close animation transition spec for the Activity Embedding split. -->
-    <attr name="splitCloseAnimation" format="enum">
-        <!-- The default animation specified by the system. -->
-        <enum name="systemDefault" value="0" />
-        <!-- An animation with zero duration. -->
-        <enum name="jumpCut" value="1" />
-    </attr>
-    <!-- An attribute for Activity Embedding rules.
-         Defines the change (resize or move) animation transition spec for the Activity Embedding
-         split. -->
-    <attr name="splitChangeAnimation" format="enum">
-        <!-- The default animation specified by the system. -->
-        <enum name="systemDefault" value="0" />
-        <!-- An animation with zero duration. -->
-        <enum name="jumpCut" value="1" />
-    </attr>
 
     <!-- An attribute for Activity Embedding rules.
          The smallest value of width of the parent Task bounds when the split should be used, in DP.
@@ -186,9 +161,6 @@
         <attr name="splitLayoutDirection"/>
         <attr name="tag"/>
         <attr name="animationBackgroundColor"/>
-        <attr name="splitOpenAnimation"/>
-        <attr name="splitCloseAnimation"/>
-        <attr name="splitChangeAnimation"/>
     </declare-styleable>
 
     <!-- Attributes that are read when parsing a <SplitPlaceholderRule> tag, which defines the split
@@ -215,9 +187,6 @@
         <attr name="splitLayoutDirection"/>
         <attr name="tag"/>
         <attr name="animationBackgroundColor"/>
-        <attr name="splitOpenAnimation"/>
-        <attr name="splitCloseAnimation"/>
-        <attr name="splitChangeAnimation"/>
     </declare-styleable>
 
     <!-- Attributes that are read when parsing an <ActivityRule> tag, which defines the layout
@@ -296,11 +265,5 @@
              This attribute is only allowed for a draggable divider and an exception is thrown
              otherwise. See DividerAttributes.DragRange for more details. -->
         <attr name="dragRangeMaxRatio" format="float" />
-        <!-- if true, the user is allowed to drag beyond the specified range temporarily, and when
-             dragging is finished, the system will choose to either fully expand the larger
-             container or move the divider back to the range limit. This only takes effect for
-             extensions version 7 and above. This attribute is only allowed for a draggable divider
-             and an exception is thrown otherwise. Default value is false. -->
-        <attr name="isDraggingToFullscreenAllowed" format="boolean" />
     </declare-styleable>
 </resources>
\ No newline at end of file
diff --git a/window/window/src/main/res/values/public.xml b/window/window/src/main/res/values/public.xml
index 9c381bf..d05d4dd 100644
--- a/window/window/src/main/res/values/public.xml
+++ b/window/window/src/main/res/values/public.xml
@@ -44,5 +44,4 @@
     <public name="embeddingDividerColor" type="attr" />
     <public name="dragRangeMinRatio" type="attr" />
     <public name="dragRangeMaxRatio" type="attr" />
-    <public name="isDraggingToFullscreenAllowed" type="attr" />
 </resources>
\ No newline at end of file
diff --git a/window/window/src/test/java/androidx/window/embedding/ActivityRuleTest.kt b/window/window/src/test/java/androidx/window/embedding/ActivityRuleTest.kt
index 3666e7b..3ef53e3 100644
--- a/window/window/src/test/java/androidx/window/embedding/ActivityRuleTest.kt
+++ b/window/window/src/test/java/androidx/window/embedding/ActivityRuleTest.kt
@@ -59,10 +59,6 @@
 
         assertEquals(firstRule, secondRule)
         assertEquals(firstRule.hashCode(), secondRule.hashCode())
-
-        // The hashCode should be consistent to the predetermined value.
-        // Note that the value should be updated whenever hashCode calculation is changed.
-        assertEquals(-883899860, firstRule.hashCode())
     }
 
     /**
diff --git a/window/window/src/test/java/androidx/window/embedding/DividerAttributesTest.kt b/window/window/src/test/java/androidx/window/embedding/DividerAttributesTest.kt
index 1676367..dbca076 100644
--- a/window/window/src/test/java/androidx/window/embedding/DividerAttributesTest.kt
+++ b/window/window/src/test/java/androidx/window/embedding/DividerAttributesTest.kt
@@ -43,8 +43,6 @@
                 .setWidthDp(DividerAttributes.WIDTH_SYSTEM_DEFAULT)
                 .setDragRange(DRAG_RANGE_SYSTEM_DEFAULT)
                 .build()
-        val attrs5 =
-            DraggableDividerAttributes.Builder(attrs4).setDraggingToFullscreenAllowed(true).build()
 
         assertNotEquals(attrs1, attrs2)
         assertNotEquals(attrs1.hashCode(), attrs2.hashCode())
@@ -55,9 +53,6 @@
         assertNotEquals(attrs3, attrs4)
         assertNotEquals(attrs3.hashCode(), attrs4.hashCode())
 
-        assertNotEquals(attrs4, attrs5)
-        assertNotEquals(attrs4.hashCode(), attrs5.hashCode())
-
         // attrs2 and attrs4 must be equal because attrs4 uses default values.
         assertEquals(attrs2, attrs4)
         assertEquals(attrs2.hashCode(), attrs4.hashCode())
@@ -70,13 +65,11 @@
                 .setWidthDp(20)
                 .setDragRange(SplitRatioDragRange(0.3f, 0.7f))
                 .setColor(Color.GRAY)
-                .setDraggingToFullscreenAllowed(true)
                 .build()
 
         assertEquals(20, attrs.widthDp)
         assertEquals(SplitRatioDragRange(0.3f, 0.7f), attrs.dragRange)
         assertEquals(Color.GRAY, attrs.color)
-        assertEquals(true, attrs.isDraggingToFullscreenAllowed)
     }
 
     @Test
@@ -86,7 +79,6 @@
         assertEquals(DividerAttributes.WIDTH_SYSTEM_DEFAULT, attrs.widthDp)
         assertEquals(DRAG_RANGE_SYSTEM_DEFAULT, attrs.dragRange)
         assertEquals(Color.BLACK, attrs.color)
-        assertEquals(false, attrs.isDraggingToFullscreenAllowed)
     }
 
     @Test
diff --git a/window/window/src/test/java/androidx/window/embedding/SplitAttributesTest.kt b/window/window/src/test/java/androidx/window/embedding/SplitAttributesTest.kt
index 9eef488..49cd022 100644
--- a/window/window/src/test/java/androidx/window/embedding/SplitAttributesTest.kt
+++ b/window/window/src/test/java/androidx/window/embedding/SplitAttributesTest.kt
@@ -64,7 +64,6 @@
                 .setAnimationBackground(
                     EmbeddingAnimationBackground.createColorBackground(Color.GREEN)
                 )
-                .setCloseAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
                 .build()
         val attrs4 =
             SplitAttributes.Builder()
diff --git a/window/window/src/test/java/androidx/window/embedding/SplitPairRuleTest.kt b/window/window/src/test/java/androidx/window/embedding/SplitPairRuleTest.kt
index 3cd22b9..fbf1295 100644
--- a/window/window/src/test/java/androidx/window/embedding/SplitPairRuleTest.kt
+++ b/window/window/src/test/java/androidx/window/embedding/SplitPairRuleTest.kt
@@ -20,14 +20,9 @@
 import android.graphics.Color
 import android.graphics.Rect
 import androidx.window.core.ActivityComponentInfo
-import androidx.window.embedding.DividerAttributes.Companion.NO_DIVIDER
-import androidx.window.embedding.EmbeddingAspectRatio.Companion.ALWAYS_ALLOW
-import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_HINGE
-import androidx.window.embedding.SplitAttributes.SplitType.Companion.ratio
 import androidx.window.embedding.SplitRule.Companion.SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT
 import androidx.window.embedding.SplitRule.Companion.SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT
 import androidx.window.embedding.SplitRule.Companion.SPLIT_MIN_DIMENSION_DP_DEFAULT
-import androidx.window.embedding.SplitRule.FinishBehavior.Companion.ADJACENT
 import androidx.window.embedding.SplitRule.FinishBehavior.Companion.ALWAYS
 import androidx.window.embedding.SplitRule.FinishBehavior.Companion.NEVER
 import junit.framework.TestCase
@@ -67,48 +62,10 @@
     @Test
     fun equalsImpliesHashCode() {
         val filter = SplitPairFilter(ComponentName("a", "b"), ComponentName("c", "d"), "ACTION")
-        val firstRule =
-            SplitPairRule.Builder(setOf(filter))
-                .setClearTop(true)
-                .setDefaultSplitAttributes(
-                    SplitAttributes.Builder()
-                        .setSplitType(SPLIT_TYPE_HINGE)
-                        .setDividerAttributes(NO_DIVIDER)
-                        .setAnimationParams(EmbeddingAnimationParams.Builder().build())
-                        .build()
-                )
-                .setMinWidthDp(100)
-                .setMinHeightDp(100)
-                .setMinSmallestWidthDp(100)
-                .setFinishPrimaryWithSecondary(ADJACENT)
-                .setFinishSecondaryWithPrimary(ADJACENT)
-                .setMaxAspectRatioInLandscape(ALWAYS_ALLOW)
-                .setMaxAspectRatioInPortrait(ALWAYS_ALLOW)
-                .build()
-        val secondRule =
-            SplitPairRule.Builder(setOf(filter))
-                .setClearTop(true)
-                .setDefaultSplitAttributes(
-                    SplitAttributes.Builder()
-                        .setSplitType(SPLIT_TYPE_HINGE)
-                        .setDividerAttributes(NO_DIVIDER)
-                        .setAnimationParams(EmbeddingAnimationParams.Builder().build())
-                        .build()
-                )
-                .setMinWidthDp(100)
-                .setMinHeightDp(100)
-                .setMinSmallestWidthDp(100)
-                .setFinishPrimaryWithSecondary(ADJACENT)
-                .setFinishSecondaryWithPrimary(ADJACENT)
-                .setMaxAspectRatioInLandscape(ALWAYS_ALLOW)
-                .setMaxAspectRatioInPortrait(ALWAYS_ALLOW)
-                .build()
+        val firstRule = SplitPairRule.Builder(setOf(filter)).build()
+        val secondRule = SplitPairRule.Builder(setOf(filter)).build()
         assertEquals(firstRule, secondRule)
         assertEquals(firstRule.hashCode(), secondRule.hashCode())
-
-        // The hashCode should be consistent to the predetermined value.
-        // Note that the value should be updated whenever hashCode calculation is changed.
-        assertEquals(-1740043078, firstRule.hashCode())
     }
 
     /*------------------------------Builder Test------------------------------*/
@@ -151,7 +108,6 @@
                         .setAnimationBackground(
                             EmbeddingAnimationBackground.createColorBackground(Color.GREEN)
                         )
-                        .setCloseAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
                         .build()
                 )
                 .build()
diff --git a/window/window/src/test/java/androidx/window/embedding/SplitPinRuleTest.kt b/window/window/src/test/java/androidx/window/embedding/SplitPinRuleTest.kt
deleted file mode 100644
index f513051..0000000
--- a/window/window/src/test/java/androidx/window/embedding/SplitPinRuleTest.kt
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window.embedding
-
-import androidx.window.embedding.SplitRule.Companion.SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT
-import androidx.window.embedding.SplitRule.Companion.SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT
-import androidx.window.embedding.SplitRule.Companion.SPLIT_MIN_DIMENSION_DP_DEFAULT
-import junit.framework.TestCase
-import org.junit.Assert.assertEquals
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.robolectric.RobolectricTestRunner
-
-/** Unit test for [SplitPinRule] to check the construction is correct by using it's builder. */
-@RunWith(RobolectricTestRunner::class)
-class SplitPinRuleTest {
-
-    /*------------------------------Class Test------------------------------*/
-    /** Test hashcode and equals are properly calculated for 2 equal [SplitPinRule] */
-    @Test
-    fun equalsImpliesHashCode() {
-        val firstRule = SplitPinRule.Builder().setSticky(true).build()
-        val secondRule = SplitPinRule.Builder().setSticky(true).build()
-        assertEquals(firstRule, secondRule)
-        assertEquals(firstRule.hashCode(), secondRule.hashCode())
-
-        // The hashCode should be consistent to the predetermined value.
-        // Note that the value should be updated whenever hashCode calculation is changed.
-        assertEquals(1678620995, firstRule.hashCode())
-    }
-
-    /*------------------------------Builder Test------------------------------*/
-    /**
-     * Verifies that default params are set correctly when creating [SplitPinRule] with a builder.
-     */
-    @Test
-    fun testDefaults_SplitPinRule_Builder() {
-        val rule = SplitPinRule.Builder().build()
-        val expectedSplitLayout =
-            SplitAttributes.Builder()
-                .setSplitType(SplitAttributes.SplitType.ratio(0.5f))
-                .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
-                .setAnimationParams(EmbeddingAnimationParams.Builder().build())
-                .build()
-
-        TestCase.assertNull(rule.tag)
-        assertEquals(SPLIT_MIN_DIMENSION_DP_DEFAULT, rule.minWidthDp)
-        assertEquals(SPLIT_MIN_DIMENSION_DP_DEFAULT, rule.minHeightDp)
-        assertEquals(SPLIT_MIN_DIMENSION_DP_DEFAULT, rule.minSmallestWidthDp)
-        assertEquals(SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT, rule.maxAspectRatioInPortrait)
-        assertEquals(SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT, rule.maxAspectRatioInLandscape)
-        assertEquals(false, rule.isSticky)
-        assertEquals(expectedSplitLayout, rule.defaultSplitAttributes)
-    }
-}
diff --git a/window/window/src/test/java/androidx/window/embedding/SplitPlaceHolderRuleTest.kt b/window/window/src/test/java/androidx/window/embedding/SplitPlaceHolderRuleTest.kt
index 8387206..82228b4 100644
--- a/window/window/src/test/java/androidx/window/embedding/SplitPlaceHolderRuleTest.kt
+++ b/window/window/src/test/java/androidx/window/embedding/SplitPlaceHolderRuleTest.kt
@@ -46,14 +46,11 @@
     @Test
     fun equalsImpliesHashCode() {
         val filter = ActivityFilter(ActivityComponentInfo("a", "b"), "ACTION")
-        val firstRule = SplitPlaceholderRule.Builder(setOf(filter), Intent()).build()
-        val secondRule = SplitPlaceholderRule.Builder(setOf(filter), Intent()).build()
+        val placeholderIntent = Intent()
+        val firstRule = SplitPlaceholderRule.Builder(setOf(filter), placeholderIntent).build()
+        val secondRule = SplitPlaceholderRule.Builder(setOf(filter), placeholderIntent).build()
         assertEquals(firstRule, secondRule)
         assertEquals(firstRule.hashCode(), secondRule.hashCode())
-
-        // The hashCode should be consistent to the predetermined value.
-        // Note that the value should be updated whenever hashCode calculation is changed.
-        assertEquals(1986646852, firstRule.hashCode())
     }
 
     /*------------------------------Builder Test------------------------------*/
@@ -101,7 +98,6 @@
                         .setAnimationBackground(
                             EmbeddingAnimationBackground.createColorBackground(Color.GREEN)
                         )
-                        .setCloseAnimation(EmbeddingAnimationParams.AnimationSpec.JUMP_CUT)
                         .build()
                 )
                 .build()
diff --git a/xr/arcore/arcore/api/restricted_current.txt b/xr/arcore/arcore/api/restricted_current.txt
index 4cd1cb1..a93bf64 100644
--- a/xr/arcore/arcore/api/restricted_current.txt
+++ b/xr/arcore/arcore/api/restricted_current.txt
@@ -62,13 +62,11 @@
   }
 
   public static final class Hand.State {
-    ctor public Hand.State(androidx.xr.runtime.internal.TrackingState trackingState, java.nio.ByteBuffer handJointsBuffer);
+    ctor public Hand.State(boolean isActive, java.util.Map<androidx.xr.runtime.internal.HandJointType,androidx.xr.runtime.math.Pose> handJoints);
     method public java.util.Map<androidx.xr.runtime.internal.HandJointType,androidx.xr.runtime.math.Pose> getHandJoints();
-    method public java.nio.ByteBuffer getHandJointsBuffer();
-    method public androidx.xr.runtime.internal.TrackingState getTrackingState();
+    method public boolean isActive();
     property public java.util.Map<androidx.xr.runtime.internal.HandJointType,androidx.xr.runtime.math.Pose> handJoints;
-    property public java.nio.ByteBuffer handJointsBuffer;
-    property public androidx.xr.runtime.internal.TrackingState trackingState;
+    property public boolean isActive;
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class HitResult {
diff --git a/xr/arcore/arcore/dependencyAnalysis-baseline.json b/xr/arcore/arcore/dependencyAnalysis-baseline.json
index d56eaba..ae26508 100644
--- a/xr/arcore/arcore/dependencyAnalysis-baseline.json
+++ b/xr/arcore/arcore/dependencyAnalysis-baseline.json
@@ -4,6 +4,14 @@
     {
       "coordinates": {
         "type": "module",
+        "identifier": "androidx.annotation:annotation",
+        "resolvedVersion": "1.8.1"
+      },
+      "fromConfiguration": "implementation"
+    },
+    {
+      "coordinates": {
+        "type": "module",
         "identifier": "androidx.appcompat:appcompat",
         "resolvedVersion": "1.2.0"
       },
diff --git a/xr/arcore/arcore/src/main/kotlin/androidx/xr/arcore/Anchor.kt b/xr/arcore/arcore/src/main/kotlin/androidx/xr/arcore/Anchor.kt
index 3573ca9..2f3e814 100644
--- a/xr/arcore/arcore/src/main/kotlin/androidx/xr/arcore/Anchor.kt
+++ b/xr/arcore/arcore/src/main/kotlin/androidx/xr/arcore/Anchor.kt
@@ -43,7 +43,7 @@
 ) : Updatable {
     public companion object {
         /**
-         * Creates and attaches an [Anchor] at the given [pose].
+         * Creates an [Anchor] at the given [pose].
          *
          * @param session the [Session] that is used to create the anchor.
          * @param pose the [Pose] that describes the location and orientation of the anchor.
@@ -74,8 +74,8 @@
 
         /**
          * Loads an [Anchor] from local storage, using the given [uuid]. The anchor will attempt to
-         * be attached in the same physical location as the anchor that was previously persisted.
-         * The [uuid] should be the return value of a previous call to [persist].
+         * be in the same physical location as the anchor that was previously persisted. The [uuid]
+         * should be the return value of a previous call to [persist].
          */
         @JvmStatic
         public fun load(session: Session, uuid: UUID): AnchorCreateResult {
diff --git a/xr/arcore/arcore/src/main/kotlin/androidx/xr/arcore/Hand.kt b/xr/arcore/arcore/src/main/kotlin/androidx/xr/arcore/Hand.kt
index adfb1ee..6edddc0 100644
--- a/xr/arcore/arcore/src/main/kotlin/androidx/xr/arcore/Hand.kt
+++ b/xr/arcore/arcore/src/main/kotlin/androidx/xr/arcore/Hand.kt
@@ -20,10 +20,6 @@
 import androidx.xr.runtime.Session
 import androidx.xr.runtime.internal.Hand as RuntimeHand
 import androidx.xr.runtime.math.Pose
-import androidx.xr.runtime.math.Quaternion
-import androidx.xr.runtime.math.Vector3
-import java.nio.ByteBuffer
-import java.nio.ByteOrder
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.asStateFlow
@@ -68,98 +64,32 @@
     /**
      * The representation of the current state of [Hand].
      *
-     * @param trackingState the current [TrackingState] of the hand.
-     * @param handJointsBuffer the [ByteBuffer] containing the pose of each joint in the hand.
+     * @property isActive whether the hand is currently being tracked.
+     * @property handJoints the current pose of each joint in the hand.
      */
     public class State(
-        public val trackingState: TrackingState,
-        public val handJointsBuffer: ByteBuffer,
+        public val isActive: Boolean,
+        public val handJoints: Map<HandJointType, Pose>,
     ) {
-
-        private class JointsMap(
-            val trackingState: TrackingState,
-            val handJointsBuffer: ByteBuffer
-        ) : Map<HandJointType, Pose> {
-            override val entries: Set<Map.Entry<HandJointType, Pose>>
-                get() =
-                    if (trackingState == TrackingState.Tracking) {
-                        RuntimeHand.parseHandJoint(trackingState, handJointsBuffer).entries.toSet()
-                    } else {
-                        emptySet()
-                    }
-
-            override val keys: Set<HandJointType>
-                get() =
-                    if (trackingState == TrackingState.Tracking) HandJointType.values().toSet()
-                    else emptySet()
-
-            override val size: Int
-                get() = keys.size
-
-            override val values: Collection<Pose>
-                get() = entries.map { it.value }
-
-            override fun containsKey(key: HandJointType): Boolean {
-                return keys.contains(key)
-            }
-
-            override fun containsValue(value: Pose): Boolean {
-                return values.contains(value)
-            }
-
-            override fun get(key: HandJointType): Pose? =
-                if (trackingState == TrackingState.Tracking) locateHandJointFromBuffer(key)
-                else null
-
-            override fun isEmpty(): Boolean {
-                return trackingState != TrackingState.Tracking
-            }
-
-            private fun locateHandJointFromBuffer(handJointType: HandJointType): Pose {
-                val buffer = handJointsBuffer.duplicate().order(ByteOrder.nativeOrder())
-                val bytePerPose = 7 * 4
-                val byteOffset = handJointType.ordinal * bytePerPose
-                buffer.position(byteOffset)
-                val qx = buffer.float
-                val qy = buffer.float
-                val qz = buffer.float
-                val qw = buffer.float
-                val px = buffer.float
-                val py = buffer.float
-                val pz = buffer.float
-                return Pose(Vector3(px, py, pz), Quaternion(qx, qy, qz, qw))
-            }
-        }
-
-        /**
-         * Returns the current pose of each joint in the hand.
-         *
-         * @return a map of [HandJointType] to [Pose] representing the current pose of each joint in
-         *   the hand.
-         */
-        public val handJoints: Map<HandJointType, Pose> = JointsMap(trackingState, handJointsBuffer)
-
         override fun equals(other: Any?): Boolean {
             if (this === other) return true
             if (other !is State) return false
-            return trackingState == other.trackingState &&
-                handJointsBuffer == other.handJointsBuffer
+            return isActive == other.isActive && handJoints == other.handJoints
         }
 
         override fun hashCode(): Int {
-            var result = trackingState.hashCode()
-            result = 31 * result + handJointsBuffer.hashCode()
+            var result = isActive.hashCode()
+            result = 31 * result + handJoints.hashCode()
             return result
         }
     }
 
-    private val _state =
-        MutableStateFlow<State>(State(TrackingState.Paused, ByteBuffer.allocate(0)))
+    private val _state = MutableStateFlow<State>(State(isActive = false, handJoints = emptyMap()))
     /** The current [State] of this hand. */
     public val state: StateFlow<State> = _state.asStateFlow()
 
     override suspend fun update() {
-        _state.emit(State(runtimeHand.trackingState, runtimeHand.handJointsBuffer))
+        _state.emit(State(isActive = runtimeHand.isActive, handJoints = runtimeHand.handJoints))
     }
 
     override fun equals(other: Any?): Boolean {
diff --git a/xr/arcore/arcore/src/main/kotlin/androidx/xr/arcore/Plane.kt b/xr/arcore/arcore/src/main/kotlin/androidx/xr/arcore/Plane.kt
index 6c3026b..1a2bab9 100644
--- a/xr/arcore/arcore/src/main/kotlin/androidx/xr/arcore/Plane.kt
+++ b/xr/arcore/arcore/src/main/kotlin/androidx/xr/arcore/Plane.kt
@@ -64,8 +64,7 @@
      * @property centerPose The pose of the center of the detected plane.
      * @property extents The dimensions of the detected plane.
      * @property subsumedBy If this plane has been subsumed, returns the plane this plane was merged
-     *   into. If the subsuming plane is also subsumed by another plane, this plane will continue to
-     *   be subsumed by the former.
+     *   into.
      * @property vertices The 2D vertices of a convex polygon approximating the detected plane.
      */
     public class State(
diff --git a/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/AnchorTest.kt b/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/AnchorTest.kt
index ff85685..ca32265 100644
--- a/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/AnchorTest.kt
+++ b/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/AnchorTest.kt
@@ -51,7 +51,7 @@
     @get:Rule
     val grantPermissionRule =
         GrantPermissionRule.grant(
-            "android.permission.SCENE_UNDERSTANDING_COARSE",
+            "android.permission.SCENE_UNDERSTANDING",
             "android.permission.HAND_TRACKING",
         )
 
diff --git a/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/HandTest.kt b/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/HandTest.kt
index 6c25b34..dac2a58 100644
--- a/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/HandTest.kt
+++ b/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/HandTest.kt
@@ -29,8 +29,6 @@
 import androidx.xr.runtime.testing.FakeRuntimeAnchor
 import androidx.xr.runtime.testing.FakeRuntimeHand
 import com.google.common.truth.Truth.assertThat
-import java.nio.ByteBuffer
-import java.nio.ByteOrder
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.runBlocking
@@ -48,8 +46,6 @@
 @RunWith(AndroidJUnit4::class)
 class HandTest {
 
-    private val handJointBufferSize: Int = 728
-    private val tolerance = 1e-4f
     private lateinit var xrResourcesManager: XrResourcesManager
     private lateinit var testDispatcher: TestDispatcher
     private lateinit var testScope: TestScope
@@ -58,7 +54,7 @@
     @get:Rule
     val grantPermissionRule =
         GrantPermissionRule.grant(
-            "android.permission.SCENE_UNDERSTANDING_COARSE",
+            "android.permission.SCENE_UNDERSTANDING",
             "android.permission.HAND_TRACKING",
         )
 
@@ -81,34 +77,19 @@
             runTest(testDispatcher) {
                 val perceptionManager = session.runtime.perceptionManager as FakePerceptionManager
                 check(Hand.left(session) != null)
-                check(Hand.left(session)!!.state.value.trackingState != TrackingState.Tracking)
+                check(Hand.left(session)!!.state.value.isActive == false)
                 check(Hand.left(session)!!.state.value.handJoints.isEmpty())
 
                 val leftRuntimeHand = perceptionManager.leftHand!! as FakeRuntimeHand
-                leftRuntimeHand.trackingState = TrackingState.Tracking
-                val expectedHandJoints: Map<HandJointType, Pose> =
-                    HandJointType.values().associate { joint ->
-                        val i = joint.ordinal.toFloat()
-                        joint to
-                            Pose(
-                                Vector3(i + 0.5f, i + 0.6f, i + 0.7f),
-                                Quaternion(i + 0.1f, i + 0.2f, i + 0.3f, i + 0.4f),
-                            )
-                    }
-                leftRuntimeHand.handJointsBuffer = generateTestBuffer(expectedHandJoints)
+                val leftHandPose =
+                    Pose(Vector3(1.0f, 2.0f, 3.0f), Quaternion(1.0f, 2.0f, 3.0f, 4.0f))
+                leftRuntimeHand.isActive = true
+                leftRuntimeHand.handJoints = mapOf(HandJointType.PALM to leftHandPose)
                 awaitNewCoreState(session, testScope)
 
-                assertThat(Hand.left(session)!!.state.value.trackingState)
-                    .isEqualTo(TrackingState.Tracking)
-                for (jointType in HandJointType.values()) {
-                    val leftHandJoints = Hand.left(session)!!.state.value.handJoints
-                    assertThat(leftHandJoints[jointType]!!.translation)
-                        .isEqualTo(expectedHandJoints[jointType]!!.translation)
-                    assertRotationEquals(
-                        leftHandJoints[jointType]!!.rotation,
-                        expectedHandJoints[jointType]!!.rotation,
-                    )
-                }
+                assertThat(Hand.left(session)!!.state.value.isActive).isEqualTo(true)
+                assertThat(Hand.left(session)!!.state.value.handJoints)
+                    .containsEntry(HandJointType.PALM, leftHandPose)
             }
         }
 
@@ -118,34 +99,19 @@
             runTest(testDispatcher) {
                 val perceptionManager = session.runtime.perceptionManager as FakePerceptionManager
                 check(Hand.right(session) != null)
-                check(Hand.right(session)!!.state.value.trackingState != TrackingState.Tracking)
+                check(Hand.right(session)!!.state.value.isActive == false)
                 check(Hand.right(session)!!.state.value.handJoints.isEmpty())
 
                 val rightRuntimeHand = perceptionManager.rightHand!! as FakeRuntimeHand
-                rightRuntimeHand.trackingState = TrackingState.Tracking
-                val expectedHandJoints: Map<HandJointType, Pose> =
-                    HandJointType.values().associate { joint ->
-                        val i = joint.ordinal.toFloat()
-                        joint to
-                            Pose(
-                                Vector3(i + 0.5f, i + 0.6f, i + 0.7f),
-                                Quaternion(i + 0.1f, i + 0.2f, i + 0.3f, i + 0.4f),
-                            )
-                    }
-                rightRuntimeHand.handJointsBuffer = generateTestBuffer(expectedHandJoints)
+                val rightHandPose =
+                    Pose(Vector3(1.0f, 2.0f, 3.0f), Quaternion(1.0f, 2.0f, 3.0f, 4.0f))
+                rightRuntimeHand.isActive = true
+                rightRuntimeHand.handJoints = mapOf(HandJointType.PALM to rightHandPose)
                 awaitNewCoreState(session, testScope)
 
-                assertThat(Hand.right(session)!!.state.value.trackingState)
-                    .isEqualTo(TrackingState.Tracking)
-                for (jointType in HandJointType.values()) {
-                    val rightHandJoints = Hand.right(session)!!.state.value.handJoints
-                    assertThat(rightHandJoints[jointType]!!.translation)
-                        .isEqualTo(expectedHandJoints[jointType]!!.translation)
-                    assertRotationEquals(
-                        rightHandJoints[jointType]!!.rotation,
-                        expectedHandJoints[jointType]!!.rotation,
-                    )
-                }
+                assertThat(Hand.right(session)!!.state.value.isActive).isEqualTo(true)
+                assertThat(Hand.right(session)!!.state.value.handJoints)
+                    .containsEntry(HandJointType.PALM, rightHandPose)
             }
         }
 
@@ -153,32 +119,16 @@
     fun update_stateMachesRuntimeHand() = runBlocking {
         val runtimeHand = FakeRuntimeHand()
         val underTest = Hand(runtimeHand)
-        check(underTest.state.value.trackingState != TrackingState.Tracking)
+        check(underTest.state.value.isActive.equals(false))
         check(underTest.state.value.handJoints.isEmpty())
 
-        runtimeHand.trackingState = TrackingState.Tracking
-        val expectedHandJoints: Map<HandJointType, Pose> =
-            HandJointType.values().associate { joint ->
-                val i = joint.ordinal.toFloat()
-                joint to
-                    Pose(
-                        Vector3(i + 0.5f, i + 0.6f, i + 0.7f),
-                        Quaternion(i + 0.1f, i + 0.2f, i + 0.3f, i + 0.4f),
-                    )
-            }
-        runtimeHand.handJointsBuffer = generateTestBuffer(expectedHandJoints)
+        runtimeHand.isActive = true
+        val pose = Pose(Vector3(1.0f, 2.0f, 3.0f), Quaternion(1.0f, 2.0f, 3.0f, 4.0f))
+        runtimeHand.handJoints = mapOf(HandJointType.PALM to pose)
         underTest.update()
 
-        assertThat(underTest.state.value.trackingState).isEqualTo(TrackingState.Tracking)
-        for (jointType in HandJointType.values()) {
-            val handJoints = underTest.state.value.handJoints
-            assertThat(handJoints[jointType]!!.translation)
-                .isEqualTo(expectedHandJoints[jointType]!!.translation)
-            assertRotationEquals(
-                handJoints[jointType]!!.rotation,
-                expectedHandJoints[jointType]!!.rotation,
-            )
-        }
+        assertThat(underTest.state.value.isActive).isEqualTo(true)
+        assertThat(underTest.state.value.handJoints).containsEntry(HandJointType.PALM, pose)
     }
 
     private fun createTestSessionAndRunTest(
@@ -202,30 +152,4 @@
         testScope.advanceUntilIdle()
         session.pause()
     }
-
-    fun generateTestBuffer(handJoints: Map<HandJointType, Pose>): ByteBuffer {
-        val buffer = ByteBuffer.allocate(handJointBufferSize).order(ByteOrder.nativeOrder())
-
-        repeat(26) {
-            val handJointType = HandJointType.values()[it]
-            val handJointPose = handJoints[handJointType]!!
-            buffer.putFloat(handJointPose.rotation.x)
-            buffer.putFloat(handJointPose.rotation.y)
-            buffer.putFloat(handJointPose.rotation.z)
-            buffer.putFloat(handJointPose.rotation.w)
-            buffer.putFloat(handJointPose.translation.x)
-            buffer.putFloat(handJointPose.translation.y)
-            buffer.putFloat(handJointPose.translation.z)
-        }
-
-        buffer.flip()
-        return buffer
-    }
-
-    fun assertRotationEquals(actual: Quaternion, expected: Quaternion) {
-        assertThat(actual.x).isWithin(tolerance).of(expected.x)
-        assertThat(actual.y).isWithin(tolerance).of(expected.y)
-        assertThat(actual.z).isWithin(tolerance).of(expected.z)
-        assertThat(actual.w).isWithin(tolerance).of(expected.w)
-    }
 }
diff --git a/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/InteractionTest.kt b/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/InteractionTest.kt
index 333848c..22841e7 100644
--- a/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/InteractionTest.kt
+++ b/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/InteractionTest.kt
@@ -51,7 +51,7 @@
     @get:Rule
     val grantPermissionRule =
         GrantPermissionRule.grant(
-            "android.permission.SCENE_UNDERSTANDING_COARSE",
+            "android.permission.SCENE_UNDERSTANDING",
             "android.permission.HAND_TRACKING",
         )
 
diff --git a/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/PerceptionStateExtenderTest.kt b/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/PerceptionStateExtenderTest.kt
index 43bbdbc..29934fd 100644
--- a/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/PerceptionStateExtenderTest.kt
+++ b/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/PerceptionStateExtenderTest.kt
@@ -30,8 +30,6 @@
 import androidx.xr.runtime.testing.FakeRuntimeHand
 import androidx.xr.runtime.testing.FakeRuntimePlane
 import com.google.common.truth.Truth.assertThat
-import java.nio.ByteBuffer
-import java.nio.ByteOrder
 import kotlin.test.assertFailsWith
 import kotlin.time.Duration.Companion.milliseconds
 import kotlin.time.TestTimeSource
@@ -44,8 +42,6 @@
 @RunWith(AndroidJUnit4::class)
 class PerceptionStateExtenderTest {
 
-    private val handJointBufferSize: Int = 728
-    private val tolerance = 1e-4f
     private lateinit var fakeRuntime: FakeRuntime
     private lateinit var timeSource: TestTimeSource
     private lateinit var underTest: PerceptionStateExtender
@@ -143,59 +139,31 @@
         underTest.extend(coreState)
         check(coreState.perceptionState!!.leftHand != null)
         check(coreState.perceptionState!!.rightHand != null)
-        check(
-            coreState.perceptionState!!.leftHand!!.state.value.trackingState !=
-                TrackingState.Tracking
-        )
+        check(coreState.perceptionState!!.leftHand!!.state.value.isActive == false)
         check(coreState.perceptionState!!.leftHand!!.state.value.handJoints.isEmpty())
-        check(
-            coreState.perceptionState!!.rightHand!!.state.value.trackingState !=
-                TrackingState.Tracking
-        )
+        check(coreState.perceptionState!!.rightHand!!.state.value.isActive == false)
         check(coreState.perceptionState!!.rightHand!!.state.value.handJoints.isEmpty())
 
         // act
         timeSource += 10.milliseconds
-        val handJoints: Map<HandJointType, Pose> =
-            HandJointType.values().associate { joint ->
-                val i = joint.ordinal.toFloat()
-                joint to
-                    Pose(
-                        Vector3(i + 0.5f, i + 0.6f, i + 0.7f),
-                        Quaternion(i + 0.1f, i + 0.2f, i + 0.3f, i + 0.4f),
-                    )
-            }
-
         val leftRuntimeHand = fakeRuntime.perceptionManager.leftHand!! as FakeRuntimeHand
         val rightRuntimeHand = fakeRuntime.perceptionManager.rightHand!! as FakeRuntimeHand
-        leftRuntimeHand.trackingState = TrackingState.Tracking
-        leftRuntimeHand.handJointsBuffer = generateTestBuffer(handJoints)
-        rightRuntimeHand.trackingState = TrackingState.Tracking
-        rightRuntimeHand.handJointsBuffer = generateTestBuffer(handJoints)
+        val leftHandPose = Pose(Vector3(1.0f, 2.0f, 3.0f), Quaternion(1.0f, 2.0f, 3.0f, 4.0f))
+        val rightHandPose = Pose(Vector3(3.0f, 2.0f, 1.0f), Quaternion(4.0f, 3.0f, 2.0f, 1.0f))
+        leftRuntimeHand.isActive = true
+        leftRuntimeHand.handJoints = mapOf(HandJointType.PALM to leftHandPose)
+        rightRuntimeHand.isActive = true
+        rightRuntimeHand.handJoints = mapOf(HandJointType.PALM to rightHandPose)
         val coreState2 = CoreState(timeSource.markNow())
         underTest.extend(coreState2)
 
         // assert
-        assertThat(coreState2.perceptionState!!.leftHand!!.state.value.trackingState)
-            .isEqualTo(TrackingState.Tracking)
-        assertThat(coreState2.perceptionState!!.rightHand!!.state.value.trackingState)
-            .isEqualTo(TrackingState.Tracking)
-        for (jointType in HandJointType.values()) {
-            val leftHandJoints = coreState2.perceptionState!!.leftHand!!.state.value.handJoints
-            val rightHandJoints = coreState2.perceptionState!!.rightHand!!.state.value.handJoints
-            assertThat(leftHandJoints[jointType]!!.translation)
-                .isEqualTo(handJoints[jointType]!!.translation)
-            assertRotationEquals(
-                leftHandJoints[jointType]!!.rotation,
-                handJoints[jointType]!!.rotation
-            )
-            assertThat(rightHandJoints[jointType]!!.translation)
-                .isEqualTo(handJoints[jointType]!!.translation)
-            assertRotationEquals(
-                rightHandJoints[jointType]!!.rotation,
-                handJoints[jointType]!!.rotation
-            )
-        }
+        assertThat(coreState2.perceptionState!!.leftHand!!.state.value.isActive).isEqualTo(true)
+        assertThat(coreState2.perceptionState!!.leftHand!!.state.value.handJoints)
+            .containsEntry(HandJointType.PALM, leftHandPose)
+        assertThat(coreState2.perceptionState!!.rightHand!!.state.value.isActive).isEqualTo(true)
+        assertThat(coreState2.perceptionState!!.rightHand!!.state.value.handJoints)
+            .containsEntry(HandJointType.PALM, rightHandPose)
     }
 
     @Test
@@ -243,30 +211,4 @@
                 throw IllegalArgumentException("Unsupported trackable type: ${trackable.javaClass}")
         }
     }
-
-    fun generateTestBuffer(handJoints: Map<HandJointType, Pose>): ByteBuffer {
-        val buffer = ByteBuffer.allocate(handJointBufferSize).order(ByteOrder.nativeOrder())
-
-        repeat(26) {
-            val handJointType = HandJointType.values()[it]
-            val handJointPose = handJoints[handJointType]!!
-            buffer.putFloat(handJointPose.rotation.x)
-            buffer.putFloat(handJointPose.rotation.y)
-            buffer.putFloat(handJointPose.rotation.z)
-            buffer.putFloat(handJointPose.rotation.w)
-            buffer.putFloat(handJointPose.translation.x)
-            buffer.putFloat(handJointPose.translation.y)
-            buffer.putFloat(handJointPose.translation.z)
-        }
-
-        buffer.flip()
-        return buffer
-    }
-
-    fun assertRotationEquals(actual: Quaternion, expected: Quaternion) {
-        assertThat(actual.x).isWithin(tolerance).of(expected.x)
-        assertThat(actual.y).isWithin(tolerance).of(expected.y)
-        assertThat(actual.z).isWithin(tolerance).of(expected.z)
-        assertThat(actual.w).isWithin(tolerance).of(expected.w)
-    }
 }
diff --git a/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/PlaneTest.kt b/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/PlaneTest.kt
index 79392db..aa2bd8a 100644
--- a/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/PlaneTest.kt
+++ b/xr/arcore/arcore/src/test/kotlin/androidx/xr/arcore/PlaneTest.kt
@@ -59,7 +59,7 @@
     @get:Rule
     val grantPermissionRule =
         GrantPermissionRule.grant(
-            "android.permission.SCENE_UNDERSTANDING_COARSE",
+            "android.permission.SCENE_UNDERSTANDING",
             "android.permission.HAND_TRACKING",
         )
 
diff --git a/xr/arcore/integration-tests/whitebox/build.gradle b/xr/arcore/integration-tests/whitebox/build.gradle
index abb32e3..0791ab2 100644
--- a/xr/arcore/integration-tests/whitebox/build.gradle
+++ b/xr/arcore/integration-tests/whitebox/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 import androidx.build.KotlinTarget
 import androidx.build.SoftwareType
@@ -77,8 +76,6 @@
     implementation("androidx.compose.runtime:runtime:1.7.5")
     implementation("androidx.compose.ui:ui:1.7.5")
     implementation("androidx.lifecycle:lifecycle-runtime:2.8.7")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/common/SessionLifecycleHelper.kt b/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/common/SessionLifecycleHelper.kt
index aab4ed6..87d8402 100644
--- a/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/common/SessionLifecycleHelper.kt
+++ b/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/common/SessionLifecycleHelper.kt
@@ -22,6 +22,7 @@
 import androidx.activity.result.ActivityResultLauncher
 import androidx.activity.result.contract.ActivityResultContracts
 import androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions
+import androidx.activity.result.registerForActivityResult
 import androidx.lifecycle.DefaultLifecycleObserver
 import androidx.lifecycle.LifecycleOwner
 import androidx.xr.runtime.Session
@@ -34,17 +35,25 @@
  * Observer class to manage the lifecycle of the Jetpack XR Runtime Session based on the lifecycle
  * owner (activity).
  */
-class SessionLifecycleHelper(val activity: ComponentActivity) : DefaultLifecycleObserver {
+class SessionLifecycleHelper(
+    internal val onCreateCallback: (Session) -> Unit,
+    internal val onResumeCallback: (() -> Unit)? = null,
+    internal val beforePauseCallback: (() -> Unit)? = null,
+) : DefaultLifecycleObserver {
 
     internal lateinit var session: Session
-    private lateinit var requestPermissionLauncher: ActivityResultLauncher<Array<String>>
+    internal lateinit var requestPermissionLauncher: ActivityResultLauncher<Array<String>>
 
-    init {
-        registerRequestPermissionLauncher(activity)
+    override fun onCreate(owner: LifecycleOwner) {
+        // Sessions can only be instantiated with an instance of [ComponentActivity].
+        check(owner is ComponentActivity) { "owner is not an instance of ComponentActivity" }
 
-        when (val result = Session.create(activity)) {
+        registerRequestPermissionLauncher(owner)
+
+        when (val result = Session.create(owner)) {
             is SessionCreateSuccess -> {
                 session = result.session
+                onCreateCallback.invoke(session)
             }
             is SessionCreatePermissionsNotGranted -> {
                 requestPermissionLauncher.launch(result.permissions.toTypedArray())
@@ -57,7 +66,9 @@
             return
         }
         when (val result = session.resume()) {
-            is SessionResumeSuccess -> {}
+            is SessionResumeSuccess -> {
+                onResumeCallback?.invoke()
+            }
             is SessionResumePermissionsNotGranted -> {
                 requestPermissionLauncher.launch(result.permissions.toTypedArray())
             }
@@ -71,6 +82,7 @@
         if (!this::session.isInitialized) {
             return
         }
+        beforePauseCallback?.invoke()
         session.pause()
     }
 
@@ -101,11 +113,11 @@
             }
     }
 
-    companion object {
-        private val TAG = this::class.simpleName
-    }
-
     private fun <F> showErrorMessage(error: F) {
         Log.e(TAG, error.toString())
     }
+
+    companion object {
+        private val TAG = this::class.simpleName
+    }
 }
diff --git a/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/handtracking/HandTrackingActivity.kt b/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/handtracking/HandTrackingActivity.kt
index c4ef142..98890f8 100644
--- a/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/handtracking/HandTrackingActivity.kt
+++ b/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/handtracking/HandTrackingActivity.kt
@@ -16,6 +16,7 @@
 
 package androidx.xr.arcore.apps.whitebox.handtracking
 
+import android.app.Activity
 import android.os.Bundle
 import androidx.activity.ComponentActivity
 import androidx.activity.compose.setContent
@@ -26,26 +27,31 @@
 import androidx.compose.foundation.layout.padding
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.ViewCompositionStrategy
 import androidx.compose.ui.unit.dp
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.ViewModelStoreOwner
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
-import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.setViewTreeLifecycleOwner
+import androidx.lifecycle.setViewTreeViewModelStoreOwner
+import androidx.savedstate.SavedStateRegistryOwner
+import androidx.savedstate.setViewTreeSavedStateRegistryOwner
 import androidx.xr.arcore.Hand
-import androidx.xr.arcore.HandJointType
-import androidx.xr.arcore.TrackingState
 import androidx.xr.arcore.apps.whitebox.common.BackToMainActivityButton
 import androidx.xr.arcore.apps.whitebox.common.SessionLifecycleHelper
 import androidx.xr.runtime.Session
-import androidx.xr.scenecore.GltfModel
-import androidx.xr.scenecore.GltfModelEntity
+import androidx.xr.runtime.math.Pose
+import androidx.xr.runtime.math.Quaternion
+import androidx.xr.runtime.math.Vector3
+import androidx.xr.scenecore.Dimensions
+import androidx.xr.scenecore.PanelEntity
 import androidx.xr.scenecore.Session as JxrCoreSession
-import kotlinx.coroutines.guava.await
-import kotlinx.coroutines.launch
 
-/** Sample that demonstrates Hand Tracking API usage. */
+/** Sample that demonstrates fundamental ARCore for Android XR usage. */
 class HandTrackingActivity : ComponentActivity() {
 
     private lateinit var session: Session
@@ -57,73 +63,46 @@
         super.onCreate(savedInstanceState)
 
         // Create session and renderers.
-        sessionHelper = SessionLifecycleHelper(this)
-        session = sessionHelper.session
+        sessionHelper =
+            SessionLifecycleHelper(
+                onCreateCallback = {
+                    session = it
+                    jxrCoreSession = JxrCoreSession.create(this)
+                    setContent { MainPanel(session) }
+                    createHandPanel(session, isLeftHand = true)
+                    createHandPanel(session, isLeftHand = false)
+                }
+            )
         lifecycle.addObserver(sessionHelper)
-
-        jxrCoreSession = JxrCoreSession.create(this)
-        setContent { MainPanel(session) }
-        lifecycleScope.launch {
-            val xyzModel = GltfModel.create(jxrCoreSession, "models/xyzArrows.glb").await()
-
-            val leftHandJointEntityMap =
-                HandJointType.entries.associateWith {
-                    GltfModelEntity.create(jxrCoreSession, xyzModel).also {
-                        it.setScale(0.015f)
-                        it.setHidden(true)
-                    }
-                }
-
-            val rightHandJointEntityMap =
-                HandJointType.entries.associateWith {
-                    GltfModelEntity.create(jxrCoreSession, xyzModel).also {
-                        it.setScale(0.015f)
-                        it.setHidden(true)
-                    }
-                }
-
-            launch {
-                Hand.left(session)?.state?.collect { leftHandState ->
-                    renderHandGizmos(leftHandState, leftHandJointEntityMap)
-                }
-            }
-
-            launch {
-                Hand.right(session)?.state?.collect { rightHandState ->
-                    renderHandGizmos(rightHandState, rightHandJointEntityMap)
-                }
-            }
-        }
     }
 
-    private fun renderHandGizmos(
-        handState: Hand.State,
-        jointEntityMap: Map<HandJointType, GltfModelEntity>,
-    ) {
-        for ((jointType, gltfModelEntity) in jointEntityMap) {
-            if (handState.trackingState == TrackingState.Tracking) {
-                // According to the experiment, calling setHidden will significantly
-                // increase the latency. Thus, check the hidden state before calling
-                // setHidden.
-                if (gltfModelEntity.isHidden(false)) {
-                    gltfModelEntity.setHidden(false)
-                }
-                val transformedPose =
-                    jxrCoreSession.perceptionSpace.transformPoseTo(
-                        handState.handJoints[jointType]!!,
-                        jxrCoreSession.activitySpace,
-                    )
-                gltfModelEntity.setPose(transformedPose)
-            } else {
-                // According to the experiment, calling setHidden will significantly
-                // increase the latency. Thus, check the hidden state before calling
-                // setHidden.
-                if (gltfModelEntity.isHidden(false)) {
-                    return
-                }
-                gltfModelEntity.setHidden(true)
-            }
-        }
+    private fun createHandPanel(session: Session, isLeftHand: Boolean) {
+        val composeView = ComposeView(this)
+        configureComposeView(composeView, this)
+        val hand = if (isLeftHand) Hand.left(session) else Hand.right(session)
+        val title = if (isLeftHand) "Left Hand" else "Right Hand"
+        val position = if (isLeftHand) Vector3(-0.6f, 0f, 0.1f) else Vector3(0.6f, 0f, 0.1f)
+        val rotation = if (isLeftHand) Quaternion(0f, 0f, 0f, 1f) else Quaternion(0f, 0f, 0f, 1f)
+        val panelEntity =
+            PanelEntity.create(
+                jxrCoreSession,
+                composeView,
+                Dimensions(1000f, 700f),
+                Dimensions(1f, 1f, 1f),
+                title,
+                Pose(position, rotation),
+            )
+        panelEntity.setParent(jxrCoreSession.activitySpace)
+        composeView.setContent { HandTrackingPanel(hand!!, isLeftHand) }
+    }
+
+    private fun configureComposeView(composeView: ComposeView, activity: Activity) {
+        composeView.setViewCompositionStrategy(
+            ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
+        )
+        composeView.setViewTreeLifecycleOwner(activity as LifecycleOwner)
+        composeView.setViewTreeViewModelStoreOwner(activity as ViewModelStoreOwner)
+        composeView.setViewTreeSavedStateRegistryOwner(activity as SavedStateRegistryOwner)
     }
 }
 
@@ -146,10 +125,25 @@
         if (leftHand == null || rightHand == null) {
             Text("Hand module is not supported.")
         } else {
-            Text("Left hand tracking state: ${leftHand.state.collectAsState().value.trackingState}")
-            Text(
-                "Right hand tracking state: ${rightHand.state.collectAsState().value.trackingState}"
-            )
+            Text("Hand module is supported.")
+        }
+    }
+}
+
+@Composable
+private fun HandTrackingPanel(hand: Hand, isLeftHand: Boolean) {
+    val handState by hand.state.collectAsStateWithLifecycle()
+    val name = if (isLeftHand) "Left Hand" else "Right Hand"
+    Column(
+        modifier =
+            Modifier.background(color = Color.White)
+                .fillMaxWidth()
+                .fillMaxHeight()
+                .padding(horizontal = 30.dp)
+    ) {
+        Text("${name} isActive: ${handState.isActive}")
+        for ((jointType, pose) in handState.handJoints) {
+            Text("${name} joint ${jointType}: ${pose.translation}")
         }
     }
 }
diff --git a/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/helloar/HelloArActivity.kt b/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/helloar/HelloArActivity.kt
index 341584f..d8683a5 100644
--- a/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/helloar/HelloArActivity.kt
+++ b/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/helloar/HelloArActivity.kt
@@ -24,6 +24,7 @@
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -45,26 +46,39 @@
 
     private lateinit var jxrCoreSession: JxrCoreSession
 
-    private lateinit var planeRenderer: PlaneRenderer
-    private lateinit var anchorRenderer: AnchorRenderer
+    private var planeRenderer: PlaneRenderer? = null
+    private var anchorRenderer: AnchorRenderer? = null
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
         // Create session and renderers.
-        sessionHelper = SessionLifecycleHelper(this)
-        session = sessionHelper.session
+        sessionHelper =
+            SessionLifecycleHelper(
+                onCreateCallback = {
+                    session = it
+                    jxrCoreSession = JxrCoreSession.create(this)
+                    planeRenderer = PlaneRenderer(session, jxrCoreSession, lifecycleScope)
+                    anchorRenderer =
+                        AnchorRenderer(
+                            this,
+                            planeRenderer!!,
+                            session,
+                            jxrCoreSession,
+                            lifecycleScope
+                        )
+                    setContent { HelloWorld(session) }
+                },
+                onResumeCallback = {
+                    planeRenderer?.startRendering()
+                    anchorRenderer?.startRendering()
+                },
+                beforePauseCallback = {
+                    planeRenderer?.stopRendering()
+                    anchorRenderer?.stopRendering()
+                },
+            )
         lifecycle.addObserver(sessionHelper)
-
-        jxrCoreSession = JxrCoreSession.create(this)
-
-        planeRenderer = PlaneRenderer(session, jxrCoreSession, lifecycleScope)
-        anchorRenderer =
-            AnchorRenderer(this, planeRenderer, session, jxrCoreSession, lifecycleScope)
-        session.lifecycle.addObserver(planeRenderer)
-        session.lifecycle.addObserver(anchorRenderer)
-
-        setContent { HelloWorld(session) }
     }
 }
 
diff --git a/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/helloar/rendering/AnchorRenderer.kt b/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/helloar/rendering/AnchorRenderer.kt
index 58446d8..3259012 100644
--- a/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/helloar/rendering/AnchorRenderer.kt
+++ b/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/helloar/rendering/AnchorRenderer.kt
@@ -19,8 +19,6 @@
 import android.app.Activity
 import android.util.Log
 import android.widget.Toast
-import androidx.lifecycle.DefaultLifecycleObserver
-import androidx.lifecycle.LifecycleOwner
 import androidx.xr.arcore.Anchor
 import androidx.xr.arcore.AnchorCreateResourcesExhausted
 import androidx.xr.arcore.AnchorCreateSuccess
@@ -50,7 +48,7 @@
     val session: Session,
     val renderSession: JxrCoreSession,
     val coroutineScope: CoroutineScope,
-) : DefaultLifecycleObserver {
+) {
 
     private lateinit var gltfAnchorModel: GltfModel
 
@@ -58,7 +56,7 @@
 
     private lateinit var updateJob: CompletableJob
 
-    override fun onResume(owner: LifecycleOwner) {
+    internal fun startRendering() {
         updateJob =
             SupervisorJob(
                 coroutineScope.launch() {
@@ -69,7 +67,7 @@
             )
     }
 
-    override fun onPause(owner: LifecycleOwner) {
+    internal fun stopRendering() {
         updateJob.complete()
         clearRenderedAnchors()
     }
diff --git a/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/helloar/rendering/PlaneRenderer.kt b/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/helloar/rendering/PlaneRenderer.kt
index ca63173d..7b9b7f4 100644
--- a/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/helloar/rendering/PlaneRenderer.kt
+++ b/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/helloar/rendering/PlaneRenderer.kt
@@ -21,8 +21,6 @@
 import android.graphics.Color
 import android.view.View
 import android.widget.TextView
-import androidx.lifecycle.DefaultLifecycleObserver
-import androidx.lifecycle.LifecycleOwner
 import androidx.xr.arcore.Plane
 import androidx.xr.arcore.TrackingState
 import androidx.xr.runtime.Session
@@ -30,24 +28,25 @@
 import androidx.xr.runtime.math.Quaternion
 import androidx.xr.runtime.math.Vector2
 import androidx.xr.runtime.math.Vector3
+import androidx.xr.scenecore.Dimensions
 import androidx.xr.scenecore.PanelEntity
 import androidx.xr.scenecore.PixelDimensions
 import androidx.xr.scenecore.Session as JxrCoreSession
 import kotlinx.coroutines.CompletableJob
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.cancel
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.launch
 
 /** Class that keeps track of planes rendered as GLTF models in a SceneCore session. */
-@Suppress("DEPRECATION")
 internal class PlaneRenderer(
     val session: Session,
     val renderSession: JxrCoreSession,
     val coroutineScope: CoroutineScope,
-) : DefaultLifecycleObserver {
+) {
 
     private val _renderedPlanes: MutableStateFlow<List<PlaneModel>> =
         MutableStateFlow(mutableListOf<PlaneModel>())
@@ -55,14 +54,14 @@
 
     private lateinit var updateJob: CompletableJob
 
-    override fun onResume(owner: LifecycleOwner) {
+    internal fun startRendering() {
         updateJob =
             SupervisorJob(
                 coroutineScope.launch { Plane.subscribe(session).collect { updatePlaneModels(it) } }
             )
     }
 
-    override fun onPause(owner: LifecycleOwner) {
+    internal fun stopRendering() {
         updateJob.complete()
         _renderedPlanes.value = emptyList<PlaneModel>()
     }
@@ -136,7 +135,8 @@
         return PanelEntity.create(
             renderSession,
             view,
-            PixelDimensions(320, 320),
+            Dimensions(320f, 320f),
+            Dimensions(1f, 1f, 1f),
             plane.hashCode().toString(),
             plane.state.value.centerPose,
         )
diff --git a/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/persistentanchors/PersistentAnchorsActivity.kt b/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/persistentanchors/PersistentAnchorsActivity.kt
index b4b64fd..f948c91 100644
--- a/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/persistentanchors/PersistentAnchorsActivity.kt
+++ b/xr/arcore/integration-tests/whitebox/src/main/kotlin/androidx/xr/arcore/apps/whitebox/persistentanchors/PersistentAnchorsActivity.kt
@@ -27,30 +27,21 @@
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.fillMaxHeight
-import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.rememberScrollState
-import androidx.compose.foundation.verticalScroll
 import androidx.compose.material3.Button
-import androidx.compose.material3.Scaffold
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
-import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.ComposeView
 import androidx.compose.ui.platform.ViewCompositionStrategy
-import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
-import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.ViewModelStoreOwner
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
 import androidx.lifecycle.setViewTreeLifecycleOwner
 import androidx.lifecycle.setViewTreeViewModelStoreOwner
 import androidx.savedstate.SavedStateRegistryOwner
@@ -64,9 +55,9 @@
 import androidx.xr.runtime.math.Pose
 import androidx.xr.runtime.math.Vector3
 import androidx.xr.scenecore.AnchorEntity
+import androidx.xr.scenecore.Dimensions
 import androidx.xr.scenecore.Entity
 import androidx.xr.scenecore.PanelEntity
-import androidx.xr.scenecore.PixelDimensions
 import androidx.xr.scenecore.Session as JxrCoreSession
 import java.util.UUID
 import kotlin.collections.List
@@ -89,18 +80,17 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
-        sessionHelper = SessionLifecycleHelper(this)
-        session = sessionHelper.session
+        sessionHelper =
+            SessionLifecycleHelper(
+                onCreateCallback = {
+                    session = it
+                    jxrCoreSession = JxrCoreSession.create(this)
+                    createTargetPanel()
+                    setContent { MainPanel() }
+                },
+                onResumeCallback = { onResumeCallback() },
+            )
         lifecycle.addObserver(sessionHelper)
-
-        jxrCoreSession = JxrCoreSession.create(this)
-
-        createTargetPanel()
-        setContent { MainPanel() }
-
-        session.lifecycleScope.launch {
-            session.repeatOnLifecycle(Lifecycle.State.RESUMED) { onResumeCallback() }
-        }
     }
 
     private fun createTargetPanel() {
@@ -111,7 +101,8 @@
             PanelEntity.create(
                 jxrCoreSession,
                 composeView,
-                PixelDimensions(640, 640),
+                Dimensions(640f, 640f),
+                Dimensions(1f, 1f, 1f),
                 "movableEntity",
                 movableEntityOffset,
             )
@@ -149,52 +140,20 @@
     private fun MainPanel() {
         val uuidsState = uuids.collectAsStateWithLifecycle()
 
-        Scaffold(
-            modifier = Modifier.fillMaxSize(),
-            topBar = {
-                Row(
-                    modifier = Modifier.fillMaxWidth(),
-                    verticalAlignment = Alignment.CenterVertically
-                ) {
-                    BackToMainActivityButton()
-                    Text(
-                        modifier = Modifier.fillMaxWidth(),
-                        textAlign = TextAlign.Center,
-                        text = "Persistent Anchors",
-                        fontWeight = FontWeight.Bold,
-                        fontSize = 24.sp,
-                    )
-                }
-            },
-        ) { innerPadding ->
-            Column(
-                modifier =
-                    Modifier.background(color = Color.White)
-                        .fillMaxHeight()
-                        .fillMaxWidth()
-                        .padding(innerPadding)
-                        .verticalScroll(rememberScrollState())
-            ) {
-                for (uuid in uuidsState.value) {
-                    Row(
-                        modifier =
-                            Modifier.fillMaxWidth().padding(vertical = 15.dp, horizontal = 10.dp),
-                        verticalAlignment = Alignment.CenterVertically,
-                    ) {
-                        Text(text = "UUID: $uuid", fontSize = 24.sp, modifier = Modifier.weight(1f))
-                        Button(
-                            modifier = Modifier.padding(horizontal = 10.dp),
-                            onClick = { loadAnchor(uuid) },
-                        ) {
-                            Text("Load anchor")
-                        }
-                        Button(
-                            modifier = Modifier.padding(horizontal = 10.dp),
-                            onClick = { unpersistAnchor(uuid) },
-                        ) {
-                            Text("Unpersist anchor")
-                        }
-                    }
+        Column(
+            modifier =
+                Modifier.background(color = Color.White)
+                    .fillMaxHeight()
+                    .fillMaxWidth()
+                    .padding(horizontal = 20.dp)
+        ) {
+            BackToMainActivityButton()
+            Text(modifier = Modifier.padding(top = 20.dp), text = "Persisted anchors:")
+            for (uuid in uuidsState.value) {
+                Row(modifier = Modifier.fillMaxWidth().padding(vertical = 20.dp)) {
+                    Text(text = "UUID: $uuid", fontSize = 24.sp)
+                    Button(onClick = { loadAnchor(uuid) }) { Text("Load anchor") }
+                    Button(onClick = { unpersistAnchor(uuid) }) { Text("Unpersist anchor") }
                 }
             }
         }
@@ -244,7 +203,8 @@
             PanelEntity.create(
                 jxrCoreSession,
                 composeView,
-                PixelDimensions(640, 640),
+                Dimensions(640f, 640f),
+                Dimensions(1f, 1f, 1f),
                 "anchorEntity ${anchor.hashCode()}",
                 Pose(),
             )
diff --git a/xr/compose/compose-testing/api/restricted_current.txt b/xr/compose/compose-testing/api/restricted_current.txt
index 15567bd..4b0d43b 100644
--- a/xr/compose/compose-testing/api/restricted_current.txt
+++ b/xr/compose/compose-testing/api/restricted_current.txt
@@ -66,9 +66,9 @@
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class SubspaceTestingActivity extends androidx.activity.ComponentActivity {
     ctor public SubspaceTestingActivity();
-    method public com.android.extensions.xr.XrExtensions getExtensions();
+    method public androidx.xr.scenecore.testing.FakeXrExtensions getExtensions();
     method public androidx.xr.scenecore.Session getSession();
-    property public com.android.extensions.xr.XrExtensions extensions;
+    property public androidx.xr.scenecore.testing.FakeXrExtensions extensions;
     property public androidx.xr.scenecore.Session session;
   }
 
diff --git a/xr/compose/compose-testing/build.gradle b/xr/compose/compose-testing/build.gradle
index 3a1061b..408827a 100644
--- a/xr/compose/compose-testing/build.gradle
+++ b/xr/compose/compose-testing/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.SoftwareType
 import androidx.build.KotlinTarget
 
@@ -50,8 +49,6 @@
     implementation("androidx.compose.ui:ui-util:1.2.1")
     implementation("androidx.compose.ui:ui-test-junit4:1.2.1")
     implementation("com.google.ar:impress:0.0.3")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 android {
diff --git a/xr/compose/compose-testing/src/main/kotlin/androidx/xr/compose/testing/SubspaceTestingActivity.kt b/xr/compose/compose-testing/src/main/kotlin/androidx/xr/compose/testing/SubspaceTestingActivity.kt
index 75c34d6..f564fd9 100644
--- a/xr/compose/compose-testing/src/main/kotlin/androidx/xr/compose/testing/SubspaceTestingActivity.kt
+++ b/xr/compose/compose-testing/src/main/kotlin/androidx/xr/compose/testing/SubspaceTestingActivity.kt
@@ -28,11 +28,10 @@
 import androidx.xr.scenecore.JxrPlatformAdapter
 import androidx.xr.scenecore.Session
 import androidx.xr.scenecore.impl.JxrPlatformAdapterAxr
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary
 import androidx.xr.scenecore.testing.FakeImpressApi
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService
-import com.android.extensions.xr.XrExtensions
+import androidx.xr.scenecore.testing.FakeXrExtensions
 import com.google.androidxr.splitengine.SplitEngineSubspaceManager
 import com.google.ar.imp.view.splitengine.ImpSplitEngineRenderer
 import org.mockito.Mockito.mock
@@ -42,7 +41,7 @@
 @Suppress("ForbiddenSuperClass")
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class SubspaceTestingActivity : ComponentActivity() {
-    public val extensions: XrExtensions = XrExtensionsProvider.getXrExtensions()!!
+    public val extensions: FakeXrExtensions = FakeXrExtensions()
     public val session: Session by lazy { createFakeSession(this) }
 
     /** Throws an exception by default under test; return Robolectric Display impl instead. */
@@ -107,11 +106,7 @@
 /**
  * Create a fake [Session] for testing.
  *
- * A convenience method that creates a fake [Session] for testing. If runtime is not provided, a
- * fake [JxrPlatformAdapter] will be created by default.
- *
- * @param activity The [SubspaceTestingActivity] to use for the [Session].
- * @param runtime The [JxrPlatformAdapter] to use for the [Session].
+ * TODO(b/370856223) Update documentation to include params
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public fun createFakeSession(
@@ -122,9 +117,7 @@
 /**
  * Create a fake [JxrPlatformAdapter] for testing.
  *
- * A convenience method that creates a fake [JxrPlatformAdapter] for testing.
- *
- * @param activity The [SubspaceTestingActivity] to use for the [JxrPlatformAdapter].
+ * TODO(b/370856223) Update documentation to include params
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public fun createFakeRuntime(activity: SubspaceTestingActivity): JxrPlatformAdapter =
diff --git a/xr/compose/compose-testing/src/main/kotlin/androidx/xr/compose/testing/TestSetup.kt b/xr/compose/compose-testing/src/main/kotlin/androidx/xr/compose/testing/TestSetup.kt
index 3efe31b..41f87da 100644
--- a/xr/compose/compose-testing/src/main/kotlin/androidx/xr/compose/testing/TestSetup.kt
+++ b/xr/compose/compose-testing/src/main/kotlin/androidx/xr/compose/testing/TestSetup.kt
@@ -19,7 +19,6 @@
 import android.app.Activity
 import android.content.Context
 import android.content.ContextWrapper
-import android.view.View
 import androidx.annotation.RestrictTo
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
@@ -27,21 +26,18 @@
 import androidx.compose.ui.platform.LocalContext
 import androidx.xr.compose.platform.LocalHasXrSpatialFeature
 import androidx.xr.compose.platform.LocalSession
-import androidx.xr.runtime.math.Pose
 import androidx.xr.scenecore.JxrPlatformAdapter
 import androidx.xr.scenecore.Session
+import androidx.xr.scenecore.SpatialEnvironment
 import org.mockito.kotlin.any
 import org.mockito.kotlin.doAnswer
 import org.mockito.kotlin.doReturn
 import org.mockito.kotlin.mock
 
 /**
- * A Test environment composable wrapper to support testing elevated components locally.
+ * A Test environment composable wrapper to support testing elevated components locally
  *
- * @param isXrEnabled Whether to enable XR.
- * @param isFullSpace Whether to enable full space mode.
- * @param runtime The [JxrPlatformAdapter] to use for the [Session].
- * @param content The content block containing the compose content to be tested.
+ * TODO(b/370856223) Update documentation
  */
 @Composable
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@@ -107,16 +103,10 @@
                 {
                     throw UnsupportedOperationException()
                 }
-            on {
-                createPanelEntity(
-                    any<Context>(),
-                    any<Pose>(),
-                    any<View>(),
-                    any<JxrPlatformAdapter.PixelDimensions>(),
-                    any<String>(),
-                    any<JxrPlatformAdapter.Entity>(),
-                )
-            } doAnswer { throw UnsupportedOperationException() }
+            on { createPanelEntity(any(), any(), any(), any(), any(), any(), any()) } doAnswer
+                {
+                    throw UnsupportedOperationException()
+                }
             on { createLoggingEntity(any()) } doAnswer { throw UnsupportedOperationException() }
         },
     )
diff --git a/xr/compose/compose/api/restricted_current.txt b/xr/compose/compose/api/restricted_current.txt
index fb033e7..96633db 100644
--- a/xr/compose/compose/api/restricted_current.txt
+++ b/xr/compose/compose/api/restricted_current.txt
@@ -6,11 +6,6 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void setSubspaceContent(androidx.activity.ComponentActivity, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  public final class LocalCoreEntityKt {
-    property @kotlin.PublishedApi internal static androidx.compose.runtime.ProvidableCompositionLocal<androidx.xr.compose.subspace.layout.OpaqueEntity?> LocalOpaqueEntity;
-    field @kotlin.PublishedApi internal static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.xr.compose.subspace.layout.OpaqueEntity?> LocalOpaqueEntity;
-  }
-
   public final class LocalSessionKt {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.xr.scenecore.Session?> getLocalSession();
     property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.xr.scenecore.Session?> LocalSession;
@@ -31,6 +26,40 @@
     field public static final androidx.xr.compose.platform.SceneManager INSTANCE;
   }
 
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public fun interface SessionCallbackProvider {
+    method public operator androidx.xr.compose.platform.SessionCallbacks get(androidx.xr.scenecore.Session session);
+    field public static final androidx.xr.compose.platform.SessionCallbackProvider.Companion Companion;
+  }
+
+  public static final class SessionCallbackProvider.Companion {
+    method public androidx.xr.compose.platform.SessionCallbackProvider getDefault();
+    property public androidx.xr.compose.platform.SessionCallbackProvider default;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SessionCallbacks {
+    method public java.io.Closeable onBoundsChanged(kotlin.jvm.functions.Function1<? super androidx.xr.scenecore.Dimensions,kotlin.Unit> callback);
+    method public java.io.Closeable onFullSpaceMode(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method public java.io.Closeable onHomeSpaceMode(kotlin.jvm.functions.Function1<? super androidx.xr.scenecore.Dimensions,kotlin.Unit> callback);
+    method public java.io.Closeable onSpaceModeChanged(kotlin.jvm.functions.Function1<? super androidx.xr.compose.platform.SpaceMode,kotlin.Unit> callback);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @kotlin.jvm.JvmInline public final value class SpaceMode {
+    method public int getValue();
+    property public int value;
+    field public static final androidx.xr.compose.platform.SpaceMode.Companion Companion;
+  }
+
+  public static final class SpaceMode.Companion {
+    method public int getFull();
+    method public int getHome();
+    method public int getNotApplicable();
+    method public int getUnspecified();
+    property public int Full;
+    property public int Home;
+    property public int NotApplicable;
+    property public int Unspecified;
+  }
+
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SpatialCapabilities {
     method public boolean isAppEnvironmentEnabled();
     method public boolean isContent3dEnabled();
@@ -240,13 +269,8 @@
 
 package @RequiresApi(34) androidx.xr.compose.subspace {
 
-  public final class RememberCoreEntityKt {
-    method @kotlin.PublishedApi internal static String entityName(String name);
-    method @androidx.compose.runtime.Composable @kotlin.PublishedApi internal static androidx.xr.compose.subspace.layout.CoreContentlessEntity rememberCoreContentlessEntity(kotlin.jvm.functions.Function1<? super androidx.xr.scenecore.Session,? extends androidx.xr.scenecore.Entity> entityFactory);
-  }
-
   public final class SpatialBoxKt {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SpatialBox(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional androidx.xr.compose.subspace.layout.SpatialAlignment alignment, optional boolean propagateMinConstraints, kotlin.jvm.functions.Function1<? super androidx.xr.compose.subspace.SpatialBoxScope,kotlin.Unit> content);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SpatialBox(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional androidx.xr.compose.subspace.layout.SpatialAlignment alignment, optional boolean propagateMinConstraints, optional String name, kotlin.jvm.functions.Function1<? super androidx.xr.compose.subspace.SpatialBoxScope,kotlin.Unit> content);
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.foundation.layout.LayoutScopeMarker public interface SpatialBoxScope {
@@ -254,7 +278,7 @@
   }
 
   public final class SpatialColumnKt {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SpatialColumn(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional androidx.xr.compose.subspace.layout.SpatialAlignment alignment, kotlin.jvm.functions.Function1<? super androidx.xr.compose.subspace.SpatialColumnScope,kotlin.Unit> content);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SpatialColumn(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional androidx.xr.compose.subspace.layout.SpatialAlignment alignment, optional String name, kotlin.jvm.functions.Function1<? super androidx.xr.compose.subspace.SpatialColumnScope,kotlin.Unit> content);
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.foundation.layout.LayoutScopeMarker public interface SpatialColumnScope {
@@ -263,14 +287,9 @@
     method public androidx.xr.compose.subspace.layout.SubspaceModifier weight(androidx.xr.compose.subspace.layout.SubspaceModifier, @FloatRange(from=0.0, fromInclusive=false) float weight, optional boolean fill);
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class SpatialCurvedRowDefaults {
-    method public float getCurveRadius();
-    property public float curveRadius;
-    field public static final androidx.xr.compose.subspace.SpatialCurvedRowDefaults INSTANCE;
-  }
-
   public final class SpatialLayoutSpacerKt {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SpatialLayoutSpacer(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SpatialLayoutSpacer(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional String name);
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class SpatialPanelDefaults {
@@ -281,14 +300,13 @@
 
   public final class SpatialPanelKt {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void MainPanel(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional androidx.xr.compose.subspace.layout.SpatialShape shape);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SpatialPanel(android.content.Intent intent, optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional androidx.xr.compose.subspace.layout.SpatialShape shape);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SpatialPanel(android.view.View view, optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional androidx.xr.compose.subspace.layout.SpatialShape shape);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SpatialPanel(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional androidx.xr.compose.subspace.layout.SpatialShape shape, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SpatialPanel(android.content.Intent intent, optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional String name, optional androidx.xr.compose.subspace.layout.SpatialShape shape);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SpatialPanel(android.view.View view, optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional String name, optional androidx.xr.compose.subspace.layout.SpatialShape shape);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SpatialPanel(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional String name, optional androidx.xr.compose.subspace.layout.SpatialShape shape, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
   public final class SpatialRowKt {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SpatialCurvedRow(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional androidx.xr.compose.subspace.layout.SpatialAlignment alignment, optional float curveRadius, kotlin.jvm.functions.Function1<? super androidx.xr.compose.subspace.SpatialRowScope,kotlin.Unit> content);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SpatialRow(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional androidx.xr.compose.subspace.layout.SpatialAlignment alignment, kotlin.jvm.functions.Function1<? super androidx.xr.compose.subspace.SpatialRowScope,kotlin.Unit> content);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SpatialRow(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional androidx.xr.compose.subspace.layout.SpatialAlignment alignment, optional float curveRadius, optional String name, kotlin.jvm.functions.Function1<? super androidx.xr.compose.subspace.SpatialRowScope,kotlin.Unit> content);
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.foundation.layout.LayoutScopeMarker public interface SpatialRowScope {
@@ -301,7 +319,7 @@
   }
 
   public final class VolumeKt {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void Volume(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, kotlin.jvm.functions.Function1<? super androidx.xr.scenecore.Entity,kotlin.Unit> onVolumeEntity);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void Volume(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional String name, kotlin.jvm.functions.Function1<? super androidx.xr.scenecore.Entity,kotlin.Unit> onVolumeEntity);
   }
 
 }
@@ -316,26 +334,6 @@
     ctor public CombinedSubspaceModifier(androidx.xr.compose.subspace.layout.SubspaceModifier outer, androidx.xr.compose.subspace.layout.SubspaceModifier inner);
   }
 
-  @kotlin.PublishedApi internal final class CoreContentlessEntity extends androidx.xr.compose.subspace.layout.CoreEntity {
-    ctor public CoreContentlessEntity(androidx.xr.scenecore.Entity entity);
-  }
-
-  @kotlin.PublishedApi internal abstract sealed class CoreEntity implements androidx.xr.compose.subspace.layout.OpaqueEntity {
-    method public final boolean addComponent(androidx.xr.scenecore.Component component);
-    method public void dispose();
-    method public final androidx.xr.scenecore.Entity getEntity();
-    method protected final androidx.compose.runtime.MutableState<androidx.xr.compose.unit.IntVolumeSize> getMutableSize();
-    method public final androidx.xr.compose.subspace.layout.CoreEntity? getParent();
-    method public androidx.xr.compose.unit.IntVolumeSize getSize();
-    method public final void removeComponent(androidx.xr.scenecore.Component component);
-    method public final void setParent(androidx.xr.compose.subspace.layout.CoreEntity?);
-    method public void setSize(androidx.xr.compose.unit.IntVolumeSize);
-    property public final androidx.xr.scenecore.Entity entity;
-    property protected final androidx.compose.runtime.MutableState<androidx.xr.compose.unit.IntVolumeSize> mutableSize;
-    property public final androidx.xr.compose.subspace.layout.CoreEntity? parent;
-    property public androidx.xr.compose.unit.IntVolumeSize size;
-  }
-
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface Measurable {
     method public void adjustParams(androidx.xr.compose.subspace.layout.ParentLayoutParamsAdjustable params);
     method public androidx.xr.compose.subspace.layout.Placeable measure(androidx.xr.compose.unit.VolumeConstraints constraints);
@@ -371,9 +369,6 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.xr.compose.subspace.layout.SubspaceModifier onGloballyPositioned(androidx.xr.compose.subspace.layout.SubspaceModifier, kotlin.jvm.functions.Function1<? super androidx.xr.compose.subspace.layout.SubspaceLayoutCoordinates,kotlin.Unit> onGloballyPositioned);
   }
 
-  @kotlin.PublishedApi internal interface OpaqueEntity {
-  }
-
   public final class PaddingKt {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.xr.compose.subspace.layout.SubspaceModifier padding(androidx.xr.compose.subspace.layout.SubspaceModifier, float all);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.xr.compose.subspace.layout.SubspaceModifier padding(androidx.xr.compose.subspace.layout.SubspaceModifier, optional float horizontal, optional float vertical, optional float depth);
@@ -423,7 +418,7 @@
   }
 
   public final class ResizableKt {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.xr.compose.subspace.layout.SubspaceModifier resizable(androidx.xr.compose.subspace.layout.SubspaceModifier, optional boolean enabled, optional androidx.xr.compose.unit.DpVolumeSize minimumSize, optional androidx.xr.compose.unit.DpVolumeSize maximumSize, optional boolean maintainAspectRatio, optional kotlin.jvm.functions.Function1<? super androidx.xr.compose.unit.IntVolumeSize,java.lang.Boolean>? onSizeChange);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.xr.compose.subspace.layout.SubspaceModifier resizable(androidx.xr.compose.subspace.layout.SubspaceModifier, optional boolean enabled, optional androidx.xr.compose.unit.DpVolumeSize minimumSize, optional androidx.xr.compose.unit.DpVolumeSize maximumSize, optional boolean maintainAspectRatio, optional kotlin.jvm.functions.Function1<? super androidx.xr.compose.unit.IntVolumeSize,java.lang.Boolean> onSizeChange);
   }
 
   public final class RotateKt {
@@ -612,8 +607,9 @@
   }
 
   public final class SubspaceLayoutKt {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static inline void SubspaceLayout(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, androidx.xr.compose.subspace.layout.MeasurePolicy measurePolicy);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static inline void SubspaceLayout(kotlin.jvm.functions.Function0<kotlin.Unit> content, optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, androidx.xr.compose.subspace.layout.MeasurePolicy measurePolicy);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SubspaceLayout(optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional String name, androidx.xr.compose.subspace.layout.MeasurePolicy measurePolicy);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.compose.runtime.Composable @androidx.xr.compose.subspace.SubspaceComposable public static void SubspaceLayout(kotlin.jvm.functions.Function0<kotlin.Unit> content, optional androidx.xr.compose.subspace.layout.SubspaceModifier modifier, optional String name, androidx.xr.compose.subspace.layout.MeasurePolicy measurePolicy);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String defaultSubspaceLayoutName();
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SubspaceModifier {
@@ -660,35 +656,6 @@
 
 package @RequiresApi(34) androidx.xr.compose.subspace.node {
 
-  @kotlin.PublishedApi internal interface ComposeSubspaceNode {
-    method public androidx.compose.runtime.CompositionLocalMap getCompositionLocalMap();
-    method public androidx.xr.compose.subspace.layout.CoreEntity? getCoreEntity();
-    method public androidx.xr.compose.subspace.layout.MeasurePolicy getMeasurePolicy();
-    method public androidx.xr.compose.subspace.layout.SubspaceModifier getModifier();
-    method public void setCompositionLocalMap(androidx.compose.runtime.CompositionLocalMap);
-    method public void setCoreEntity(androidx.xr.compose.subspace.layout.CoreEntity?);
-    method public void setMeasurePolicy(androidx.xr.compose.subspace.layout.MeasurePolicy);
-    method public void setModifier(androidx.xr.compose.subspace.layout.SubspaceModifier);
-    property public abstract androidx.compose.runtime.CompositionLocalMap compositionLocalMap;
-    property public abstract androidx.xr.compose.subspace.layout.CoreEntity? coreEntity;
-    property public abstract androidx.xr.compose.subspace.layout.MeasurePolicy measurePolicy;
-    property public abstract androidx.xr.compose.subspace.layout.SubspaceModifier modifier;
-    field public static final androidx.xr.compose.subspace.node.ComposeSubspaceNode.Companion Companion;
-  }
-
-  public static final class ComposeSubspaceNode.Companion {
-    method public kotlin.jvm.functions.Function0<androidx.xr.compose.subspace.node.ComposeSubspaceNode> getConstructor();
-    method public kotlin.jvm.functions.Function2<androidx.xr.compose.subspace.node.ComposeSubspaceNode,androidx.compose.runtime.CompositionLocalMap,kotlin.Unit> getSetCompositionLocalMap();
-    method public kotlin.jvm.functions.Function2<androidx.xr.compose.subspace.node.ComposeSubspaceNode,androidx.xr.compose.subspace.layout.CoreEntity?,kotlin.Unit> getSetCoreEntity();
-    method public kotlin.jvm.functions.Function2<androidx.xr.compose.subspace.node.ComposeSubspaceNode,androidx.xr.compose.subspace.layout.MeasurePolicy,kotlin.Unit> getSetMeasurePolicy();
-    method public kotlin.jvm.functions.Function2<androidx.xr.compose.subspace.node.ComposeSubspaceNode,androidx.xr.compose.subspace.layout.SubspaceModifier,kotlin.Unit> getSetModifier();
-    property public kotlin.jvm.functions.Function0<androidx.xr.compose.subspace.node.ComposeSubspaceNode> Constructor;
-    property public kotlin.jvm.functions.Function2<androidx.xr.compose.subspace.node.ComposeSubspaceNode,androidx.compose.runtime.CompositionLocalMap,kotlin.Unit> SetCompositionLocalMap;
-    property public kotlin.jvm.functions.Function2<androidx.xr.compose.subspace.node.ComposeSubspaceNode,androidx.xr.compose.subspace.layout.CoreEntity?,kotlin.Unit> SetCoreEntity;
-    property public kotlin.jvm.functions.Function2<androidx.xr.compose.subspace.node.ComposeSubspaceNode,androidx.xr.compose.subspace.layout.MeasurePolicy,kotlin.Unit> SetMeasurePolicy;
-    property public kotlin.jvm.functions.Function2<androidx.xr.compose.subspace.node.ComposeSubspaceNode,androidx.xr.compose.subspace.layout.SubspaceModifier,kotlin.Unit> SetModifier;
-  }
-
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface CompositionLocalConsumerSubspaceModifierNode {
   }
 
diff --git a/xr/compose/compose/build.gradle b/xr/compose/compose/build.gradle
index 3ca1c27b6..28b0208 100644
--- a/xr/compose/compose/build.gradle
+++ b/xr/compose/compose/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.SoftwareType
 import androidx.build.KotlinTarget
 
@@ -41,7 +40,6 @@
     implementation("androidx.annotation:annotation:1.8.1")
     implementation("androidx.savedstate:savedstate:1.2.1")
     implementation("androidx.activity:activity:1.9.3")
-    implementation("androidx.activity:activity-compose:1.9.3")
     implementation("androidx.lifecycle:lifecycle-common:2.8.7")
     implementation("androidx.lifecycle:lifecycle-runtime:2.8.7")
 
@@ -63,10 +61,6 @@
     testImplementation("androidx.compose.ui:ui-test:1.7.5")
     testImplementation("androidx.compose.ui:ui-test-junit4:1.7.5")
     testImplementation(project(":xr:compose:compose-testing"))
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
-    testCompileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
-    testImplementation(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.host.test.jar")))
 }
 
 android {
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/Activity.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/Activity.kt
index 62bfd3c..266e2e5 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/Activity.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/Activity.kt
@@ -80,6 +80,8 @@
             onDispose { session.mainPanelEntity.setHidden(false) }
         }
 
+        // TODO(b/354009078) Why does rendering content in full space mode break presubmits.
+
         // We need to emulate the composition locals that setContent provides
         CompositionLocalProvider(
             LocalConfiguration provides resources.configuration,
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/LocalCoreEntity.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/LocalCoreEntity.kt
index 4f64c1e..9dee625 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/LocalCoreEntity.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/LocalCoreEntity.kt
@@ -16,27 +16,12 @@
 
 package androidx.xr.compose.platform
 
-import androidx.compose.runtime.CompositionLocal
 import androidx.compose.runtime.ProvidableCompositionLocal
 import androidx.compose.runtime.compositionLocalOf
-import androidx.compose.runtime.compositionLocalWithComputedDefaultOf
 import androidx.xr.compose.subspace.layout.CoreEntity
-import androidx.xr.compose.subspace.layout.OpaqueEntity
-
-/**
- * A CompositionLocal that holds the current [OpaqueEntity] acting as the parent for any containing
- * composed UI.
- */
-@PublishedApi
-internal val LocalOpaqueEntity: ProvidableCompositionLocal<OpaqueEntity?> = compositionLocalOf {
-    null
-}
 
 /**
  * A CompositionLocal that holds the current [CoreEntity] acting as the parent for any containing
  * composed UI.
  */
-internal val LocalCoreEntity: CompositionLocal<CoreEntity?> =
-    compositionLocalWithComputedDefaultOf {
-        LocalOpaqueEntity.currentValue as CoreEntity?
-    }
+internal val LocalCoreEntity: ProvidableCompositionLocal<CoreEntity?> = compositionLocalOf { null }
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/LocalSession.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/LocalSession.kt
index 10a8071..6a64eff 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/LocalSession.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/LocalSession.kt
@@ -17,11 +17,9 @@
 package androidx.xr.compose.platform
 
 import androidx.annotation.RestrictTo
-import androidx.compose.runtime.Composable
 import androidx.compose.runtime.ProvidableCompositionLocal
 import androidx.compose.runtime.compositionLocalWithComputedDefaultOf
 import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.platform.LocalDensity
 import androidx.xr.compose.subspace.layout.CoreMainPanelEntity
 import androidx.xr.scenecore.Session
 
@@ -50,5 +48,4 @@
  * makes it so we don't have to worry about disposing the instance every time it is used.
  */
 internal val Session.coreMainPanelEntity: CoreMainPanelEntity
-    @Composable
-    get() = mainPanelEntityMap.getOrPut(this) { CoreMainPanelEntity(this, LocalDensity.current) }
+    get() = mainPanelEntityMap.getOrPut(this) { CoreMainPanelEntity(this) }
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/SceneManager.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/SceneManager.kt
index fac3213..98c081b 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/SceneManager.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/SceneManager.kt
@@ -23,9 +23,7 @@
 /**
  * Manager for all [SpatialComposeScene]s that are created when the [SceneManager] is running.
  *
- * Enables finding all semantic roots in a spatial scene graph. This is useful for testing libraries
- * as well as developer tooling to help semantically identify parts of the compose tree. It is not
- * intended to be used in individual apps.
+ * Enables finding all semantic roots in a spatial scene graph.
  */
 @Suppress("NotCloseable")
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/SessionCallbackProvider.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/SessionCallbackProvider.kt
new file mode 100644
index 0000000..1f91439
--- /dev/null
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/platform/SessionCallbackProvider.kt
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.xr.compose.platform
+
+import androidx.annotation.RestrictTo
+import androidx.xr.scenecore.Dimensions
+import androidx.xr.scenecore.Session
+import java.io.Closeable
+
+/** Provides a [SessionCallbacks] for the current Activity. */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public fun interface SessionCallbackProvider {
+    public operator fun get(session: Session): SessionCallbacks
+
+    public companion object {
+        public val default: SessionCallbackProvider =
+            object : SessionCallbackProvider {
+                val callbackMap = mutableMapOf<Session, SessionCallbacks>()
+
+                override fun get(session: Session): SessionCallbacks =
+                    callbackMap.computeIfAbsent(session, ::DefaultSessionCallbacks)
+            }
+    }
+}
+
+/** Class to store callback lambdas associated with the Session. */
+@Suppress("SingularCallback")
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public interface SessionCallbacks {
+    /**
+     * Register a [callback] to be triggered when the app goes into full space mode. It will be
+     * called immediately upon registration if the system is currently in full space mode and its
+     * state is known.
+     *
+     * @param callback the method that will be called when the application enters full space mode.
+     * @return a closeable to unregister the callback
+     */
+    public fun onFullSpaceMode(callback: () -> Unit): Closeable
+
+    /**
+     * Register a [callback] to be triggered when the app goes into home space mode. It will be
+     * called immediately upon registration if the system is currently in home space mode and its
+     * state is known.
+     *
+     * @param callback the method that will be called when the application enters home space mode.
+     *   It will be called with the current application bounds as its argument.
+     * @return a closeable to unregister the callback
+     */
+    public fun onHomeSpaceMode(callback: (Dimensions) -> Unit): Closeable
+
+    /**
+     * Register a [callback] to be triggered when the app changes space mode. It will be called
+     * immediately with the current state if that state is available.
+     *
+     * @param callback the method that will be called when the space mode changes. It will accept an
+     *   enum [SpaceMode] value indicating the current mode.
+     * @return a closeable to unregister the callback
+     */
+    public fun onSpaceModeChanged(callback: (spaceMode: SpaceMode) -> Unit): Closeable
+
+    /**
+     * Register a [callback] to be triggered when the bounds of the app change. It will be called
+     * immediately with the current state if that state is available.
+     *
+     * @param callback the method that will be called when the application bounds change. The
+     *   argument passed to the callback represents the current bounds of the application.
+     * @return a closeable to unregister the callback
+     */
+    public fun onBoundsChanged(callback: (Dimensions) -> Unit): Closeable
+}
+
+/**
+ * Represents immersion level capabilities of the current application environment.
+ *
+ * In XR environments, there are a few different modes that an application can run in:
+ * - Home Space Mode - the application can run side-by-side with other applications for
+ *   multitasking; however, spatialization (e.g. Orbiters, Panels, 3D objects, etc.) is not allowed.
+ * - Full Space Mode - the application is given the entire space and has access to spatialization.
+ *   It may render multiple panels and 3D objects.
+ */
+@JvmInline
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public value class SpaceMode private constructor(public val value: Int) {
+    public companion object {
+        /**
+         * Current space mode or capabilities unknown. Awaiting checks to complete to indicate the
+         * proper space mode.
+         */
+        public val Unspecified: SpaceMode = SpaceMode(0)
+
+        /**
+         * Space mode is not applicable to the current system. This indicates that the current
+         * system is not XR (e.g. Phone, Tablet, etc.)
+         */
+        public val NotApplicable: SpaceMode = SpaceMode(1)
+
+        /**
+         * The XR application is currently in Full Space Mode.
+         *
+         * In Full Space Mode, the application is given the entire space for its own content. It has
+         * access to spatialization and may render multiple panels and 3D objects.
+         */
+        public val Full: SpaceMode = SpaceMode(2)
+
+        /**
+         * The XR application is currently in Home Space Mode.
+         *
+         * In Home Space Mode, the application does not have access to spatialization. It may not
+         * render multiple panels, orbiters, or 3D objects. However, it may run side-by-side with
+         * other applications for multitasking.
+         */
+        public val Home: SpaceMode = SpaceMode(3)
+    }
+}
+
+private class DefaultSessionCallbacks(session: Session) : SessionCallbacks {
+    private var currentDimensions: Dimensions? = null
+    private val onBoundsChangeListeners: MutableList<(Dimensions) -> Unit> = mutableListOf()
+
+    init {
+        // TODO: b/370618645 - This uses a direct executor for the callbacks, to maintain consistent
+        // behavior for clients using Closeables returned by other methods in this class. We should
+        // reconsider this approach, see the linked bug for more details.
+        session.activitySpace.addBoundsChangedListener({ runnable -> runnable.run() }) {
+            onBoundsChangeListeners.forEach { callback -> callback.invoke(it) }
+            currentDimensions = it
+        }
+    }
+
+    override fun onFullSpaceMode(callback: () -> Unit): Closeable = add {
+        if (it.isFullSpace) {
+            callback()
+        }
+    }
+
+    override fun onHomeSpaceMode(callback: (Dimensions) -> Unit): Closeable = add {
+        if (!it.isFullSpace) {
+            callback(it)
+        }
+    }
+
+    override fun onSpaceModeChanged(callback: (SpaceMode) -> Unit): Closeable = add {
+        // Invoke the callback if the current full space state is not equal to the next full
+        // space state or if the current dimensions are the same object reference as the
+        // next dimensions (initial call when this callback is registered)
+        if (it.isFullSpace != currentDimensions?.isFullSpace || it === currentDimensions) {
+            callback(if (it.isFullSpace) SpaceMode.Full else SpaceMode.Home)
+        }
+    }
+
+    override fun onBoundsChanged(callback: (Dimensions) -> Unit): Closeable = add(callback)
+
+    private fun add(callback: (nextDimensions: Dimensions) -> Unit): Closeable {
+        if (currentDimensions != null) {
+            callback(currentDimensions!!)
+        }
+        onBoundsChangeListeners.add(callback)
+        return Closeable {
+
+            // Tests break if this line stays uncommented
+            onBoundsChangeListeners.remove(callback)
+        }
+    }
+}
+
+private val Dimensions.isFullSpace: Boolean
+    get() =
+        width == Float.POSITIVE_INFINITY &&
+            height == Float.POSITIVE_INFINITY &&
+            depth == Float.POSITIVE_INFINITY
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/ElevatedPanel.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/ElevatedPanel.kt
index 53960df..fce6f83 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/ElevatedPanel.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/ElevatedPanel.kt
@@ -35,23 +35,26 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.alpha
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalView
+import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.IntSize
 import androidx.xr.compose.platform.LocalCoreEntity
-import androidx.xr.compose.platform.LocalOpaqueEntity
 import androidx.xr.compose.platform.LocalSession
 import androidx.xr.compose.platform.coreMainPanelEntity
+import androidx.xr.compose.platform.disposableValueOf
+import androidx.xr.compose.platform.getValue
+import androidx.xr.compose.subspace.layout.CorePanelEntity
 import androidx.xr.compose.subspace.layout.SpatialRoundedCornerShape
 import androidx.xr.compose.subspace.layout.SpatialShape
 import androidx.xr.compose.subspace.rememberComposeView
-import androidx.xr.compose.subspace.rememberCorePanelEntity
 import androidx.xr.compose.unit.IntVolumeSize
 import androidx.xr.compose.unit.Meter
 import androidx.xr.compose.unit.Meter.Companion.meters
 import androidx.xr.runtime.math.Pose
 import androidx.xr.runtime.math.Vector3
+import androidx.xr.scenecore.Dimensions
 import androidx.xr.scenecore.PanelEntity
-import androidx.xr.scenecore.PixelDimensions
 
 internal object ElevatedPanelDefaults {
     /** Default shape for a Spatial Panel. */
@@ -114,19 +117,29 @@
 ) {
     val session = checkNotNull(LocalSession.current) { "session must be initialized" }
     val parentEntity = LocalCoreEntity.current ?: session.coreMainPanelEntity
+    val density = LocalDensity.current
     val view = rememberComposeView()
-    val panelEntity =
-        rememberCorePanelEntity(shape = shape) {
-            PanelEntity.create(
-                session = session,
-                view = view,
-                pixelDimensions = contentSize.run { PixelDimensions(width, height) },
-                name = "ElevatedPanel:${view.id}",
+    val meterSize = contentSize.toMeterSize(density)
+    val panelEntity by remember {
+        disposableValueOf(
+            CorePanelEntity(
+                session,
+                PanelEntity.create(
+                    session = session,
+                    view = view,
+                    surfaceDimensionsPx =
+                        contentSize.run { Dimensions(width.toFloat(), height.toFloat(), 0f) },
+                    dimensions = meterSize.toCoreMeterDimensions(),
+                    name = "ElevatedPanel:${view.id}",
+                ),
             )
+        ) {
+            it.dispose()
         }
+    }
 
     view.setContent {
-        CompositionLocalProvider(LocalOpaqueEntity provides panelEntity) {
+        CompositionLocalProvider(LocalCoreEntity provides panelEntity) {
             Box(Modifier.alpha(if (pose == null) 0.0f else 1.0f)) { content() }
         }
     }
@@ -142,6 +155,12 @@
         val height = contentSize.height
 
         panelEntity.size = IntVolumeSize(width = width, height = height, depth = 0)
+        if (shape is SpatialRoundedCornerShape) {
+            panelEntity.setCornerRadius(
+                shape.computeCornerRadius(width.toFloat(), height.toFloat(), density),
+                density,
+            )
+        }
     }
 
     LaunchedEffect(parentEntity) { panelEntity.entity.setParent(parentEntity.entity) }
@@ -165,5 +184,21 @@
     fun toVector3() = Vector3(x = x.toM(), y = y.toM(), z = z.toM())
 }
 
+/** Represents a 3D size using [Meter] units. */
+internal data class MeterSize(
+    public val width: Meter = 0.meters,
+    public val height: Meter = 0.meters,
+    public val depth: Meter = 0.meters,
+)
+
+private fun IntSize.toMeterSize(density: Density) =
+    MeterSize(
+        Meter.fromPixel(width.toFloat(), density),
+        Meter.fromPixel(height.toFloat(), density),
+        0.meters,
+    )
+
+private fun MeterSize.toCoreMeterDimensions() = Dimensions(width.toM(), height.toM(), depth.toM())
+
 internal val View.size
     get() = IntSize(width, height)
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/RememberCalculatePose.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/RememberCalculatePose.kt
index 62328fd..d159c06 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/RememberCalculatePose.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/RememberCalculatePose.kt
@@ -36,23 +36,13 @@
 ): Pose {
     val density = LocalDensity.current
     return remember(contentOffset, parentViewSize, contentSize, zDepth) {
-        calculatePose(contentOffset, parentViewSize, contentSize, density, zDepth)
+        val meterPosition =
+            contentOffset.toMeterPosition(parentViewSize, contentSize, density) +
+                MeterPosition(z = zDepth.meters)
+        Pose(translation = meterPosition.toVector3())
     }
 }
 
-internal fun calculatePose(
-    contentOffset: Offset,
-    parentViewSize: IntSize,
-    contentSize: IntSize,
-    density: Density,
-    zDepth: Float = 0f,
-): Pose {
-    val meterPosition =
-        contentOffset.toMeterPosition(parentViewSize, contentSize, density) +
-            MeterPosition(z = zDepth.meters)
-    return Pose(translation = meterPosition.toVector3())
-}
-
 /**
  * Resolves the coordinate systems between 2D app pixel space and 3D meter space. In 2d space, views
  * and composables are anchored at the top left corner; however, in 3D space they are anchored at
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/SpatialDialog.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/SpatialDialog.kt
index 41dde0c..8062693 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/SpatialDialog.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/SpatialDialog.kt
@@ -16,7 +16,6 @@
 
 package androidx.xr.compose.spatial
 
-import androidx.activity.compose.BackHandler
 import androidx.annotation.RestrictTo
 import androidx.compose.animation.core.FiniteAnimationSpec
 import androidx.compose.animation.core.animate
@@ -61,11 +60,8 @@
  *   outside of it. Defaults to `true`.
  * @property usePlatformDefaultWidth whether the dialog should use the platform's default width.
  *   Defaults to `true`. This is only used in non-spatial environments.
- * @property restingLevelAnimationSpec the animation specification for the depth offset of the app
- *   content as it animates away from the user towards its recessed resting level when a spatial
- *   dialog is shown. The same specification is used when the app content animates back towards the
- *   user to its original resting level when the dialog is dismissed. This is only used in spatial
- *   environments.
+ * @property restingLevelAnimationSpec the animation specification for the resting level of the
+ *   dialog as it animates towards or away from the user. This is only used in spatial environments.
  * @property spatialElevationLevel the elevation level of the dialog. Defaults to
  *   [SpatialElevationLevel.DialogDefault].
  * @see [SpatialDialog]
@@ -130,10 +126,9 @@
 /**
  * [SpatialDialog] is a dialog that is elevated above the activity.
  *
- * When spatial dialogs are displayed the existing app content is pushed back and the dialog appears
- * on top of the content at the base elevation level. When the dialog is dismissed the reverse
- * happens with the dialog going away and the app content elevating back into place towards the
- * user.
+ * When spatial dialogs are displayed the existing content is pushed back and the dialog elevates
+ * into place. When the dialog is dismissed the reverse happens with the dialog getting pushed back
+ * and the previous content elevating back into place.
  *
  * @param onDismissRequest a callback to be invoked when the dialog should be dismissed.
  * @param properties the dialog properties.
@@ -169,10 +164,7 @@
     // Start elevation at Level0 to prevent effects where the dialog flashes behind its parent.
     var spatialElevationLevel by remember { mutableStateOf(SpatialElevationLevel.Level0) }
     val dialogManager = LocalDialogManager.current
-    BackHandler {
-        // TODO(b/401028662) Investigate if we need the animation inside of this scope.
-        dialogManager.isSpatialDialogActive.value = false
-    }
+
     DisposableEffect(Unit) {
         scope.launch {
             animate(
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/SpatialElevation.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/SpatialElevation.kt
index 2d50f37..a0cf103 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/SpatialElevation.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/SpatialElevation.kt
@@ -16,7 +16,6 @@
 
 package androidx.xr.compose.spatial
 
-import android.util.Log
 import androidx.annotation.RestrictTo
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.BoxWithConstraints
@@ -47,7 +46,7 @@
  *
  * In non-spatial environments, the content is rendered normally without elevation.
  *
- * SpatialElevation does not support a [content] lambda that has a width or height of zero.
+ * Empty composables cannot be placed in a SpatialElevation. This includes Popups and Dialogs.
  *
  * @param spatialElevationLevel the desired elevation level for the panel in spatial environments.
  * @param content the composable content to be displayed within the elevated panel.
@@ -99,13 +98,9 @@
             Box(
                 Modifier.constrainTo(constraints)
                     .onSizeChanged {
-                        if (it.width <= bufferPaddingPx * 2 || it.height <= bufferPaddingPx * 2) {
-                            Log.w(
-                                "SpatialElevation",
-                                "Empty composables cannot be placed at a SpatialElevation. You may be trying" +
-                                    " to use a Popup or Dialog with a SpatialElevation, which is not supported.",
-                            )
-                            return@onSizeChanged
+                        check(it.width > bufferPaddingPx * 2 && it.height > bufferPaddingPx * 2) {
+                            "Empty composables cannot be placed at a SpatialElevation. You may be trying" +
+                                " to use a Popup or Dialog with a SpatialElevation, which is not supported."
                         }
                         contentSize = it
                     }
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/Subspace.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/Subspace.kt
index 7d189e5..ae9136a 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/Subspace.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/spatial/Subspace.kt
@@ -38,7 +38,6 @@
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.unit.IntSize
 import androidx.xr.compose.platform.LocalCoreEntity
@@ -179,19 +178,14 @@
     }
     var measuredSize by remember { mutableStateOf(IntVolumeSize.Zero) }
     var contentOffset by remember { mutableStateOf(Offset.Zero) }
-    val viewSize = LocalView.current.size
-    val density = LocalDensity.current
-
-    LaunchedEffect(measuredSize, contentOffset, viewSize, density) {
-        subspaceRootContainer.setPose(
-            calculatePose(
-                contentOffset,
-                viewSize,
-                measuredSize.run { IntSize(width, height) },
-                density
-            )
+    val pose =
+        rememberCalculatePose(
+            contentOffset,
+            LocalView.current.size,
+            measuredSize.run { IntSize(width, height) },
         )
-    }
+
+    LaunchedEffect(pose) { subspaceRootContainer.setPose(pose) }
 
     Layout(modifier = Modifier.onGloballyPositioned { contentOffset = it.positionInRoot() }) {
         _,
@@ -222,14 +216,6 @@
                     )
                 layout(measuredSize.width, measuredSize.height, measuredSize.depth) {
                     placeables.forEach { it.place(Pose.Identity) }
-                    subspaceRootContainer.setPose(
-                        calculatePose(
-                            contentOffset,
-                            viewSize,
-                            measuredSize.run { IntSize(width, height) },
-                            density,
-                        )
-                    )
                 }
             }
         }
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/RememberCoreEntity.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/RememberCoreEntity.kt
index e5b6888..0e1e104 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/RememberCoreEntity.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/RememberCoreEntity.kt
@@ -18,16 +18,12 @@
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisallowComposableCalls
-import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.remember
-import androidx.compose.ui.platform.LocalDensity
 import androidx.xr.compose.platform.LocalSession
 import androidx.xr.compose.platform.disposableValueOf
 import androidx.xr.compose.platform.getValue
 import androidx.xr.compose.subspace.layout.CoreContentlessEntity
-import androidx.xr.compose.subspace.layout.CoreMainPanelEntity
 import androidx.xr.compose.subspace.layout.CorePanelEntity
-import androidx.xr.compose.subspace.layout.SpatialShape
 import androidx.xr.scenecore.Entity
 import androidx.xr.scenecore.PanelEntity
 import androidx.xr.scenecore.Session
@@ -37,9 +33,8 @@
  * composition.
  */
 @Composable
-@PublishedApi
-internal fun rememberCoreContentlessEntity(
-    entityFactory: @DisallowComposableCalls Session.() -> Entity
+internal inline fun rememberCoreContentlessEntity(
+    crossinline entityFactory: @DisallowComposableCalls Session.() -> Entity
 ): CoreContentlessEntity {
     val session = checkNotNull(LocalSession.current) { "session must be initialized" }
     val coreEntity by remember {
@@ -52,50 +47,15 @@
 @Composable
 internal inline fun rememberCorePanelEntity(
     crossinline onCoreEntityCreated: @DisallowComposableCalls (CorePanelEntity) -> Unit = {},
-    shape: SpatialShape = SpatialPanelDefaults.shape,
     crossinline entityFactory: @DisallowComposableCalls Session.() -> PanelEntity,
 ): CorePanelEntity {
     val session = checkNotNull(LocalSession.current) { "session must be initialized" }
-    val density = LocalDensity.current
     val coreEntity by remember {
         disposableValueOf(
-            CorePanelEntity(session.entityFactory(), density)
-                .also { it.shape = shape }
-                .also(onCoreEntityCreated)
+            CorePanelEntity(session, session.entityFactory()).also(onCoreEntityCreated)
         ) {
             it.dispose()
         }
     }
-    LaunchedEffect(shape) { coreEntity.shape = shape }
     return coreEntity
 }
-
-/**
- * Creates a [CoreMainPanelEntity] that is automatically disposed of when it leaves the composition.
- */
-@Composable
-internal fun rememberCoreMainPanelEntity(
-    shape: SpatialShape = SpatialPanelDefaults.shape
-): CoreMainPanelEntity {
-    val session = checkNotNull(LocalSession.current) { "session must be initialized" }
-    val density = LocalDensity.current
-    val coreEntity by remember {
-        disposableValueOf(CoreMainPanelEntity(session, density).also { it.shape = shape }) {
-            it.dispose()
-        }
-    }
-    LaunchedEffect(shape) { coreEntity.shape = shape }
-    return coreEntity
-}
-
-private var entityNamePart: Int = 0
-
-/**
- * Creates a unique debugging name for an [Entity].
- *
- * @param name A context-specific name for the [Entity].
- */
-@PublishedApi
-internal fun entityName(name: String): String {
-    return "$name-${entityNamePart++}"
-}
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialBox.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialBox.kt
index cc0eb13..a9605d13 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialBox.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialBox.kt
@@ -52,6 +52,7 @@
  * @param modifier The modifier to be applied to the layout.
  * @param alignment The default alignment of children within the [SpatialBox].
  * @param propagateMinConstraints Whether the incoming min constraints should be passed to content.
+ * @param name The name for the [SpatialBox].
  * @param content The content of the [SpatialBox].
  */
 @Composable
@@ -61,15 +62,23 @@
     modifier: SubspaceModifier = SubspaceModifier,
     alignment: SpatialAlignment = SpatialAlignment.Center,
     propagateMinConstraints: Boolean = false,
+    name: String = defaultSpatialBoxName(),
     content: @Composable @SubspaceComposable SpatialBoxScope.() -> Unit,
 ) {
     SubspaceLayout(
         modifier = modifier,
         content = { SpatialBoxScopeInstance.content() },
         measurePolicy = SpatialBoxMeasurePolicy(alignment, propagateMinConstraints),
+        name = name,
     )
 }
 
+private var spatialBoxNamePart: Int = 0
+
+private fun defaultSpatialBoxName(): String {
+    return "SpatialBox-${spatialBoxNamePart++}"
+}
+
 /** [MeasurePolicy] for [SpatialBox]. */
 internal class SpatialBoxMeasurePolicy(
     private val alignment: SpatialAlignment,
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialColumn.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialColumn.kt
index 0d433e1..e7f91e9 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialColumn.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialColumn.kt
@@ -34,6 +34,7 @@
  *
  * @param modifier Modifiers to apply to the layout.
  * @param alignment The default alignment for child elements within the column.
+ * @param name The name of the layout.
  * @param content The composable content to be laid out vertically.
  */
 @Composable
@@ -42,6 +43,7 @@
 public fun SpatialColumn(
     modifier: SubspaceModifier = SubspaceModifier,
     alignment: SpatialAlignment = SpatialAlignment.Center,
+    name: String = defaultSpatialColumnName(),
     content: @Composable @SubspaceComposable SpatialColumnScope.() -> Unit,
 ) {
     SubspaceLayout(
@@ -49,12 +51,9 @@
         content = { SpatialColumnScopeInstance.content() },
         coreEntity =
             rememberCoreContentlessEntity {
-                ContentlessEntity.create(
-                    this,
-                    name = entityName("SpatialColumn"),
-                    pose = Pose.Identity
-                )
+                ContentlessEntity.create(this, name = name, pose = Pose.Identity)
             },
+        name = name,
         measurePolicy =
             RowColumnMeasurePolicy(
                 orientation = LayoutOrientation.Vertical,
@@ -126,3 +125,9 @@
         return this then RowColumnAlignElement(depthSpatialAlignment = alignment)
     }
 }
+
+private var spatialColumnNamePart: Int = 0
+
+private fun defaultSpatialColumnName(): String {
+    return "SpatialColumn-${spatialColumnNamePart++}"
+}
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialLayoutSpacer.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialLayoutSpacer.kt
index de8a605..73f901c 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialLayoutSpacer.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialLayoutSpacer.kt
@@ -39,11 +39,29 @@
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public fun SpatialLayoutSpacer(modifier: SubspaceModifier = SubspaceModifier) {
     SubspaceLayout(
+        name = defaultSpatialLayoutSpacerName(),
         modifier = modifier,
         measurePolicy = SpacerMeasurePolicy,
     )
 }
 
+/**
+ * A composable that represents an empty space layout. Its size can be controlled using modifiers
+ * like [SubspaceModifier.width], [SubspaceModifier.height], etc.
+ *
+ * @param modifier Modifiers to apply to this spacer.
+ * @param name The name of this SpatialLayoutSpacer element.
+ */
+@Composable
+@SubspaceComposable
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public fun SpatialLayoutSpacer(
+    modifier: SubspaceModifier = SubspaceModifier,
+    name: String = defaultSpatialLayoutSpacerName(),
+) {
+    SubspaceLayout(name = name, modifier = modifier, measurePolicy = SpacerMeasurePolicy)
+}
+
 private object SpacerMeasurePolicy : MeasurePolicy {
     override fun MeasureScope.measure(
         measurables: List<Measurable>,
@@ -57,3 +75,9 @@
         }
     }
 }
+
+private var spatialLayoutSpacerNamePart: Int = 0
+
+private fun defaultSpatialLayoutSpacerName(): String {
+    return "Spacer-${spatialLayoutSpacerNamePart++}"
+}
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialPanel.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialPanel.kt
index 19be932..e72dfc4 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialPanel.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialPanel.kt
@@ -37,16 +37,17 @@
 import androidx.compose.ui.UiComposable
 import androidx.compose.ui.graphics.Color as UiColor
 import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
+import androidx.xr.compose.platform.LocalCoreEntity
 import androidx.xr.compose.platform.LocalDialogManager
-import androidx.xr.compose.platform.LocalOpaqueEntity
 import androidx.xr.compose.platform.LocalSession
-import androidx.xr.compose.subspace.layout.CoreBasePanelEntity
 import androidx.xr.compose.subspace.layout.CorePanelEntity
 import androidx.xr.compose.subspace.layout.SpatialRoundedCornerShape
 import androidx.xr.compose.subspace.layout.SpatialShape
 import androidx.xr.compose.subspace.layout.SubspaceLayout
 import androidx.xr.compose.subspace.layout.SubspaceModifier
+import androidx.xr.compose.unit.IntVolumeSize
 import androidx.xr.compose.unit.Meter.Companion.millimeters
 import androidx.xr.runtime.math.Pose
 import androidx.xr.runtime.math.Vector3
@@ -70,6 +71,7 @@
  *
  * @param view Content view to be displayed within the SpatialPanel.
  * @param modifier SubspaceModifiers to apply to the SpatialPanel.
+ * @param name A name for the SpatialPanel, useful for debugging.
  * @param shape The shape of this Spatial Panel.
  */
 @Composable
@@ -78,9 +80,10 @@
 public fun SpatialPanel(
     view: View,
     modifier: SubspaceModifier = SubspaceModifier,
+    name: String = defaultSpatialPanelName(),
     shape: SpatialShape = SpatialPanelDefaults.shape,
 ) {
-    SpatialPanel(modifier, view, shape) {}
+    SpatialPanel(modifier, name, view, shape) {}
 }
 
 /**
@@ -88,6 +91,7 @@
  * content.
  *
  * @param modifier SubspaceModifiers to apply to the SpatialPanel.
+ * @param name A name for the SpatialPanel, useful for debugging.
  * @param shape The shape of this Spatial Panel.
  * @param content The composable content to render within the SpatialPanel.
  */
@@ -96,6 +100,7 @@
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public fun SpatialPanel(
     modifier: SubspaceModifier = SubspaceModifier,
+    name: String = defaultSpatialPanelName(),
     shape: SpatialShape = SpatialPanelDefaults.shape,
     content: @Composable @UiComposable () -> Unit,
 ) {
@@ -103,12 +108,13 @@
 
     SpatialPanel(
         modifier = modifier,
+        name = name,
         view = composeView,
         shape = shape,
         onCorePanelEntityCreated = { corePanelEntity ->
             composeView.setContent {
                 CompositionLocalProvider(
-                    LocalOpaqueEntity provides corePanelEntity,
+                    LocalCoreEntity provides corePanelEntity,
                     content = content
                 )
             }
@@ -150,14 +156,20 @@
     modifier: SubspaceModifier = SubspaceModifier,
     shape: SpatialShape = SpatialPanelDefaults.shape,
 ) {
-    val mainPanel = rememberCoreMainPanelEntity(shape = shape)
+    val session = checkNotNull(LocalSession.current) { "session must be initialized" }
 
     DisposableEffect(Unit) {
-        mainPanel.hidden = false
-        onDispose { mainPanel.hidden = true }
+        session.mainPanelEntity.setHidden(false)
+        onDispose { session.mainPanelEntity.setHidden(true) }
     }
 
-    LayoutPanelEntity(mainPanel, modifier)
+    LayoutPanelEntity(
+        // Do not use rememberCorePanelEntity since we do not want to dispose the main panel entity.
+        remember { CorePanelEntity(session, session.mainPanelEntity) },
+        "MainPanel",
+        shape,
+        modifier,
+    )
 }
 
 /**
@@ -175,6 +187,7 @@
  *
  * @param intent The intent of an Activity to launch within this panel.
  * @param modifier SubspaceModifiers to apply to the SpatialPanel.
+ * @param name A name for the SpatialPanel, useful for debugging.
  * @param shape The shape of this Spatial Panel.
  */
 @Composable
@@ -183,6 +196,7 @@
 public fun SpatialPanel(
     intent: Intent,
     modifier: SubspaceModifier = SubspaceModifier,
+    name: String = "ActivityPanel-${intent.action}",
     shape: SpatialShape = SpatialPanelDefaults.shape,
 ) {
 
@@ -192,12 +206,11 @@
     val minimumPanelDimension = Dimensions(10f, 10f, 10f)
     val rect = Rect(0, 0, DEFAULT_SIZE_PX, DEFAULT_SIZE_PX)
     val activityPanelEntity = rememberCorePanelEntity {
-        ActivityPanelEntity.create(session, rect, entityName("ActivityPanel-${intent.action}"))
-            .also { it.launchActivity(intent) }
+        ActivityPanelEntity.create(session, rect, name).also { it.launchActivity(intent) }
     }
 
     SpatialBox {
-        LayoutPanelEntity(activityPanelEntity, modifier)
+        LayoutPanelEntity(activityPanelEntity, name, shape, modifier)
 
         if (dialogManager.isSpatialDialogActive.value) {
             val scrimView = rememberComposeView()
@@ -215,24 +228,35 @@
                 ) {}
             }
 
-            val scrimPanelEntity =
-                rememberCorePanelEntity(shape = shape) {
-                    PanelEntity.create(
-                            session = session,
-                            view = scrimView,
-                            dimensions = minimumPanelDimension,
-                            name = entityName("ScrimPanel"),
-                            pose = Pose.Identity,
-                        )
-                        .also {
-                            it.setParent(activityPanelEntity.entity)
-                            it.setPose(Pose(translation = Vector3(0f, 0f, 3.millimeters.toM())))
-                        }
-                }
+            val scrimPanelEntity = rememberCorePanelEntity {
+                PanelEntity.create(
+                        session = session,
+                        view = scrimView,
+                        surfaceDimensionsPx = minimumPanelDimension,
+                        dimensions = minimumPanelDimension,
+                        name = "scrim view",
+                        pose = Pose.Identity,
+                    )
+                    .also {
+                        it.setParent(activityPanelEntity.entity)
+                        it.setPose(Pose(translation = Vector3(0f, 0f, 3.millimeters.toM())))
+                    }
+            }
 
+            val density = LocalDensity.current
             LaunchedEffect(activityPanelEntity.size) {
                 val size = activityPanelEntity.size
                 scrimPanelEntity.size = size
+                if (shape is SpatialRoundedCornerShape) {
+                    scrimPanelEntity.setCornerRadius(
+                        shape.computeCornerRadius(
+                            size.width.toFloat(),
+                            size.height.toFloat(),
+                            density
+                        ),
+                        density,
+                    )
+                }
             }
         }
     }
@@ -242,6 +266,7 @@
  * Private [SpatialPanel] implementation that reports its created PanelEntity.
  *
  * @param modifier SubspaceModifiers.
+ * @param name A name for the SpatialPanel, useful for debugging.
  * @param view content view to render inside the SpatialPanel
  * @param shape The shape of this Spatial Panel.
  * @param onCorePanelEntityCreated callback to consume the [CorePanelEntity] when it is created
@@ -250,6 +275,7 @@
 @SubspaceComposable
 private fun SpatialPanel(
     modifier: SubspaceModifier,
+    name: String,
     view: View,
     shape: SpatialShape,
     onCorePanelEntityCreated: (CorePanelEntity) -> Unit,
@@ -267,12 +293,13 @@
     val scrim = remember { View(view.context) }
     val dialogManager = LocalDialogManager.current
     val corePanelEntity =
-        rememberCorePanelEntity(onCoreEntityCreated = onCorePanelEntityCreated, shape = shape) {
+        rememberCorePanelEntity(onCorePanelEntityCreated) {
             PanelEntity.create(
                 session = this,
                 view = frameLayout,
+                surfaceDimensionsPx = minimumPanelDimension,
                 dimensions = minimumPanelDimension,
-                name = entityName("SpatialPanel"),
+                name = name,
                 pose = Pose.Identity,
             )
         }
@@ -296,21 +323,63 @@
         }
     }
 
-    LayoutPanelEntity(corePanelEntity, modifier)
+    LayoutPanelEntity(corePanelEntity, name, shape, modifier)
 }
 
 /**
- * Lay out the SpatialPanel using the provided [CoreBasePanelEntity].
+ * Lay out the SpatialPanel using the provided [CorePanelEntity].
  *
- * @param coreEntity The [CoreBasePanelEntity] associated with this SpatialPanel.
+ * @param coreEntity The [CorePanelEntity] associated with this SpatialPanel. It should be based on
+ *   a SceneCore panel entity.
+ * @param name The name of the panel for debugging purposes.
+ * @param shape The shape of this Spatial Panel.
  * @param modifier The [SubspaceModifier] attached to this compose node.
  */
 @Composable
-private fun LayoutPanelEntity(coreEntity: CoreBasePanelEntity, modifier: SubspaceModifier) {
-    SubspaceLayout(modifier = modifier, coreEntity = coreEntity) { _, constraints ->
-        val width = DEFAULT_SIZE_PX.coerceIn(constraints.minWidth, constraints.maxWidth)
-        val height = DEFAULT_SIZE_PX.coerceIn(constraints.minHeight, constraints.maxHeight)
-        val depth = DEFAULT_SIZE_PX.coerceIn(constraints.minDepth, constraints.maxDepth)
-        layout(width, height, depth) {}
+private fun LayoutPanelEntity(
+    coreEntity: CorePanelEntity,
+    name: String,
+    shape: SpatialShape,
+    modifier: SubspaceModifier,
+) {
+    val density = LocalDensity.current
+    SubspaceLayout(modifier = modifier, name = name, coreEntity = coreEntity) {
+        measurables,
+        constraints ->
+        val initialWidth = DEFAULT_SIZE_PX.coerceIn(constraints.minWidth, constraints.maxWidth)
+        val initialHeight = DEFAULT_SIZE_PX.coerceIn(constraints.minHeight, constraints.maxHeight)
+        val initialDepth = DEFAULT_SIZE_PX.coerceIn(constraints.minDepth, constraints.maxDepth)
+
+        val placeables = measurables.map { it.measure(constraints) }
+
+        val maxSize =
+            placeables.fold(IntVolumeSize(initialWidth, initialHeight, initialDepth)) {
+                currentMax,
+                placeable ->
+                IntVolumeSize(
+                    width = maxOf(currentMax.width, placeable.measuredWidth),
+                    height = maxOf(currentMax.height, placeable.measuredHeight),
+                    depth = maxOf(currentMax.depth, placeable.measuredDepth),
+                )
+            }
+
+        val maxWidth = maxSize.width
+        val maxHeight = maxSize.height
+
+        if (shape is SpatialRoundedCornerShape) {
+            coreEntity.setCornerRadius(
+                shape.computeCornerRadius(maxWidth.toFloat(), maxHeight.toFloat(), density),
+                density,
+            )
+        }
+
+        // Reserve space in the original composition
+        layout(maxWidth, maxHeight, maxSize.depth) { placeables.forEach { it.place(Pose()) } }
     }
 }
+
+private var spatialPanelNamePart: Int = 0
+
+private fun defaultSpatialPanelName(): String {
+    return "Panel-${spatialPanelNamePart++}"
+}
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialRow.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialRow.kt
index 086fcad..445685f 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialRow.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/SpatialRow.kt
@@ -34,6 +34,12 @@
  *
  * @param modifier Appearance modifiers to apply to this Composable.
  * @param alignment The default alignment for child elements within the row.
+ * @param curveRadius The radial distance (in Dp) of the polar coordinate system of this row. It is
+ *   a positive value. Setting this value to Dp.Infinity or a non-positive value will flatten the
+ *   row. When a row is curved, its elements will be oriented so that they lie tangent to the curved
+ *   row. A typical curved row has a curve radius of 825.dp.
+ * @param name A string name to associated with the SpatialRow. This can be useful identifying the
+ *   SpatialRow when debugging spatial applications.
  * @param content The composable content to be laid out horizontally in the row.
  */
 @Composable
@@ -42,52 +48,8 @@
 public fun SpatialRow(
     modifier: SubspaceModifier = SubspaceModifier,
     alignment: SpatialAlignment = SpatialAlignment.Center,
-    content: @Composable @SubspaceComposable SpatialRowScope.() -> Unit,
-) {
-    SpatialRow(modifier, alignment, Dp.Infinity, content)
-}
-
-/**
- * A layout composable that arranges its children in a curved horizontal sequence.
- *
- * @param modifier Appearance modifiers to apply to this Composable.
- * @param alignment The default alignment for child elements within the row.
- * @param curveRadius The radial distance (in Dp) of the polar coordinate system of this row. It is
- *   a positive value. Setting this value to Dp.Infinity or a non-positive value will flatten the
- *   row. When a row is curved, its elements will be oriented so that they lie tangent to the curved
- *   row.
- * @param content The composable content to be laid out horizontally in the row.
- */
-@Composable
-@SubspaceComposable
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public fun SpatialCurvedRow(
-    modifier: SubspaceModifier = SubspaceModifier,
-    alignment: SpatialAlignment = SpatialAlignment.Center,
-    curveRadius: Dp = SpatialCurvedRowDefaults.curveRadius,
-    content: @Composable @SubspaceComposable SpatialRowScope.() -> Unit,
-) {
-    SpatialRow(modifier, alignment, curveRadius, content)
-}
-
-/**
- * A layout composable that arranges its children in a horizontal sequence. For arranging children
- * vertically, see [SpatialColumn].
- *
- * @param modifier Appearance modifiers to apply to this Composable.
- * @param alignment The default alignment for child elements within the row.
- * @param curveRadius The radial distance (in Dp) of the polar coordinate system of this row. It is
- *   a positive value. Setting this value to Dp.Infinity or a non-positive value will flatten the
- *   row. When a row is curved, its elements will be oriented so that they lie tangent to the curved
- *   row.
- * @param content The composable content to be laid out horizontally in the row.
- */
-@Composable
-@SubspaceComposable
-private fun SpatialRow(
-    modifier: SubspaceModifier,
-    alignment: SpatialAlignment,
-    curveRadius: Dp,
+    curveRadius: Dp = Dp.Infinity,
+    name: String = defaultSpatialRowName(),
     content: @Composable @SubspaceComposable SpatialRowScope.() -> Unit,
 ) {
     SubspaceLayout(
@@ -95,12 +57,9 @@
         content = { SpatialRowScopeInstance.content() },
         coreEntity =
             rememberCoreContentlessEntity {
-                ContentlessEntity.create(
-                    this,
-                    name = entityName("SpatialRow"),
-                    pose = Pose.Identity
-                )
+                ContentlessEntity.create(this, name = name, pose = Pose.Identity)
             },
+        name = name,
         measurePolicy =
             RowColumnMeasurePolicy(
                 orientation = LayoutOrientation.Horizontal,
@@ -153,13 +112,6 @@
     public fun SubspaceModifier.align(alignment: SpatialAlignment.Depth): SubspaceModifier
 }
 
-/** Contains the default values used by [SpatialCurvedRow]. */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public object SpatialCurvedRowDefaults {
-    /** Default curve radius used by [SpatialCurvedRow]. */
-    public val curveRadius: Dp = 825.dp
-}
-
 internal object SpatialRowScopeInstance : SpatialRowScope {
     override fun SubspaceModifier.weight(weight: Float, fill: Boolean): SubspaceModifier {
         require(weight > 0.0) { "invalid weight $weight; must be greater than zero" }
@@ -179,3 +131,9 @@
         return this then RowColumnAlignElement(depthSpatialAlignment = alignment)
     }
 }
+
+private var spatialRowNamePart: Int = 0
+
+private fun defaultSpatialRowName(): String {
+    return "SpatialRow-${spatialRowNamePart++}"
+}
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/Volume.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/Volume.kt
index a592d1a..13f6b6b 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/Volume.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/Volume.kt
@@ -20,6 +20,7 @@
 import androidx.compose.runtime.Composable
 import androidx.xr.compose.subspace.layout.SubspaceLayout
 import androidx.xr.compose.subspace.layout.SubspaceModifier
+import androidx.xr.compose.unit.IntVolumeSize
 import androidx.xr.runtime.math.Pose
 import androidx.xr.scenecore.ContentlessEntity
 import androidx.xr.scenecore.Entity
@@ -31,28 +32,56 @@
  * attach child Jetpack XR Entities to it.
  *
  * @param modifier SubspaceModifiers to apply to the Volume.
+ * @param name A name associated with this Volume entity, useful for debugging.
  * @param onVolumeEntity A lambda function that will be invoked when the [Entity] becomes available.
  */
 @Composable
 @SubspaceComposable
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public fun Volume(modifier: SubspaceModifier = SubspaceModifier, onVolumeEntity: (Entity) -> Unit) {
+public fun Volume(
+    modifier: SubspaceModifier = SubspaceModifier,
+    name: String = defaultVolumeName(),
+    onVolumeEntity: (Entity) -> Unit,
+) {
     val defaultWidthPx = 400
     val defaultHeightPx = 400
     val defaultDepthPx = 400
 
     SubspaceLayout(
         modifier = modifier,
+        name = name,
         coreEntity =
             rememberCoreContentlessEntity {
-                ContentlessEntity.create(this, name = entityName("Volume"), pose = Pose.Identity)
+                ContentlessEntity.create(this, name = name, pose = Pose.Identity)
                     .apply(onVolumeEntity)
             },
-    ) { _, constraints ->
+    ) { measurables, constraints ->
         val initialWidth = defaultWidthPx.coerceIn(constraints.minWidth, constraints.maxWidth)
         val initialHeight = defaultHeightPx.coerceIn(constraints.minHeight, constraints.maxHeight)
         val initialDepth = defaultDepthPx.coerceIn(constraints.minDepth, constraints.maxDepth)
 
-        layout(initialWidth, initialHeight, initialDepth) {}
+        val placeables = measurables.map { it.measure(constraints) }
+
+        val maxSize =
+            placeables.fold(IntVolumeSize(initialWidth, initialHeight, initialDepth)) {
+                currentMax,
+                placeable ->
+                IntVolumeSize(
+                    width = maxOf(currentMax.width, placeable.measuredWidth),
+                    height = maxOf(currentMax.height, placeable.measuredHeight),
+                    depth = maxOf(currentMax.depth, placeable.measuredDepth),
+                )
+            }
+
+        // Reserve space in the original composition
+        layout(maxSize.width, maxSize.height, maxSize.depth) {
+            placeables.forEach { it.place(Pose()) }
+        }
     }
 }
+
+private var volumeNamePart: Int = 0
+
+private fun defaultVolumeName(): String {
+    return "Volume-${volumeNamePart++}"
+}
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Alpha.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Alpha.kt
index 3f7750a..0b3a577 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Alpha.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Alpha.kt
@@ -56,8 +56,8 @@
     }
 }
 
-private class AlphaNode(var alpha: Float) : SubspaceModifier.Node(), CoreEntityNode {
-    override fun CoreEntityScope.modifyCoreEntity() {
-        setOrAppendAlpha(alpha)
+private class AlphaNode(public var alpha: Float) : SubspaceModifier.Node(), CoreEntityNode {
+    override fun modifyCoreEntity(coreEntity: CoreEntity) {
+        coreEntity.setAlpha(alpha)
     }
 }
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/CoreEntity.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/CoreEntity.kt
index 42514aa..04c4130 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/CoreEntity.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/CoreEntity.kt
@@ -16,43 +16,53 @@
 
 package androidx.xr.compose.subspace.layout
 
+import android.content.res.Resources
+import android.util.Log
 import android.view.View
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.unit.Density
-import androidx.xr.compose.subspace.SpatialPanelDefaults
+import androidx.xr.compose.subspace.node.SubspaceLayoutModifierNode
 import androidx.xr.compose.subspace.node.SubspaceLayoutNode
+import androidx.xr.compose.subspace.node.coordinator
 import androidx.xr.compose.unit.IntVolumeSize
 import androidx.xr.compose.unit.Meter
+import androidx.xr.compose.unit.toDimensionsInMeters
+import androidx.xr.compose.unit.toIntVolumeSize
 import androidx.xr.runtime.math.Pose
+import androidx.xr.runtime.math.Ray
 import androidx.xr.scenecore.BasePanelEntity
-import androidx.xr.scenecore.Component
 import androidx.xr.scenecore.ContentlessEntity
+import androidx.xr.scenecore.Dimensions
 import androidx.xr.scenecore.Entity
+import androidx.xr.scenecore.MovableComponent
+import androidx.xr.scenecore.MoveListener
 import androidx.xr.scenecore.PanelEntity
 import androidx.xr.scenecore.PixelDimensions
+import androidx.xr.scenecore.ResizableComponent
+import androidx.xr.scenecore.ResizeListener
 import androidx.xr.scenecore.Session
+import java.util.concurrent.Executor
+import java.util.concurrent.Executors
 
 /**
  * Wrapper class for Entities from SceneCore to provide convenience methods for working with
  * Entities from SceneCore.
  */
-@PublishedApi
-internal sealed class CoreEntity(public val entity: Entity) : OpaqueEntity {
+internal sealed class CoreEntity(public val entity: Entity) : SubspaceLayoutCoordinates {
 
-    internal var layout: SubspaceLayoutNode? = null
+    internal var movable: Movable? = null
+    internal var resizable: Resizable? = null
+
+    internal var layout: SubspaceLayoutNode.MeasurableLayout? = null
         set(value) {
             field = value
             updateEntityPose()
         }
 
-    private val density: Density
-        get() = layout?.density ?: error { "CoreEntity is not attached to a layout." }
-
     internal fun updateEntityPose() {
         // Compose XR uses pixels, SceneCore uses meters.
         val corePose =
-            layout?.measurableLayout?.poseInParentEntity?.convertPixelsToMeters(density)
-                ?: Pose.Identity
+            (layout?.poseInParentEntity ?: Pose.Identity).convertPixelsToMeters(DEFAULT_DENSITY)
         if (entity.getPose() != corePose) {
             entity.setPose(corePose)
         }
@@ -62,47 +72,62 @@
         entity.dispose()
     }
 
-    /**
-     * The backing value for the size of the [CoreEntity] in pixels. It uses a MutableState object
-     * so that recompositions can be triggered on size changes.
-     */
-    protected val mutableSize = mutableStateOf(IntVolumeSize.Zero)
+    override val pose: Pose
+        get() = movable?.userPose ?: Pose.Identity
 
-    /** The volume size of the [CoreEntity] in pixels. */
-    public open var size: IntVolumeSize
-        get() = mutableSize.value
+    override val poseInRoot: Pose
+        get() = pose.translate(sourcePoseInRoot.translation).rotate(sourcePoseInRoot.rotation)
+
+    private val sourcePoseInRoot: Pose
+        get() = coordinatesInRoot?.poseInRoot ?: Pose.Identity
+
+    private val coordinatesInRoot: SubspaceLayoutCoordinates?
+        get() =
+            layout
+                ?.tail
+                ?.traverseSelfThenAncestors()
+                ?.findInstance<SubspaceLayoutModifierNode>()
+                ?.coordinator ?: layout?.parentCoordinatesInRoot
+
+    override val poseInParentEntity: Pose
+        get() =
+            pose
+                .translate(sourcePoseInParentEntity.translation)
+                .rotate(sourcePoseInParentEntity.rotation)
+
+    private val sourcePoseInParentEntity: Pose
+        get() = coordinatesInParentEntity?.poseInParentEntity ?: Pose.Identity
+
+    private val coordinatesInParentEntity: SubspaceLayoutCoordinates?
+        get() =
+            layout
+                ?.tail
+                ?.traverseSelfThenAncestors()
+                ?.findInstance<SubspaceLayoutModifierNode>()
+                ?.coordinator ?: layout?.parentCoordinatesInParentEntity
+
+    protected val _size = mutableStateOf(IntVolumeSize.Zero)
+
+    override var size: IntVolumeSize
+        get() = _size.value
         set(value) {
-            if (mutableSize.value == value) {
+            val proposedSize = resizable?.userSize ?: value
+            if (_size.value == proposedSize) {
                 return
             }
-            mutableSize.value = value
+
+            setEntitySize(proposedSize)
+            _size.value = proposedSize
+
+            movable?.setComponentSize(proposedSize)
+            resizable?.setComponentSize(proposedSize)
         }
 
-    /**
-     * The scale of this entity relative to its parent. This value will affect the rendering of this
-     * Entity's children. As the scale increases, this will uniformly stretch the content of the
-     * Entity. This does not affect layout and other content will be laid out according to the
-     * original scale of the entity.
-     */
-    internal var scale = 1f
-        set(value) {
-            if (field != value) {
-                entity.setScale(value)
-            }
-            field = value
-        }
-
-    /**
-     * The opacity of this entity (and its children) as a value between [0..1]. An alpha value of
-     * 0.0f means fully transparent while the value of 1.0f means fully opaque.
-     */
-    internal var alpha = 1f
-        set(value) {
-            if (field != value) {
-                entity.setAlpha(value)
-            }
-            field = value
-        }
+    protected open fun setEntitySize(size: IntVolumeSize) {
+        entity.setSize(
+            Dimensions(size.width.toFloat(), size.height.toFloat(), size.depth.toFloat())
+        )
+    }
 
     public var parent: CoreEntity? = null
         set(value) {
@@ -126,27 +151,388 @@
         }
 
     /**
-     * Add a SceneCore [Component] to this entity.
-     *
-     * @param component The [Component] to add.
-     * @return true if the component was added successfully, false otherwise.
+     * The scale of this entity relative to its parent. This value will affect the rendering of this
+     * Entity's children. As the scale increases, this will uniformly stretch the content of the
+     * Entity. This does not affect layout and other content will be laid out according to the
+     * original scale of the entity.
      */
-    public fun addComponent(component: Component): Boolean {
-        return entity.addComponent(component)
-    }
+    public var scale: Float = 1.0F
+        set(value) {
+            field = value
+            entity.setScale(value * scaleFromMovement)
+        }
 
     /**
-     * Remove a SceneCore [Component] from this entity.
-     *
-     * @param component The [Component] to remove.
+     * The scale of this entity when it is moved. This value is only used to be multiplied by the
+     * scale of the entity, to preserve the original scale of the entity and determine the final
+     * scale of the entity.
      */
-    public fun removeComponent(component: Component) {
-        entity.removeComponent(component)
+    var scaleFromMovement: Float = 1.0F
+
+    /**
+     * Sets the opacity of this entity (and its children) to a value between [0..1]. An alpha value
+     * of 0.0f means fully transparent while the value of 1.0f means fully opaque.
+     *
+     * @param alpha The opacity of this entity.
+     */
+    public fun setAlpha(alpha: Float) {
+        entity.setAlpha(alpha)
+    }
+
+    public companion object {
+        protected val LocalExecutor: Executor = Executors.newSingleThreadExecutor()
+
+        // TODO(djeu): Figure out if there's a better way here where there is no context.
+        private val DEFAULT_DENSITY: Density =
+            Density(
+                density = Resources.getSystem().displayMetrics.density,
+                fontScale = Resources.getSystem().configuration.fontScale,
+            )
+    }
+
+    internal inner class Movable(private val session: Session) {
+        /**
+         * The node should be movable.
+         *
+         * Right now this only affects the initial attachment of the component to the Core entity;
+         * however, this may change to be more reactive.
+         *
+         * TODO(b/358678496): Revisit this now that Movable cannot by disabled, except via the
+         *   'enabled' bit in the Node.
+         */
+        public var isEnabled: Boolean = true
+        /** Pose based on user adjustments from MoveEvents from SceneCore. */
+        public var userPose: Pose? = null
+            set(value) {
+                field = value
+                updateEntityPose()
+            }
+
+        private var initialOffset: Pose = Pose.Identity
+
+        /** Sets the size of the SysUI movable affordance. */
+        public fun setComponentSize(size: IntVolumeSize) {
+            if (isAttached) {
+                component.size = size.toDimensionsInMeters(DEFAULT_DENSITY)
+            }
+        }
+
+        /** All Compose XR params for the Movable modifier for this CoreEntity. */
+        private var movableNode: MovableNode? = null
+
+        /** Whether the movableComponent is attached to the entity. */
+        private var isAttached: Boolean = false
+
+        private val component: MovableComponent by lazy {
+            // Here we create the component and pass in false to systemMovable since Compose is
+            // going to
+            // handle the move events.
+            MovableComponent.create(session, systemMovable = false)
+        }
+
+        /**
+         * Updates the movable state of this CoreEntity. Only update movable state if [Movable] is
+         * enabled.
+         *
+         * @param node The Movable modifier for this CoreEntity.
+         */
+        internal fun updateState(node: MovableNode?) {
+            if (!isEnabled) {
+                if (node != null && node.enabled) logEnabledCheck()
+                return
+            }
+
+            movableNode = node
+            if (node != null && node.enabled) {
+                enableComponent()
+            } else {
+                disableComponent()
+            }
+        }
+
+        /** Enables the MovableComponent for this CoreEntity. */
+        private fun enableComponent() {
+            if (!isAttached) {
+                check(entity.addComponent(component)) {
+                    "Could not add MovableComponent to Core Entity"
+                }
+                component.addMoveListener(
+                    LocalExecutor,
+                    object : MoveListener {
+                        override fun onMoveStart(
+                            entity: Entity,
+                            initialInputRay: Ray,
+                            initialPose: Pose,
+                            initialScale: Float,
+                            initialParent: Entity,
+                        ) {
+                            // updatePoseOnMove() not called because initialPose should be the same
+                            // as the current
+                            // pose.
+                            initialOffset = sourcePoseInParentEntity
+                        }
+
+                        override fun onMoveUpdate(
+                            entity: Entity,
+                            currentInputRay: Ray,
+                            currentPose: Pose,
+                            currentScale: Float,
+                        ) {
+                            updatePoseOnMove(
+                                currentPose,
+                                currentScale,
+                                entity.getSize().toIntVolumeSize(DEFAULT_DENSITY),
+                            )
+                        }
+
+                        override fun onMoveEnd(
+                            entity: Entity,
+                            finalInputRay: Ray,
+                            finalPose: Pose,
+                            finalScale: Float,
+                            updatedParent: Entity?,
+                        ) {
+                            updatePoseOnMove(
+                                finalPose,
+                                finalScale,
+                                entity.getSize().toIntVolumeSize(DEFAULT_DENSITY),
+                            )
+                            initialOffset = Pose.Identity
+                        }
+                    },
+                )
+                // Ensure size is correct, since we do not update the size
+                // when the component is detached.
+                setComponentSize(size)
+                isAttached = true
+            }
+
+            // If the MovableComponent gets more internal state, copy it over
+            // from the modifier node here.
+        }
+
+        /**
+         * Disables the MovableComponent for this CoreEntity. Takes care of life cycle tasks for the
+         * underlying component in SceneCore.
+         */
+        private fun disableComponent() {
+            if (isAttached) {
+                entity.removeComponent(component)
+                isAttached = false
+                if (movableNode?.stickyPose != true) {
+                    userPose = null
+                }
+            }
+        }
+
+        /** Called every time there is a MoveEvent in SceneCore, if this CoreEntity is movable. */
+        private fun updatePoseOnMove(pose: Pose, scaleWithDistance: Float, size: IntVolumeSize) {
+
+            if (movableNode?.enabled == false) {
+                return
+            }
+            val node = movableNode ?: return
+
+            // SceneCore uses meters, Compose XR uses pixels.
+            val corePose = pose.convertMetersToPixels(DEFAULT_DENSITY)
+
+            // Find the delta from when the move event started.
+            val coreDeltaPose =
+                Pose(
+                    corePose.translation - initialOffset.translation,
+                    initialOffset.rotation.inverse * corePose.rotation,
+                )
+
+            if (
+                node.onPoseChange?.invoke(PoseChangeEvent(corePose, scaleWithDistance, size)) ==
+                    true
+            ) {
+                // We're done, the user app will handle the event.
+                return
+            }
+            userPose = coreDeltaPose
+            if (movableNode?.scaleWithDistance!!) {
+                scaleFromMovement = scaleWithDistance
+                entity.setScale(scale * scaleFromMovement)
+            }
+        }
+
+        /** Flag to enforce single logging of Entity Component update error. */
+        private var shouldLogEnabledCheck: Boolean = true
+
+        /** Log enabled check error if first time occurring. */
+        private fun logEnabledCheck() {
+            if (shouldLogEnabledCheck) {
+                Log.i(
+                    "CoreEntity",
+                    "Not attempting to update Components, functionality is not enabled."
+                )
+                shouldLogEnabledCheck = false
+            }
+        }
+    }
+
+    internal inner class Resizable(private val session: Session) {
+        /**
+         * The node should be resizable.
+         *
+         * Right now this only affects the initial attachment of the component to the Core entity;
+         * however, this may change to be more reactive.
+         *
+         * TODO(b/358678496): Revisit this now that Resizable cannot by disabled, except via the
+         *   'enabled' bit in the Node.
+         */
+        public var isEnabled: Boolean = true
+
+        /** Size based on user adjustments from ResizeEvents from SceneCore. */
+        public var userSize: IntVolumeSize? = null
+            private set(value) {
+                field = value
+                if (value != null) {
+                    // The user size takes priority. Set the current size to the user provided size.
+                    size = value
+                }
+            }
+
+        /** Sets the size of the SysUI resizable affordance. */
+        public fun setComponentSize(size: IntVolumeSize) {
+            if (isAttached) {
+                component.size = size.toDimensionsInMeters(DEFAULT_DENSITY)
+            }
+        }
+
+        /** All Compose XR params for the Resizable modifier for this CoreEntity. */
+        private var resizableNode: ResizableNode? = null
+
+        /** Whether the resizableComponent is attached to the entity. */
+        private var isAttached: Boolean = false
+
+        /** Whether the resizableComponent should maintain the aspect ratio of the entity. */
+        private var maintainAspectRatio: Boolean = false
+
+        private val component: ResizableComponent by lazy {
+            ResizableComponent.create(session).apply {
+                addResizeListener(
+                    LocalExecutor,
+                    object : ResizeListener {
+                        override fun onResizeStart(entity: Entity, originalSize: Dimensions) {
+                            component.fixedAspectRatio =
+                                if (maintainAspectRatio) getAspectRatioY() else 0.0f
+                            resizeListener(originalSize)
+                        }
+
+                        // Compose does not need to handle the onResizeUpdate event since Core is
+                        // handling the
+                        // UI affordance change and adding the update would make it so we update the
+                        // size twice.
+                        override fun onResizeEnd(entity: Entity, finalSize: Dimensions) {
+                            resizeListener(finalSize)
+                        }
+                    },
+                )
+            }
+        }
+
+        /**
+         * Updates the resizable state of this CoreEntity. Only update resizable state if
+         * [Resizable] is enabled.
+         *
+         * @param node The Resizable modifier for this CoreEntity.
+         */
+        internal fun updateState(node: ResizableNode?) {
+            if (!isEnabled) {
+                if (node != null && node.enabled) logEnabledCheck()
+                return
+            }
+
+            resizableNode = node
+            if (node != null && node.enabled) {
+                enableAndUpdateComponent(node)
+            } else {
+                disableComponent()
+            }
+        }
+
+        /** Flag to enforce single logging of Entity Component update error. */
+        private var shouldLogEnabledCheck: Boolean = true
+
+        /** Log enabled check error if first time occurring. */
+        private fun logEnabledCheck() {
+            if (shouldLogEnabledCheck) {
+                Log.i(
+                    "CoreEntity",
+                    "Not attempting to update Components, entity type is not interactive."
+                )
+                shouldLogEnabledCheck = false
+            }
+        }
+
+        /**
+         * Enables the ResizableComponent for this CoreEntity. Also, updates the component using
+         * [node]'s values.
+         *
+         * @param node The Resizable modifier for this CoreEntity.
+         */
+        private fun enableAndUpdateComponent(node: ResizableNode) {
+            if (!isAttached) {
+                check(entity.addComponent(component)) {
+                    "Could not add ResizableComponent to Core Entity"
+                }
+                // Ensure size is correct, since we do not update the size
+                // when the component is detached.
+                setComponentSize(size)
+                isAttached = true
+            }
+
+            component.minimumSize = node.minimumSize.toDimensionsInMeters()
+            component.maximumSize = node.maximumSize.toDimensionsInMeters()
+
+            maintainAspectRatio = node.maintainAspectRatio
+        }
+
+        /** Returns 0.0f if the aspect ratio of x to y is not well defined. */
+        private fun getAspectRatioY(): Float {
+            if (size.width == 0 || size.height == 0) return 0.0f
+            return size.width.toFloat() / size.height.toFloat()
+        }
+
+        /**
+         * Disables the ResizableComponent for this CoreEntity. Takes care of life cycle tasks for
+         * the underlying component in SceneCore.
+         */
+        private fun disableComponent() {
+            if (isAttached) {
+                entity.removeComponent(component)
+                isAttached = false
+            }
+        }
+
+        /**
+         * Called every time there is an onResizeStart or onResizeEnd event in SceneCore, if this
+         * CoreEntity is resizable.
+         */
+        private fun resizeListener(newSize: Dimensions) {
+            val node = resizableNode ?: return
+            if (node.onSizeChange(newSize.toIntVolumeSize(DEFAULT_DENSITY))) {
+                // We're done, the user app will handle the event.
+                return
+            }
+            userSize = newSize.toIntVolumeSize(DEFAULT_DENSITY)
+        }
     }
 }
 
+/**
+ * A [CoreEntityNode] will apply itself to the entity in question as part of the [CoreEntity]'s
+ * application of modifiers. A [CoreEntityNode] should be applicable to all Entity types.
+ *
+ * TODO(b/374774812)
+ */
+internal interface CoreEntityNode {
+    public fun modifyCoreEntity(coreEntity: CoreEntity)
+}
+
 /** Wrapper class for contentless entities from SceneCore. */
-@PublishedApi
 internal class CoreContentlessEntity(entity: Entity) : CoreEntity(entity) {
     init {
         require(entity is ContentlessEntity) {
@@ -160,39 +546,37 @@
  * entities from SceneCore.
  */
 internal sealed class CoreBasePanelEntity(
+    session: Session,
     private val panelEntity: BasePanelEntity<*>,
-    private val density: Density,
-) : CoreEntity(panelEntity), MovableCoreEntity, ResizableCoreEntity {
-    override var overrideSize: IntVolumeSize? = null
+) : CoreEntity(panelEntity) {
 
-    override var size: IntVolumeSize
-        get() = super.size
-        set(value) {
-            val nextSize = overrideSize ?: value
-            if (super.size != nextSize) {
-                super.size = nextSize
-                panelEntity.setSizeInPixels(PixelDimensions(size.width, size.height))
-                updateShape()
-            }
-        }
+    init {
+        movable = Movable(session)
+        resizable = Resizable(session)
+    }
 
-    /** The [SpatialShape] of this [CoreBasePanelEntity]. */
-    public var shape: SpatialShape = SpatialPanelDefaults.shape
-        set(value) {
-            if (field != value) {
-                field = value
-                updateShape()
-            }
-        }
+    override fun setEntitySize(size: IntVolumeSize) {
+        panelEntity.setPixelDimensions(PixelDimensions(size.width, size.height))
+    }
 
-    /** Apply shape changes to the SceneCore [Entity]. */
-    private fun updateShape() {
-        val shape = shape
-        if (shape is SpatialRoundedCornerShape) {
-            val radius =
-                shape.computeCornerRadius(size.width.toFloat(), size.height.toFloat(), density)
-            panelEntity.setCornerRadius(Meter.fromPixel(radius, density).toM())
-        }
+    /**
+     * Sets a corner radius on all four corners of this PanelEntity.
+     *
+     * @param radius The radius of the corners, in pixels.
+     * @param density The panel pixel density.
+     * @throws IllegalArgumentException if radius is <= 0.0f.
+     */
+    internal fun setCornerRadius(radius: Float, density: Density) {
+        panelEntity.setCornerRadius(Meter.fromPixel(radius, density).value)
+    }
+
+    /**
+     * Returns the corner radius of this PanelEntity, in pixels.
+     *
+     * @param density The panel pixel density.
+     */
+    internal fun getCornerRadius(density: Density): Float {
+        return Meter(panelEntity.getCornerRadius()).toPx(density)
     }
 }
 
@@ -200,53 +584,28 @@
  * Wrapper class for [PanelEntity] to provide convenience methods for working with panel entities
  * from SceneCore.
  */
-internal class CorePanelEntity(entity: PanelEntity, density: Density) :
-    CoreBasePanelEntity(entity, density)
+internal class CorePanelEntity(session: Session, entity: PanelEntity) :
+    CoreBasePanelEntity(session, entity)
 
 /**
  * Wrapper class for [Session.mainPanelEntity] to provide convenience methods for working with the
  * main panel from SceneCore.
  */
-internal class CoreMainPanelEntity(session: Session, density: Density) :
-    CoreBasePanelEntity(session.mainPanelEntity, density) {
+internal class CoreMainPanelEntity(session: Session) :
+    CoreBasePanelEntity(session, session.mainPanelEntity) {
     private val mainView = session.activity.window.decorView
     private val listener =
         View.OnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
-            mutableSize.value =
-                session.mainPanelEntity.getSizeInPixels().run { IntVolumeSize(width, height, 0) }
+            _size.value =
+                session.mainPanelEntity.getPixelDimensions().run { IntVolumeSize(width, height, 0) }
         }
 
     init {
         mainView.addOnLayoutChangeListener(listener)
     }
 
-    /**
-     * Whether this entity or any of its ancestors is marked as hidden.
-     *
-     * Note that a non-hidden entity may still not be visible if its alpha is 0.
-     */
-    public var hidden
-        get() = entity.isHidden(includeParents = true)
-        set(value) {
-            entity.setHidden(value)
-        }
-
     override fun dispose() {
-        // Do not call super.dispose() because we don't want to dispose the main panel entity.
         mainView.removeOnLayoutChangeListener(listener)
+        super.dispose()
     }
 }
-
-/** [CoreEntity] types that implement this interface may have the ResizableComponent attached. */
-internal interface ResizableCoreEntity {
-    /**
-     * The size of the [CoreEntity] in pixels.
-     *
-     * This value is used to override the layout size of the [CoreEntity] when it is resizable. When
-     * this value is null, the layout size of the [CoreEntity] is used.
-     */
-    public var overrideSize: IntVolumeSize?
-}
-
-/** [CoreEntity] types that implement this interface may have the MovableComponent attached. */
-internal interface MovableCoreEntity
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/CoreEntityNode.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/CoreEntityNode.kt
deleted file mode 100644
index 76b0576..0000000
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/CoreEntityNode.kt
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.compose.subspace.layout
-
-import androidx.xr.compose.unit.IntVolumeSize
-
-/**
- * Interface for nodes that can modify a CoreEntity.
- *
- * Modifications are applied sequentially in the order nodes are applied, with each modification
- * combined according to the property's logic. For example, if two nodes modify scale, the resulting
- * scale will be the product of the individual scales. See the description of each property setter
- * for more details on the particular logic that is applied.
- */
-internal interface CoreEntityNode {
-    /**
-     * Called during the placement of the [CoreEntity] prior to when the size and position is
-     * finally set on the node.
-     */
-    public fun CoreEntityScope.modifyCoreEntity()
-}
-
-/**
- * Requests a relayout of the [CoreEntityNode] composition tree.
- *
- * This is used to request a relayout in stateful layout modifiers that are impacted by events that
- * don't trigger a recomposition. *Do not* call this from [CoreEntityNode.modifyCoreEntity] as
- * [modifyCoreEntity] is called during layout and [requestRelayout] will cause a relayout loop.
- */
-internal fun CoreEntityNode.requestRelayout() {
-    (this as SubspaceModifier.Node).layoutNode?.requestRelayout()
-}
-
-/**
- * The scope for modifying a CoreEntity. This gives access to specific changes that may be made to a
- * [CoreEntity] in the [CoreEntityNode.modifyCoreEntity] method.
- */
-internal interface CoreEntityScope {
-    /**
-     * Sets the scale of the [CoreEntity].
-     *
-     * If multiple [CoreEntityNode] modifiers set the scale, the final scale will be the product of
-     * all scales. Only the last call to [setOrAppendScale] from a particular [CoreEntityNode] will
-     * be applied.
-     *
-     * See [CoreEntity.scale] for more details on how scale is applied.
-     *
-     * @param scale The scale of the CoreEntity.
-     */
-    public fun setOrAppendScale(scale: Float)
-
-    /**
-     * Sets the alpha of the [CoreEntity].
-     *
-     * If multiple [CoreEntityNode] modifiers set the alpha, the final alpha will be the product of
-     * all alphas. Only the last call to [setOrAppendAlpha] from a particular [CoreEntityNode] will
-     * be applied.
-     *
-     * See [CoreEntity.alpha] for more details on how alpha is applied.
-     *
-     * @param alpha The alpha of the CoreEntity.
-     */
-    public fun setOrAppendAlpha(alpha: Float)
-
-    /**
-     * Sets the rendered size of the [CoreEntity] in pixels.
-     *
-     * Only the last [CoreEntityNode] in the chain that sets the size of the [CoreEntity] will take
-     * effect. This does not change the measured size of the composable content during layout, only
-     * the rendered size of the [CoreEntity]. This is similar to how [SubspaceModifier.scale] works.
-     *
-     * @param size The rendered size of the CoreEntity.
-     */
-    public fun setRenderedSize(size: IntVolumeSize)
-}
-
-private class CoreEntityAccumulator : CoreEntityScope {
-    var alpha: Float = 1f
-    var scale: Float = 1f
-    var size: IntVolumeSize? = null
-
-    override fun setOrAppendScale(scale: Float) {
-        this.scale = scale
-    }
-
-    override fun setOrAppendAlpha(alpha: Float) {
-        this.alpha = alpha
-    }
-
-    override fun setRenderedSize(size: IntVolumeSize) {
-        this.size = size
-    }
-
-    fun merge(next: CoreEntityAccumulator): CoreEntityAccumulator {
-        val result = CoreEntityAccumulator()
-        result.alpha = alpha * next.alpha
-        result.scale = scale * next.scale
-        result.size = next.size
-        return result
-    }
-
-    fun applyChanges(coreEntity: CoreEntity) {
-        coreEntity.scale = scale
-        coreEntity.alpha = alpha
-        if (coreEntity is ResizableCoreEntity) {
-            coreEntity.overrideSize = size
-        }
-    }
-}
-
-/**
- * Applies the [CoreEntityNode]s in the given chain to this [CoreEntity].
- *
- * @param nodes The chain containing the [CoreEntityNode]s to apply.
- */
-internal fun CoreEntity.applyCoreEntityNodes(nodes: Sequence<CoreEntityNode>) {
-    nodes.getAccumulator().applyChanges(this)
-}
-
-private fun Sequence<CoreEntityNode>.getAccumulator(): CoreEntityAccumulator =
-    fold(CoreEntityAccumulator()) { accumulator, node ->
-        accumulator.merge(with(node) { CoreEntityAccumulator().apply { modifyCoreEntity() } })
-    }
-
-/**
- * The CoreEntity that will be modified by the CoreEntityNode.
- *
- * This is only available if the CoreEntityNode is attached to a SubspaceLayoutNode, which happens
- * when the modifier is evaluated. This field cannot be used in the initialization of the
- * [CoreEntityNode].
- */
-internal val CoreEntityNode.coreEntity: CoreEntity
-    get() =
-        checkNotNull((this as? SubspaceModifier.Node)?.layoutNode?.coreEntity) {
-            "CoreEntityNode must be attached to a SubspaceLayoutNode to access the CoreEntity."
-        }
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Movable.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Movable.kt
index d2e7d26..1993364 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Movable.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Movable.kt
@@ -17,29 +17,9 @@
 package androidx.xr.compose.subspace.layout
 
 import androidx.annotation.RestrictTo
-import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.unit.Density
-import androidx.xr.compose.platform.LocalSession
-import androidx.xr.compose.subspace.node.CompositionLocalConsumerSubspaceModifierNode
-import androidx.xr.compose.subspace.node.LayoutCoordinatesAwareModifierNode
-import androidx.xr.compose.subspace.node.SubspaceLayoutModifierNode
 import androidx.xr.compose.subspace.node.SubspaceModifierNodeElement
-import androidx.xr.compose.subspace.node.currentValueOf
-import androidx.xr.compose.subspace.node.requestRelayout
 import androidx.xr.compose.unit.IntVolumeSize
-import androidx.xr.compose.unit.VolumeConstraints
-import androidx.xr.compose.unit.toDimensionsInMeters
-import androidx.xr.compose.unit.toIntVolumeSize
 import androidx.xr.runtime.math.Pose
-import androidx.xr.runtime.math.Ray
-import androidx.xr.scenecore.BasePanelEntity
-import androidx.xr.scenecore.Entity
-import androidx.xr.scenecore.MovableComponent
-import androidx.xr.scenecore.MoveListener
-import androidx.xr.scenecore.Session
-import java.util.concurrent.Executor
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.asExecutor
 
 /**
  * When the movable modifier is present and enabled, draggable UI controls will be shown that allow
@@ -161,179 +141,8 @@
     public var stickyPose: Boolean,
     public var scaleWithDistance: Boolean,
     public var onPoseChange: ((PoseChangeEvent) -> Boolean)?,
-) :
-    SubspaceModifier.Node(),
-    CompositionLocalConsumerSubspaceModifierNode,
-    CoreEntityNode,
-    LayoutCoordinatesAwareModifierNode,
-    MoveListener,
-    SubspaceLayoutModifierNode {
-
-    private inline val density: Density
-        get() = currentValueOf(LocalDensity)
-
-    private inline val session: Session
-        get() = checkNotNull(currentValueOf(LocalSession)) { "Movable requires a Session." }
-
-    /** The previous pose of this entity from the last MoveEvent. */
-    private var previousPose: Pose = Pose.Identity
-
-    /** Pose based on user adjustments from MoveEvents from SceneCore. */
-    private var userPose: Pose = Pose.Identity
-
-    /** The scale of this entity when it is moved. */
-    private var scaleFromMovement: Float = 1.0F
-
-    private var component: MovableComponent? = null
-
-    override fun CoreEntityScope.modifyCoreEntity() {
-        updateState()
-        setOrAppendScale(scaleFromMovement)
-    }
-
-    override fun onDetach() {
-        if (component != null) {
-            disableComponent()
-        }
-    }
-
-    override fun MeasureScope.measure(
-        measurable: Measurable,
-        constraints: VolumeConstraints,
-    ): MeasureResult {
-        val placeable = measurable.measure(constraints)
-        return layout(placeable.measuredWidth, placeable.measuredHeight, placeable.measuredDepth) {
-            placeable.place(userPose)
-        }
-    }
-
-    override fun onLayoutCoordinates(coordinates: SubspaceLayoutCoordinates) {
-        // Update the size of the component to match the final size of the layout.
-        component?.size = coordinates.size.toDimensionsInMeters(density)
-    }
-
-    /**
-     * Updates the movable state of the CoreEntity associated with this node. Only update movable
-     * state if [MovableNode] is [enabled] and the [CoreEntity] is a [MovableCoreEntity].
-     */
-    private fun updateState() {
-        if (enabled && component == null && coreEntity is MovableCoreEntity) {
-            enableComponent()
-        } else if (!enabled && component != null) {
-            disableComponent()
-        }
-    }
-
-    /** Enables the MovableComponent for this CoreEntity. */
-    private fun enableComponent() {
-        check(component == null) { "MovableComponent already enabled." }
-        component = MovableComponent.create(session, systemMovable = false)
-        check(component?.let { coreEntity.addComponent(it) } == true) {
-            "Could not add MovableComponent to Core Entity."
-        }
-        component?.addMoveListener(MainExecutor, this)
-    }
-
-    /**
-     * Disables the MovableComponent for this CoreEntity. Takes care of life cycle tasks for the
-     * underlying component in SceneCore.
-     */
-    private fun disableComponent() {
-        check(component != null) { "MovableComponent already disabled." }
-        component?.let { coreEntity.removeComponent(it) }
-        component = null
-        if (!stickyPose) {
-            userPose = Pose.Identity
-            requestRelayout()
-        }
-    }
-
-    override fun onMoveStart(
-        entity: Entity,
-        initialInputRay: Ray,
-        initialPose: Pose,
-        initialScale: Float,
-        initialParent: Entity,
-    ) {
-        // updatePoseOnMove() not called because there is no previous pose to compare to.
-        previousPose = initialPose
-    }
-
-    override fun onMoveUpdate(
-        entity: Entity,
-        currentInputRay: Ray,
-        currentPose: Pose,
-        currentScale: Float,
-    ) {
-        updatePoseOnMove(
-            previousPose,
-            currentPose,
-            currentScale,
-            when (entity) {
-                is BasePanelEntity<*> -> entity.getSize().toIntVolumeSize(density)
-                else -> IntVolumeSize.Zero
-            },
-        )
-        previousPose = currentPose
-    }
-
-    override fun onMoveEnd(
-        entity: Entity,
-        finalInputRay: Ray,
-        finalPose: Pose,
-        finalScale: Float,
-        updatedParent: Entity?,
-    ) {
-        updatePoseOnMove(
-            previousPose,
-            finalPose,
-            finalScale,
-            when (entity) {
-                is BasePanelEntity<*> -> entity.getSize().toIntVolumeSize(density)
-                else -> IntVolumeSize.Zero
-            },
-        )
-        previousPose = Pose.Identity
-    }
-
-    /** Called every time there is a MoveEvent in SceneCore, if this CoreEntity is movable. */
-    private fun updatePoseOnMove(
-        previousPose: Pose,
-        nextPose: Pose,
-        scale: Float,
-        size: IntVolumeSize,
-    ) {
-        if (!enabled) {
-            return
-        }
-
-        // SceneCore uses meters, Compose XR uses pixels.
-        val previousCorePose = previousPose.convertMetersToPixels(density)
-        val corePose = nextPose.convertMetersToPixels(density)
-
-        if (onPoseChange?.invoke(PoseChangeEvent(corePose, scale, size)) == true) {
-            // We're done, the user app will handle the event.
-            return
-        }
-
-        // Find the delta from the previous move event.
-        val coreDeltaPose =
-            Pose(
-                corePose.translation - previousCorePose.translation,
-                previousCorePose.rotation.inverse * corePose.rotation,
-            )
-        userPose =
-            Pose(
-                userPose.translation + coreDeltaPose.translation,
-                userPose.rotation * coreDeltaPose.rotation,
-            )
-        if (scaleWithDistance) {
-            scaleFromMovement = scale
-        }
-        requestRelayout()
-    }
-
-    public companion object {
-        private val MainExecutor: Executor = Dispatchers.Main.asExecutor()
+) : SubspaceModifier.Node(), CoreEntityNode {
+    override fun modifyCoreEntity(coreEntity: CoreEntity) {
+        coreEntity.movable?.updateState(this)
     }
 }
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/OpaqueEntity.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/OpaqueEntity.kt
deleted file mode 100644
index 3bc9da00..0000000
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/OpaqueEntity.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.compose.subspace.layout
-
-/**
- * An Entity is the underlying API that Compose XR emits and controls to render spatial content.
- * This opaque wrapper has been extracted to avoid exposing the underlying entity type where Entity
- * appears in the API. It is not expected to be used or manipulated outside Compose XR's subspace
- * module.
- */
-@PublishedApi internal interface OpaqueEntity
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Resizable.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Resizable.kt
index a6ecd15..e90882b 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Resizable.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Resizable.kt
@@ -17,26 +17,10 @@
 package androidx.xr.compose.subspace.layout
 
 import androidx.annotation.RestrictTo
-import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.Dp
-import androidx.xr.compose.platform.LocalSession
-import androidx.xr.compose.subspace.node.CompositionLocalConsumerSubspaceModifierNode
-import androidx.xr.compose.subspace.node.LayoutCoordinatesAwareModifierNode
 import androidx.xr.compose.subspace.node.SubspaceModifierNodeElement
-import androidx.xr.compose.subspace.node.currentValueOf
 import androidx.xr.compose.unit.DpVolumeSize
 import androidx.xr.compose.unit.IntVolumeSize
-import androidx.xr.compose.unit.toDimensionsInMeters
-import androidx.xr.compose.unit.toIntVolumeSize
-import androidx.xr.scenecore.Dimensions
-import androidx.xr.scenecore.Entity
-import androidx.xr.scenecore.ResizableComponent
-import androidx.xr.scenecore.ResizeListener
-import androidx.xr.scenecore.Session
-import java.util.concurrent.Executor
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.asExecutor
 
 /**
  * When the resizable modifier is present and enabled, draggable UI controls will be shown that
@@ -59,7 +43,7 @@
     minimumSize: DpVolumeSize = DpVolumeSize.Zero,
     maximumSize: DpVolumeSize = DpVolumeSize(Dp.Infinity, Dp.Infinity, Dp.Infinity),
     maintainAspectRatio: Boolean = false,
-    onSizeChange: ((IntVolumeSize) -> Boolean)? = null,
+    onSizeChange: (IntVolumeSize) -> Boolean = { false },
 ): SubspaceModifier =
     this.then(
         ResizableElement(enabled, minimumSize, maximumSize, maintainAspectRatio, onSizeChange)
@@ -70,7 +54,7 @@
     private val minimumSize: DpVolumeSize,
     private val maximumSize: DpVolumeSize,
     private val maintainAspectRatio: Boolean,
-    private val onSizeChange: ((IntVolumeSize) -> Boolean)?,
+    private val onSizeChange: (IntVolumeSize) -> Boolean,
 ) : SubspaceModifierNodeElement<ResizableNode>() {
 
     init {
@@ -123,119 +107,9 @@
     internal var minimumSize: DpVolumeSize,
     internal var maximumSize: DpVolumeSize,
     internal var maintainAspectRatio: Boolean,
-    internal var onSizeChange: ((IntVolumeSize) -> Boolean)?,
-) :
-    SubspaceModifier.Node(),
-    CompositionLocalConsumerSubspaceModifierNode,
-    CoreEntityNode,
-    LayoutCoordinatesAwareModifierNode,
-    ResizeListener {
-    private inline val density: Density
-        get() = currentValueOf(LocalDensity)
-
-    private inline val session: Session
-        get() = checkNotNull(currentValueOf(LocalSession)) { "Expected Session to be available." }
-
-    /** Size based on user adjustments from ResizeEvents from SceneCore. */
-    private var userSize: IntVolumeSize? = null
-
-    /** Whether the resizableComponent is attached to the entity. */
-    private var isComponentAttached: Boolean = false
-
-    private val component: ResizableComponent by lazy {
-        ResizableComponent.create(session).also { it.addResizeListener(MainExecutor, this) }
-    }
-
-    /** Updates the resizable state of this CoreEntity. Only update resizable state if [enabled]. */
-    private fun updateState() {
-        if (enabled && coreEntity is ResizableCoreEntity) {
-            enableAndUpdateComponent()
-        } else {
-            disableComponent()
-        }
-    }
-
-    /** Enables the ResizableComponent for this CoreEntity and updates its values. */
-    private fun enableAndUpdateComponent() {
-        if (!isComponentAttached) {
-            check(coreEntity.addComponent(component)) {
-                "Could not add ResizableComponent to Core Entity"
-            }
-            isComponentAttached = true
-        }
-
-        minimumSize.toDimensionsInMeters().let {
-            if (component.minimumSize != it) {
-                component.minimumSize = it
-            }
-        }
-        maximumSize.toDimensionsInMeters().let {
-            if (component.maximumSize != it) {
-                component.maximumSize = it
-            }
-        }
-    }
-
-    /** Returns 0.0f if the aspect ratio of x to y is not well defined. */
-    private fun getAspectRatioY(size: Dimensions): Float {
-        if (size.width == 0f || size.height == 0f) return 0.0f
-        return size.width / size.height
-    }
-
-    /**
-     * Disables the ResizableComponent for this CoreEntity. Takes care of life cycle tasks for the
-     * underlying component in SceneCore.
-     */
-    private fun disableComponent() {
-        if (isComponentAttached) {
-            coreEntity.removeComponent(component)
-            isComponentAttached = false
-            userSize = null
-            requestRelayout()
-        }
-    }
-
-    override fun onResizeStart(entity: Entity, originalSize: Dimensions) {
-        component.fixedAspectRatio =
-            if (maintainAspectRatio) getAspectRatioY(originalSize) else 0.0f
-    }
-
-    /**
-     * During a resize, the size of the entity does not change, only its reform window. We do not
-     * need to respond to every event, e.g., onResizeUpdate, like we do for Movable.
-     */
-    override fun onResizeEnd(entity: Entity, finalSize: Dimensions) {
-        resizeListener(finalSize)
-    }
-
-    /**
-     * Called every time there is an onResizeEnd event in SceneCore, if this CoreEntity is
-     * resizable.
-     */
-    private fun resizeListener(newSize: Dimensions) {
-        if (onSizeChange?.invoke(newSize.toIntVolumeSize(density)) == true) {
-            // We're done, the user app will handle the event.
-            return
-        }
-        userSize = newSize.toIntVolumeSize(density)
-        requestRelayout()
-    }
-
-    override fun CoreEntityScope.modifyCoreEntity() {
-        updateState()
-        userSize?.let { setRenderedSize(it) }
-    }
-
-    override fun onLayoutCoordinates(coordinates: SubspaceLayoutCoordinates) {
-        // Update the size of the component to match the final size of the layout.
-        component.size = coordinates.size.toDimensionsInMeters(density)
-    }
-
-    override fun onDetach() {
-        disableComponent()
-    }
-
-    private companion object {
-        val MainExecutor: Executor = Dispatchers.Main.asExecutor()
+    internal var onSizeChange: (IntVolumeSize) -> Boolean,
+) : SubspaceModifier.Node(), CoreEntityNode {
+    override fun modifyCoreEntity(coreEntity: CoreEntity) {
+        coreEntity.resizable?.updateState(this)
     }
 }
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Scale.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Scale.kt
index 6f549e1..e67de1b 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Scale.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Scale.kt
@@ -54,8 +54,8 @@
     }
 }
 
-private class ScaleNode(var scale: Float) : SubspaceModifier.Node(), CoreEntityNode {
-    override fun CoreEntityScope.modifyCoreEntity() {
-        setOrAppendScale(scale)
+private class ScaleNode(public var scale: Float) : SubspaceModifier.Node(), CoreEntityNode {
+    override fun modifyCoreEntity(coreEntity: CoreEntity) {
+        coreEntity.scale = scale
     }
 }
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Size.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Size.kt
index 520862d..66cd9e4 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Size.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/Size.kt
@@ -525,69 +525,3 @@
     Z,
     AllThree,
 }
-
-/**
- * Declares the recommended size (width and height) for a @SubspaceComposable.
- *
- * In Full Space Mode, the maximum available size is determined by the user's field of view (FOV) as
- * perceived from the Subspace's origin. The maximum available size is then scaled by the provided
- * [fraction] to decide the recommended size.
- *
- * This API does not support Home Space Mode yet.
- *
- * @param fraction The fraction of the maximum field of view size to fill [0.0f to 1.0f]. A value of
- *   1.0f represents 100% of the calculated FOV size.
- * @return A [SubspaceModifier] that applies the calculated size to the layout.
- * @experimental This function is experimental and may change or be removed without notice.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY)
-public fun SubspaceModifier.SpatialRecommendedSize(
-    @FloatRange(from = 0.0, to = 1.0) @Suppress("UNUSED_PARAMETER") fraction: Float = 1.0f
-): SubspaceModifier {
-    // TODO(b/394100111): Implement SpatialRecommendedSize modifier.
-    return this
-}
-
-/**
- * Declares the recommended width for a @SubspaceComposable.
- *
- * In Full Space Mode, the maximum available width is determined by the user's field of view (FOV)
- * as perceived from the Subspace's origin. The maximum available width is then scaled by the
- * provided [fraction] to decide the recommended width.
- *
- * This API does not support Home Space Mode yet.
- *
- * @param fraction The fraction of the maximum field of view width to fill [0.0f to 1.0f]. A value
- *   of 1.0f represents 100% of the calculated FOV width.
- * @return A [SubspaceModifier] that applies the calculated width to the layout.
- * @experimental This function is experimental and may change or be removed without notice.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY)
-public fun SubspaceModifier.SpatialRecommendedWidth(
-    @FloatRange(from = 0.0, to = 1.0) @Suppress("UNUSED_PARAMETER") fraction: Float = 1.0f
-): SubspaceModifier {
-    // TODO(b/394100111): Implement SpatialRecommendedWidth modifier.
-    return this
-}
-
-/**
- * Declares the recommended height for a @SubspaceComposable.
- *
- * In Full Space Mode, the maximum available height is determined by the user's field of view (FOV)
- * as perceived from the Subspace's origin. The maximum available height is then scaled by the
- * provided [fraction] to decide the recommended height.
- *
- * This API does not support Home Space Mode yet.
- *
- * @param fraction The fraction of the maximum field of view height to fill [0.0f to 1.0f]. A value
- *   of 1.0f represents 100% of the calculated FOV height.
- * @return A [SubspaceModifier] that applies the calculated height to the layout.
- * @experimental This function is experimental and may change or be removed without notice.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY)
-public fun SubspaceModifier.SpatialRecommendedHeight(
-    @FloatRange(from = 0.0, to = 1.0) @Suppress("UNUSED_PARAMETER") fraction: Float = 1.0f
-): SubspaceModifier {
-    // TODO(b/394100111): Implement SpatialRecommendedHeight modifier.
-    return this
-}
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/SubspaceLayout.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/SubspaceLayout.kt
index f6280bf..8defb8c 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/SubspaceLayout.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/layout/SubspaceLayout.kt
@@ -17,19 +17,19 @@
 package androidx.xr.compose.subspace.layout
 
 import androidx.annotation.RestrictTo
-import androidx.compose.runtime.Applier
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.ComposeNode
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.currentComposer
-import androidx.xr.compose.platform.LocalOpaqueEntity
+import androidx.xr.compose.platform.LocalCoreEntity
 import androidx.xr.compose.subspace.SubspaceComposable
-import androidx.xr.compose.subspace.entityName
 import androidx.xr.compose.subspace.node.ComposeSubspaceNode
 import androidx.xr.compose.subspace.node.ComposeSubspaceNode.Companion.SetCompositionLocalMap
 import androidx.xr.compose.subspace.node.ComposeSubspaceNode.Companion.SetCoreEntity
 import androidx.xr.compose.subspace.node.ComposeSubspaceNode.Companion.SetMeasurePolicy
 import androidx.xr.compose.subspace.node.ComposeSubspaceNode.Companion.SetModifier
+import androidx.xr.compose.subspace.node.ComposeSubspaceNode.Companion.SetName
+import androidx.xr.compose.subspace.node.SubspaceNodeApplier
 import androidx.xr.compose.subspace.rememberCoreContentlessEntity
 import androidx.xr.scenecore.ContentlessEntity
 
@@ -41,23 +41,25 @@
  * the [measurePolicy] instance. See [MeasurePolicy] for more details.
  *
  * @param modifier SubspaceModifier to apply during layout.
+ * @param name a name for the ComposeSubspaceNode. This can be useful for debugging.
  * @param measurePolicy a policy defining the measurement and positioning of the layout.
  */
-@Suppress("NOTHING_TO_INLINE")
 @SubspaceComposable
 @Composable
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public inline fun SubspaceLayout(
+public fun SubspaceLayout(
     modifier: SubspaceModifier = SubspaceModifier,
+    name: String = defaultSubspaceLayoutName(),
     measurePolicy: MeasurePolicy,
 ) {
     val compositionLocalMap = currentComposer.currentCompositionLocalMap
-    ComposeNode<ComposeSubspaceNode, Applier<Any>>(
+    ComposeNode<ComposeSubspaceNode, SubspaceNodeApplier>(
         factory = ComposeSubspaceNode.Constructor,
         update = {
             set(compositionLocalMap, SetCompositionLocalMap)
             set(measurePolicy, SetMeasurePolicy)
             set(modifier, SetModifier)
+            set(name, SetName)
         },
     )
 }
@@ -71,22 +73,24 @@
  *
  * @param modifier SubspaceModifier to apply during layout
  * @param content the children composable to be laid out.
+ * @param name a name for the ComposeSubspaceNode. This can be useful for debugging.
  * @param measurePolicy a policy defining the measurement and positioning of the layout.
  */
-@Suppress("ComposableLambdaParameterPosition", "NOTHING_TO_INLINE")
+@Suppress("ComposableLambdaParameterPosition")
 @SubspaceComposable
 @Composable
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public inline fun SubspaceLayout(
-    crossinline content: @Composable @SubspaceComposable () -> Unit,
+public fun SubspaceLayout(
+    content: @Composable @SubspaceComposable () -> Unit,
     modifier: SubspaceModifier = SubspaceModifier,
+    name: String = defaultSubspaceLayoutName(),
     measurePolicy: MeasurePolicy,
 ) {
     val coreEntity = rememberCoreContentlessEntity {
-        ContentlessEntity.create(session = this, name = entityName("Entity"))
+        ContentlessEntity.create(session = this, name = name)
     }
     val compositionLocalMap = currentComposer.currentCompositionLocalMap
-    ComposeNode<ComposeSubspaceNode, Applier<Any>>(
+    ComposeNode<ComposeSubspaceNode, SubspaceNodeApplier>(
         factory = ComposeSubspaceNode.Constructor,
         update = {
             set(compositionLocalMap, SetCompositionLocalMap)
@@ -95,8 +99,11 @@
             // TODO(b/390674036) Remove call-order dependency between SetCoreEntity and SetModifier
             // Execute SetModifier after SetCoreEntity, it depends on CoreEntity.
             set(modifier, SetModifier)
+            set(name, SetName)
         },
-        content = { CompositionLocalProvider(LocalOpaqueEntity provides coreEntity) { content() } },
+        content = {
+            CompositionLocalProvider(LocalCoreEntity provides coreEntity, content = content)
+        },
     )
 }
 
@@ -112,18 +119,19 @@
  *   needed for most use cases and should be avoided unless you have specific requirements to manage
  *   entities outside the Compose framework. If provided, it will associate the [SubspaceLayout]
  *   with the given SceneCore Entity.
+ * @param name a name for the ComposeSubspaceNode. This can be useful for debugging.
  * @param measurePolicy a policy defining the measurement and positioning of the layout.
  */
-@Suppress("NOTHING_TO_INLINE")
 @SubspaceComposable
 @Composable
-internal inline fun SubspaceLayout(
+internal fun SubspaceLayout(
     modifier: SubspaceModifier = SubspaceModifier,
+    name: String = defaultSubspaceLayoutName(),
     coreEntity: CoreEntity? = null,
     measurePolicy: MeasurePolicy,
 ) {
     val compositionLocalMap = currentComposer.currentCompositionLocalMap
-    ComposeNode<ComposeSubspaceNode, Applier<Any>>(
+    ComposeNode<ComposeSubspaceNode, SubspaceNodeApplier>(
         factory = ComposeSubspaceNode.Constructor,
         update = {
             set(compositionLocalMap, SetCompositionLocalMap)
@@ -132,6 +140,7 @@
             // TODO(b/390674036) Remove call-order dependency between SetCoreEntity and SetModifier
             // Execute SetModifier after SetCoreEntity, it depends on CoreEntity.
             set(modifier, SetModifier)
+            set(name, SetName)
         },
     )
 }
@@ -149,21 +158,23 @@
  *   entities outside the Compose framework. If provided, it will associate the [SubspaceLayout]
  *   with the given SceneCore Entity.
  * @param content the children composable to be laid out.
+ * @param name a name for the ComposeSubspaceNode. This can be useful for debugging.
  * @param measurePolicy a policy defining the measurement and positioning of the layout.
  */
-@Suppress("ComposableLambdaParameterPosition", "NOTHING_TO_INLINE")
+@Suppress("ComposableLambdaParameterPosition")
 @SubspaceComposable
 @Composable
-internal inline fun SubspaceLayout(
-    crossinline content: @Composable @SubspaceComposable () -> Unit,
+internal fun SubspaceLayout(
+    content: @Composable @SubspaceComposable () -> Unit,
     modifier: SubspaceModifier = SubspaceModifier,
+    name: String = defaultSubspaceLayoutName(),
     coreEntity: CoreEntity = rememberCoreContentlessEntity {
-        ContentlessEntity.create(session = this, name = entityName("Entity"))
+        ContentlessEntity.create(session = this, name = name)
     },
     measurePolicy: MeasurePolicy,
 ) {
     val compositionLocalMap = currentComposer.currentCompositionLocalMap
-    ComposeNode<ComposeSubspaceNode, Applier<Any>>(
+    ComposeNode<ComposeSubspaceNode, SubspaceNodeApplier>(
         factory = ComposeSubspaceNode.Constructor,
         update = {
             set(compositionLocalMap, SetCompositionLocalMap)
@@ -172,7 +183,17 @@
             // TODO(b/390674036) Remove call-order dependency between SetCoreEntity and SetModifier
             // Execute SetModifier after SetCoreEntity, it depends on CoreEntity.
             set(modifier, SetModifier)
+            set(name, SetName)
         },
-        content = { CompositionLocalProvider(LocalOpaqueEntity provides coreEntity) { content() } },
+        content = {
+            CompositionLocalProvider(LocalCoreEntity provides coreEntity, content = content)
+        },
     )
 }
+
+private var subspaceLayoutNamePart: Int = 0
+
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public fun defaultSubspaceLayoutName(): String {
+    return "SubspaceLayoutNode-${subspaceLayoutNamePart++}"
+}
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/ComposeSubspaceNode.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/ComposeSubspaceNode.kt
index a227e9c..232979a 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/ComposeSubspaceNode.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/ComposeSubspaceNode.kt
@@ -26,7 +26,6 @@
  *
  * This interface is inspired by [androidx.compose.ui.node.ComposeUiNode].
  */
-@PublishedApi
 internal interface ComposeSubspaceNode {
 
     /** The [MeasurePolicy] used to define the measure and layout behavior of this node. */
@@ -38,6 +37,9 @@
     /** The optional [CoreEntity] associated with this node. */
     public var coreEntity: CoreEntity?
 
+    /** An optional name for this node, useful for debugging and identification purposes. */
+    public var name: String?
+
     /** A snapshot of the current composition local map when this node is created. */
     public var compositionLocalMap: CompositionLocalMap
 
@@ -78,6 +80,13 @@
             this.modifier = it
         }
 
+        /**
+         * Sets the name for the given [ComposeSubspaceNode].
+         *
+         * @param name the name to be assigned.
+         */
+        public val SetName: ComposeSubspaceNode.(String) -> Unit = { this.name = it }
+
         /** Sets a snapshot of the current composition local map when this node is created. */
         public val SetCompositionLocalMap: ComposeSubspaceNode.(CompositionLocalMap) -> Unit = {
             this.compositionLocalMap = it
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/SubspaceLayoutModifierNode.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/SubspaceLayoutModifierNode.kt
index 3a51c41..697d049 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/SubspaceLayoutModifierNode.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/SubspaceLayoutModifierNode.kt
@@ -51,11 +51,11 @@
  * Requests a relayout of the [SubspaceLayoutModifierNode] composition tree.
  *
  * This is used to request a relayout in stateful layout modifiers that are impacted by events that
- * don't trigger a recomposition. *Do not* call this from [SubspaceLayoutModifierNode.measure].
+ * don't trigger a recomposition. *Do not* call this from [measure].
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public fun SubspaceLayoutModifierNode.requestRelayout() {
-    requireCoordinator().layoutNode?.requestRelayout()
+    coordinator.layoutNode?.requestRelayout()
 }
 
 /**
@@ -65,10 +65,10 @@
  * This is used to traverse the modifier node tree to find the correct [SubspaceLayoutCoordinates]
  * for a given [SubspaceLayoutModifierNode].
  */
-internal fun SubspaceLayoutModifierNode.requireCoordinator():
-    SubspaceLayoutModifierNodeCoordinator {
-    check(this is SubspaceModifier.Node && coordinator != null) {
-        "SubspaceLayoutModifierNode must also be a SubspaceModifier.Node and have a coordinator."
+internal val SubspaceLayoutModifierNode.coordinator: SubspaceLayoutModifierNodeCoordinator
+    get() {
+        check(this is SubspaceModifier.Node && this.coordinator != null) {
+            "SubspaceLayoutModifierNode must be a SubspaceModifier.Node and have a non-null coordinator."
+        }
+        return (this as SubspaceModifier.Node).coordinator!!
     }
-    return coordinator
-}
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/SubspaceLayoutNode.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/SubspaceLayoutNode.kt
index 9e4f19f..86ce12f 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/SubspaceLayoutNode.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/SubspaceLayoutNode.kt
@@ -19,7 +19,6 @@
 import androidx.compose.runtime.CompositionLocalMap
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.semantics.SemanticsConfiguration
-import androidx.compose.ui.semantics.SemanticsProperties
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.util.fastForEach
 import androidx.xr.compose.subspace.layout.CoreEntity
@@ -34,7 +33,6 @@
 import androidx.xr.compose.subspace.layout.SubspaceLayoutCoordinates
 import androidx.xr.compose.subspace.layout.SubspaceModifier
 import androidx.xr.compose.subspace.layout.SubspaceRootMeasurePolicy
-import androidx.xr.compose.subspace.layout.applyCoreEntityNodes
 import androidx.xr.compose.unit.IntVolumeSize
 import androidx.xr.compose.unit.VolumeConstraints
 import androidx.xr.runtime.math.Pose
@@ -79,6 +77,7 @@
         set(value) {
             field = value
             nodes.updateFrom(value)
+            updateCoreEntity()
         }
 
     override var coreEntity: CoreEntity? = null
@@ -86,10 +85,18 @@
             check(field == null) { "overwriting non-null CoreEntity is not supported" }
             field = value
             if (value != null) {
-                value.layout = this
+                value.layout = measurableLayout
             }
         }
 
+    override var name: String? = null
+
+    private fun updateCoreEntity() {
+        coreEntity?.let { entity ->
+            nodes.getAll<CoreEntityNode>().forEach { it.modifyCoreEntity(entity) }
+        }
+    }
+
     override var compositionLocalMap: CompositionLocalMap = CompositionLocalMap.Empty
         set(value) {
             field = value
@@ -234,7 +241,7 @@
     }
 
     override fun toString(): String {
-        return measurableLayout.config.getOrElse(SemanticsProperties.TestTag) { super.toString() }
+        return name ?: super.toString()
     }
 
     /** Call this method to see a dump of the SpatialLayoutNode tree structure. */
@@ -338,7 +345,6 @@
         public override fun placeAt(pose: Pose) {
             layoutPose = pose
 
-            coreEntity?.applyCoreEntityNodes(nodes.getAll<CoreEntityNode>())
             coreEntity?.updateEntityPose()
             coreEntity?.size = IntVolumeSize(measuredWidth, measuredHeight, measuredDepth)
 
@@ -418,7 +424,8 @@
          */
         private val coordinatesInRoot: SubspaceLayoutCoordinates?
             get() =
-                nodes.getLast<SubspaceLayoutModifierNode>()?.requireCoordinator()
+                coreEntity
+                    ?: nodes.getLast<SubspaceLayoutModifierNode>()?.coordinator
                     ?: parentCoordinatesInRoot
 
         /** Traverse the parent hierarchy up to the root. */
@@ -435,7 +442,8 @@
          */
         private val coordinatesInParentEntity: SubspaceLayoutCoordinates?
             get() =
-                nodes.getLast<SubspaceLayoutModifierNode>()?.requireCoordinator()
+                coreEntity
+                    ?: nodes.getLast<SubspaceLayoutModifierNode>()?.coordinator
                     ?: parentCoordinatesInParentEntity
 
         /** Traverse up the parent hierarchy until we reach a node with an entity. */
diff --git a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/SubspaceModifierNodeChain.kt b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/SubspaceModifierNodeChain.kt
index 92d7dcf..a6ff929 100644
--- a/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/SubspaceModifierNodeChain.kt
+++ b/xr/compose/compose/src/main/kotlin/androidx/xr/compose/subspace/node/SubspaceModifierNodeChain.kt
@@ -144,7 +144,7 @@
             return wrappedMeasureBlock(constraints)
         }
         inMeasurePass = true
-        val placeable = layoutNode.requireCoordinator().measure(constraints)
+        val placeable = layoutNode.coordinator.measure(constraints)
         inMeasurePass = false
         return placeable
     }
diff --git a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/platform/SpatialCapabilitiesTest.kt b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/platform/SpatialCapabilitiesTest.kt
index 9c9c7a8..718d684 100644
--- a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/platform/SpatialCapabilitiesTest.kt
+++ b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/platform/SpatialCapabilitiesTest.kt
@@ -17,6 +17,8 @@
 package androidx.xr.compose.platform
 
 import androidx.compose.material3.Text
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.test.junit4.createAndroidComposeRule
 import androidx.compose.ui.test.onNodeWithText
 import androidx.test.ext.junit.runners.AndroidJUnit4
diff --git a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/platform/SpatialConfigurationTest.kt b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/platform/SpatialConfigurationTest.kt
index 552b2bb..97dfa73 100644
--- a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/platform/SpatialConfigurationTest.kt
+++ b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/platform/SpatialConfigurationTest.kt
@@ -17,6 +17,8 @@
 package androidx.xr.compose.platform
 
 import androidx.compose.material3.Text
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.test.junit4.createAndroidComposeRule
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.unit.Dp
diff --git a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/spatial/SpatialElevationTest.kt b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/spatial/SpatialElevationTest.kt
index b8e9003..60a8bc3 100644
--- a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/spatial/SpatialElevationTest.kt
+++ b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/spatial/SpatialElevationTest.kt
@@ -27,10 +27,12 @@
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.window.Dialog
 import androidx.compose.ui.window.Popup
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.xr.compose.testing.SubspaceTestingActivity
 import androidx.xr.compose.testing.TestSetup
+import kotlin.test.assertFailsWith
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -56,10 +58,21 @@
     }
 
     @Test
-    fun spatialElevation_popup_doesNotThrowError() {
-        composeTestRule.setContent { TestSetup { SpatialElevation { Popup { Text("Popup") } } } }
+    fun spatialElevation_dialog_throwsError() {
+        assertFailsWith<RuntimeException> {
+            composeTestRule.setContent {
+                TestSetup { SpatialElevation { Dialog(onDismissRequest = {}) { Text("Title") } } }
+            }
+        }
+    }
 
-        composeTestRule.onNodeWithText("Popup").assertExists()
+    @Test
+    fun spatialElevation_popup_throwsError() {
+        assertFailsWith<RuntimeException> {
+            composeTestRule.setContent {
+                TestSetup { SpatialElevation { Popup { Text("Popup") } } }
+            }
+        }
     }
 
     @Test
diff --git a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/SpatialPanelTest.kt b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/SpatialPanelTest.kt
index db94be7..8b6d125 100644
--- a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/SpatialPanelTest.kt
+++ b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/SpatialPanelTest.kt
@@ -50,8 +50,6 @@
 import androidx.xr.scenecore.BasePanelEntity
 import androidx.xr.scenecore.PanelEntity
 import androidx.xr.scenecore.getEntitiesOfType
-import com.android.extensions.xr.ShadowXrExtensions
-import com.android.extensions.xr.space.ShadowActivityPanel
 import com.google.common.truth.Truth.assertThat
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertThrows
@@ -183,11 +181,8 @@
         // instead of
         // being launched.
         val launchIntent =
-            ShadowActivityPanel.extract(
-                    ShadowXrExtensions.extract(composeTestRule.activity.extensions)
-                        .getActivityPanelForHost(composeTestRule.activity)
-                )
-                .launchIntent
+            composeTestRule.activity.extensions.activityPanelMap[composeTestRule.activity]
+                ?.launchIntent
 
         assertThat(launchIntent?.component?.className)
             .isEqualTo(SpatialPanelActivity::class.java.name)
diff --git a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/SpatialRowColumnTest.kt b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/SpatialRowColumnTest.kt
index 75a4fba..bae11de 100644
--- a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/SpatialRowColumnTest.kt
+++ b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/SpatialRowColumnTest.kt
@@ -344,10 +344,7 @@
     @Test
     fun spatialRowColumn_negativeCurvatureIsIgnored() {
         composeTestRule.setSubspaceContent {
-            SpatialCurvedRow(
-                SubspaceModifier.testTag("row1").width(500.dp),
-                curveRadius = -100.dp
-            ) {
+            SpatialRow(SubspaceModifier.testTag("row1").width(500.dp), curveRadius = -100.dp) {
                 SpatialColumn(SubspaceModifier.testTag("column1").width(250.dp)) {
                     SpatialPanel { Text(text = "Column 1") }
                 }
@@ -374,7 +371,7 @@
     @Test
     fun spatialRowColumn_zeroCurvatureIsIgnored() {
         composeTestRule.setSubspaceContent {
-            SpatialCurvedRow(SubspaceModifier.testTag("row1").width(500.dp), curveRadius = 0.dp) {
+            SpatialRow(SubspaceModifier.testTag("row1").width(500.dp), curveRadius = 0.dp) {
                 SpatialColumn(SubspaceModifier.testTag("column1").width(250.dp)) {
                     SpatialPanel { Text(text = "Column 1") }
                 }
@@ -402,7 +399,7 @@
     @Test
     fun spatialRowColumn_positiveCurvatureCreatesCurvature() {
         composeTestRule.setSubspaceContent {
-            SpatialCurvedRow(SubspaceModifier.testTag("row1").width(500.dp), curveRadius = 100.dp) {
+            SpatialRow(SubspaceModifier.testTag("row1").width(500.dp), curveRadius = 100.dp) {
                 SpatialColumn(SubspaceModifier.testTag("column1").width(250.dp)) {
                     SpatialPanel { Text(text = "Column 1") }
                 }
@@ -430,7 +427,7 @@
     @Test
     fun spatialRowColumn_zOffsetIsRespected() {
         composeTestRule.setSubspaceContent {
-            SpatialCurvedRow(
+            SpatialRow(
                 SubspaceModifier.testTag("row1").width(500.dp).offset(0.dp, 0.dp, -50.dp),
                 curveRadius = 100.dp,
             ) {
diff --git a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/layout/AlphaTest.kt b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/layout/AlphaTest.kt
deleted file mode 100644
index e33280e..0000000
--- a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/layout/AlphaTest.kt
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.compose.subspace.layout
-
-import androidx.compose.material3.Text
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.test.junit4.createAndroidComposeRule
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.xr.compose.subspace.SpatialPanel
-import androidx.xr.compose.testing.SubspaceTestingActivity
-import androidx.xr.compose.testing.onSubspaceNodeWithTag
-import androidx.xr.compose.testing.setSubspaceContent
-import com.google.common.truth.Truth.assertThat
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@RunWith(AndroidJUnit4::class)
-class AlphaTest {
-
-    @get:Rule val composeTestRule = createAndroidComposeRule<SubspaceTestingActivity>()
-
-    @Test
-    fun alpha_shouldBeAppliedToEntity() {
-        composeTestRule.setSubspaceContent {
-            SpatialPanel(SubspaceModifier.testTag("panel").alpha(0.5f)) { Text(text = "Panel") }
-        }
-
-        assertThat(
-                composeTestRule
-                    .onSubspaceNodeWithTag("panel")
-                    .fetchSemanticsNode()
-                    .semanticsEntity
-                    ?.getAlpha()
-            )
-            .isEqualTo(0.5f)
-    }
-
-    @Test
-    fun alpha_multiple_shouldBeMultipliedThenAppliedToEntity() {
-        composeTestRule.setSubspaceContent {
-            SpatialPanel(SubspaceModifier.testTag("panel").alpha(0.5f).alpha(0.5f)) {
-                Text(text = "Panel")
-            }
-        }
-
-        assertThat(
-                composeTestRule
-                    .onSubspaceNodeWithTag("panel")
-                    .fetchSemanticsNode()
-                    .semanticsEntity
-                    ?.getAlpha()
-            )
-            .isEqualTo(0.25f)
-    }
-
-    @Test
-    fun alpha_negative_shouldBeClampedToZero() {
-        composeTestRule.setSubspaceContent {
-            SpatialPanel(SubspaceModifier.testTag("panel").alpha(-1f)) { Text(text = "Panel") }
-        }
-
-        assertThat(
-                composeTestRule
-                    .onSubspaceNodeWithTag("panel")
-                    .fetchSemanticsNode()
-                    .semanticsEntity
-                    ?.getAlpha()
-            )
-            .isEqualTo(0.0f)
-    }
-
-    @Test
-    fun alpha_greaterThanOne_shouldBeClampedToOne() {
-        composeTestRule.setSubspaceContent {
-            SpatialPanel(SubspaceModifier.testTag("panel").alpha(1.1f)) { Text(text = "Panel") }
-        }
-
-        assertThat(
-                composeTestRule
-                    .onSubspaceNodeWithTag("panel")
-                    .fetchSemanticsNode()
-                    .semanticsEntity
-                    ?.getAlpha()
-            )
-            .isEqualTo(1.0f)
-    }
-
-    @Test
-    fun alpha_updatesWhenValueChanges() {
-        var alpha by mutableStateOf(0.1f)
-        composeTestRule.setSubspaceContent {
-            SpatialPanel(SubspaceModifier.testTag("panel").alpha(alpha)) { Text(text = "Panel") }
-        }
-
-        assertThat(
-                composeTestRule
-                    .onSubspaceNodeWithTag("panel")
-                    .fetchSemanticsNode()
-                    .semanticsEntity
-                    ?.getAlpha()
-            )
-            .isEqualTo(0.1f)
-
-        alpha = 0.5f
-
-        assertThat(
-                composeTestRule
-                    .onSubspaceNodeWithTag("panel")
-                    .fetchSemanticsNode()
-                    .semanticsEntity
-                    ?.getAlpha()
-            )
-            .isEqualTo(0.5f)
-    }
-
-    @Test
-    fun alpha_multiple_valuesShouldBeClampedThenMultiplied() {
-        composeTestRule.setSubspaceContent {
-            SpatialPanel(SubspaceModifier.testTag("panel").alpha(3f).alpha(0.1f)) {
-                Text(text = "Panel")
-            }
-        }
-
-        assertThat(
-                composeTestRule
-                    .onSubspaceNodeWithTag("panel")
-                    .fetchSemanticsNode()
-                    .semanticsEntity
-                    ?.getAlpha()
-            )
-            .isEqualTo(0.1f)
-    }
-}
diff --git a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/layout/SizeTest.kt b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/layout/SizeTest.kt
index 3620804..0529d73 100644
--- a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/layout/SizeTest.kt
+++ b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/layout/SizeTest.kt
@@ -28,7 +28,6 @@
 import androidx.xr.compose.testing.assertWidthIsEqualTo
 import androidx.xr.compose.testing.onSubspaceNodeWithTag
 import androidx.xr.compose.testing.setSubspaceContent
-import org.junit.Assert.assertSame
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -209,37 +208,4 @@
             .assertHeightIsEqualTo(10.dp)
             .assertDepthIsEqualTo(10.dp)
     }
-
-    @Test
-    fun spatialRecommendedSize_returnsSameModifier() {
-        val modifier = SubspaceModifier
-        val returnedModifier = modifier.SpatialRecommendedSize()
-        assertSame(
-            "SpatialRecommendedSize should return the same SubspaceModifier instance",
-            modifier,
-            returnedModifier,
-        )
-    }
-
-    @Test
-    fun spatialRecommendedWidth_returnsSameModifier() {
-        val modifier = SubspaceModifier
-        val returnedModifier = modifier.SpatialRecommendedWidth()
-        assertSame(
-            "SpatialRecommendedWidth should return the same SubspaceModifier instance",
-            modifier,
-            returnedModifier,
-        )
-    }
-
-    @Test
-    fun spatialRecommendedHeight_returnsSameModifier() {
-        val modifier = SubspaceModifier
-        val returnedModifier = modifier.SpatialRecommendedHeight()
-        assertSame(
-            "SpatialRecommendedHeight should return the same SubspaceModifier instance",
-            modifier,
-            returnedModifier,
-        )
-    }
 }
diff --git a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/node/SubspaceModifierNodeChainTest.kt b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/node/SubspaceModifierNodeChainTest.kt
index fedd3d8..97744cb 100644
--- a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/node/SubspaceModifierNodeChainTest.kt
+++ b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/subspace/node/SubspaceModifierNodeChainTest.kt
@@ -29,8 +29,8 @@
 import androidx.compose.ui.test.performClick
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.xr.compose.subspace.SpatialPanel
+import androidx.xr.compose.subspace.layout.CoreEntity
 import androidx.xr.compose.subspace.layout.CoreEntityNode
-import androidx.xr.compose.subspace.layout.CoreEntityScope
 import androidx.xr.compose.subspace.layout.SubspaceModifier
 import androidx.xr.compose.testing.SubspaceTestingActivity
 import androidx.xr.compose.testing.setSubspaceContent
@@ -112,7 +112,7 @@
         // This is used to track the number of times the node is reused.
         private var internalCount = 0
 
-        override fun CoreEntityScope.modifyCoreEntity() {
+        override fun modifyCoreEntity(coreEntity: CoreEntity) {
             nodeCount = ++internalCount
         }
     }
diff --git a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/unit/DpVolumeSizeTest.kt b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/unit/DpVolumeSizeTest.kt
index 1ffb125..0813537 100644
--- a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/unit/DpVolumeSizeTest.kt
+++ b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/unit/DpVolumeSizeTest.kt
@@ -44,7 +44,7 @@
 
     @Test
     fun toDimensionsInMeter_returnsCorrectDimensions() {
-        val dpVolumeSize = DpVolumeSize(1.dp, 1.dp, 1.dp)
+        val dpVolumeSize = DpVolumeSize(1151.856f.dp, 1151.856f.dp, 1151.856f.dp)
 
         val dimensions = dpVolumeSize.toDimensionsInMeters()
 
@@ -55,7 +55,7 @@
     fun dpVolumeSize_fromMeters_returnsCorrectDpVolumeSize() {
         val dpVolumeSize = Dimensions(1f, 1f, 1f).toDpVolumeSize()
 
-        assertThat(dpVolumeSize).isEqualTo(DpVolumeSize(1.dp, 1.dp, 1.dp))
+        assertThat(dpVolumeSize).isEqualTo(DpVolumeSize(1151.856f.dp, 1151.856f.dp, 1151.856f.dp))
     }
 
     @Test
@@ -76,3 +76,20 @@
             .isEqualTo(DpVolumeSize(1111.11f.dp, 1111.11f.dp, 1111.11f.dp))
     }
 }
+
+/**
+ * Converts this [DpVolumeSize] to a [Dimensions] object in meters.
+ *
+ * @return a [Dimensions] object representing the volume size in meters
+ */
+internal fun DpVolumeSize.toDimensionsInMeters(): Dimensions =
+    Dimensions(width.toMeter().value, height.toMeter().value, depth.toMeter().value)
+
+/**
+ * Creates a [DpVolumeSize] from a [Dimensions] object in meters.
+ *
+ * @param dimensions the [Dimensions] object in meters.
+ * @return a [DpVolumeSize] object representing the same volume size in Dp.
+ */
+internal fun Dimensions.toDpVolumeSize(): DpVolumeSize =
+    DpVolumeSize(Meter(width).toDp(), Meter(height).toDp(), Meter(depth).toDp())
diff --git a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/unit/IntVolumeSizeTest.kt b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/unit/IntVolumeSizeTest.kt
index b8c886a..bdc84e2 100644
--- a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/unit/IntVolumeSizeTest.kt
+++ b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/unit/IntVolumeSizeTest.kt
@@ -42,9 +42,9 @@
 
         val dimensions = intVolumeSize.toDimensionsInMeters(UNIT_DENSITY)
 
-        assertThat(dimensions.width).isWithin(0.0003f).of(10367.0f)
-        assertThat(dimensions.height).isWithin(0.0003f).of(10367.0f)
-        assertThat(dimensions.depth).isWithin(0.0003f).of(10367.0f)
+        assertThat(dimensions.width).isWithin(0.0003f).of(9.0f)
+        assertThat(dimensions.height).isWithin(0.0003f).of(9.0f)
+        assertThat(dimensions.depth).isWithin(0.0003f).of(9.0f)
     }
 
     @Test
@@ -55,9 +55,9 @@
         val dimensions = intVolumeSize.toDimensionsInMeters(DOUBLE_DENSITY)
 
         // When pixels are twice as dense, we expect the Meters equivalent to be half.
-        assertThat(dimensions.width).isWithin(0.0002f).of(5183.5f)
-        assertThat(dimensions.height).isWithin(0.0002f).of(5183.5f)
-        assertThat(dimensions.depth).isWithin(0.0002f).of(5183.5f)
+        assertThat(dimensions.width).isWithin(0.0002f).of(4.5f)
+        assertThat(dimensions.height).isWithin(0.0002f).of(4.5f)
+        assertThat(dimensions.depth).isWithin(0.0002f).of(4.5f)
     }
 
     @Test
@@ -73,7 +73,7 @@
 
         val intVolumeSize = dimensions.toIntVolumeSize(UNIT_DENSITY)
 
-        assertThat(intVolumeSize).isEqualTo(IntVolumeSize(9, 9, 9))
+        assertThat(intVolumeSize).isEqualTo(IntVolumeSize(10367, 10367, 10367))
     }
 
     @Test
diff --git a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/unit/MeterTest.kt b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/unit/MeterTest.kt
index 455d6d7..3a8d696 100644
--- a/xr/compose/compose/src/test/kotlin/androidx/xr/compose/unit/MeterTest.kt
+++ b/xr/compose/compose/src/test/kotlin/androidx/xr/compose/unit/MeterTest.kt
@@ -33,12 +33,12 @@
 
     @Test
     fun meter_toDp() {
-        assertThat(1.meters.toDp()).isEqualTo(1.dp)
+        assertThat(1.meters.toDp()).isEqualTo(1151.856f.dp)
     }
 
     @Test
     fun roundToPx_roundsToNearestPixel() {
-        assertThat(1.meters.roundToPx(UNIT_DENSITY)).isEqualTo(1)
+        assertThat(1.meters.roundToPx(UNIT_DENSITY)).isEqualTo(1152)
     }
 
     @Test
@@ -46,12 +46,12 @@
         val DOUBLE_DENSITY = Density(density = 2.0f, fontScale = 2.0f)
 
         // Twice the density, twice the pixels.
-        assertThat(1.meters.roundToPx(DOUBLE_DENSITY)).isEqualTo(2)
+        assertThat(1.meters.roundToPx(DOUBLE_DENSITY)).isEqualTo(2304)
     }
 
     @Test
     fun dp_toMeter() {
-        assertThat(10.dp.toMeter()).isEqualTo(Meter(10f))
+        assertThat(10.dp.toMeter()).isEqualTo(Meter(0.008681641f))
         assertThat(Dp.Infinity.toMeter()).isEqualTo(Meter.Infinity)
         assertThat(Dp.Unspecified.toMeter()).isEqualTo(Meter.NaN)
 
@@ -80,17 +80,17 @@
 
     @Test
     fun meter_toPx() {
-        assertThat(5.meters.toPx(UNIT_DENSITY)).isEqualTo(5f)
+        assertThat(5.meters.toPx(UNIT_DENSITY)).isEqualTo(5759.28f)
     }
 
     @Test
     fun meter_roundToPx() {
-        assertThat(5.meters.roundToPx(UNIT_DENSITY)).isEqualTo(5)
+        assertThat(5.meters.roundToPx(UNIT_DENSITY)).isEqualTo(5759)
     }
 
     @Test
     fun meter_todp() {
-        assertThat(5.meters.toDp()).isEqualTo(5.dp)
+        assertThat(5.meters.toDp()).isEqualTo(5759.28f.dp)
     }
 
     @Test
diff --git a/xr/compose/integration-tests/common/build.gradle b/xr/compose/integration-tests/common/build.gradle
index 2c08a6f..17cafbd 100644
--- a/xr/compose/integration-tests/common/build.gradle
+++ b/xr/compose/integration-tests/common/build.gradle
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 plugins {
     id("com.android.library")
     id("AndroidXPlugin")
@@ -34,4 +33,4 @@
     implementation("androidx.compose.ui:ui-tooling-preview:1.7.0")
     implementation("androidx.compose.material:material-icons-core:1.6.7")
     implementation("androidx.compose.material3:material3:1.3.0")
-}
+}
\ No newline at end of file
diff --git a/xr/compose/integration-tests/layout/activitypanelapp/build.gradle b/xr/compose/integration-tests/layout/activitypanelapp/build.gradle
index 6c20265..71678efc 100644
--- a/xr/compose/integration-tests/layout/activitypanelapp/build.gradle
+++ b/xr/compose/integration-tests/layout/activitypanelapp/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import androidx.build.AndroidXConfig
-
 plugins {
     id("com.android.application")
     id("AndroidXPlugin")
@@ -47,6 +44,4 @@
     implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
-}
+}
\ No newline at end of file
diff --git a/xr/compose/integration-tests/layout/activitypanelapp/src/main/java/androidx/xr/compose/integration/layout/activitypanelapp/ActivityPanelApp.kt b/xr/compose/integration-tests/layout/activitypanelapp/src/main/java/androidx/xr/compose/integration/layout/activitypanelapp/ActivityPanelApp.kt
index 8f4c474..4c3787f 100644
--- a/xr/compose/integration-tests/layout/activitypanelapp/src/main/java/androidx/xr/compose/integration/layout/activitypanelapp/ActivityPanelApp.kt
+++ b/xr/compose/integration-tests/layout/activitypanelapp/src/main/java/androidx/xr/compose/integration/layout/activitypanelapp/ActivityPanelApp.kt
@@ -33,7 +33,6 @@
 import androidx.xr.compose.subspace.layout.movable
 import androidx.xr.compose.subspace.layout.offset
 import androidx.xr.compose.subspace.layout.resizable
-import androidx.xr.compose.subspace.layout.testTag
 import androidx.xr.compose.subspace.layout.width
 import androidx.xr.compose.unit.DpVolumeSize
 
@@ -68,8 +67,8 @@
                     SubspaceModifier.width(panelWidth)
                         .height(panelHeight)
                         .movable()
-                        .resizable(minimumSize = minimumSize)
-                        .testTag("AnotherActivityPanel"),
+                        .resizable(minimumSize = minimumSize),
+                name = "AnotherActivityPanel",
                 intent = Intent(this@ActivityPanelApp, AnotherActivity::class.java),
             )
             SpatialLayoutSpacer(modifier = SubspaceModifier.height(20.dp))
@@ -79,8 +78,8 @@
                         SubspaceModifier.width(panelWidth)
                             .height(panelHeight)
                             .movable()
-                            .resizable(minimumSize = minimumSize)
-                            .testTag("BaseActivityPanel"),
+                            .resizable(minimumSize = minimumSize),
+                    name = "BaseActivityPanel",
                     intent =
                         Intent(this@ActivityPanelApp, BaseActivity::class.java)
                             .putExtra("activityName", "Activity $i"),
@@ -99,8 +98,8 @@
                         SubspaceModifier.width(panelWidth)
                             .height(panelHeight)
                             .movable()
-                            .resizable(minimumSize = minimumSize)
-                            .testTag("BaseActivityPanel"),
+                            .resizable(minimumSize = minimumSize),
+                    name = "BaseActivityPanel",
                 )
                 SpatialLayoutSpacer(modifier = SubspaceModifier.height(20.dp))
             }
diff --git a/xr/compose/integration-tests/layout/animationexplorationapp/build.gradle b/xr/compose/integration-tests/layout/animationexplorationapp/build.gradle
index cab4182..5bd818be 100644
--- a/xr/compose/integration-tests/layout/animationexplorationapp/build.gradle
+++ b/xr/compose/integration-tests/layout/animationexplorationapp/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 
 plugins {
@@ -41,15 +40,12 @@
 
 dependencies {
     implementation(project(":xr:compose:compose"))
-    implementation("com.google.ar:impress:0.0.3")
 
     implementation("androidx.activity:activity-compose:1.10.0-beta01")
     implementation("androidx.compose.ui:ui:1.7.0")
     implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/compose/integration-tests/layout/animationexplorationapp/src/main/java/androidx/xr/compose/integration/layout/animationexplorationapp/AnimationExplorationApp.kt b/xr/compose/integration-tests/layout/animationexplorationapp/src/main/java/androidx/xr/compose/integration/layout/animationexplorationapp/AnimationExplorationApp.kt
index 6803c32..b310390 100644
--- a/xr/compose/integration-tests/layout/animationexplorationapp/src/main/java/androidx/xr/compose/integration/layout/animationexplorationapp/AnimationExplorationApp.kt
+++ b/xr/compose/integration-tests/layout/animationexplorationapp/src/main/java/androidx/xr/compose/integration/layout/animationexplorationapp/AnimationExplorationApp.kt
@@ -50,7 +50,6 @@
 import androidx.xr.compose.subspace.layout.alpha
 import androidx.xr.compose.subspace.layout.height
 import androidx.xr.compose.subspace.layout.scale
-import androidx.xr.compose.subspace.layout.testTag
 import androidx.xr.compose.subspace.layout.width
 import kotlinx.coroutines.launch
 
@@ -98,8 +97,8 @@
                         modifier =
                             SubspaceModifier.width(desiredWidth)
                                 .height(desiredHeight)
-                                .alpha(animatedAlpha.value)
-                                .testTag("FadeInPanel")
+                                .alpha(animatedAlpha.value),
+                        name = "FadeInPanel",
                     ) {
                         PanelContent(
                             "Faded in content",
diff --git a/xr/compose/integration-tests/layout/curvedpanelandrowapp/build.gradle b/xr/compose/integration-tests/layout/curvedpanelandrowapp/build.gradle
index 9341963..05aaaa1 100644
--- a/xr/compose/integration-tests/layout/curvedpanelandrowapp/build.gradle
+++ b/xr/compose/integration-tests/layout/curvedpanelandrowapp/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 
 plugins {
@@ -49,8 +48,6 @@
     implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/compose/integration-tests/layout/curvedpanelandrowapp/src/main/java/androidx/xr/compose/integration/layout/curvedpanelandrowapp/CurvedPanelAndRowApp.kt b/xr/compose/integration-tests/layout/curvedpanelandrowapp/src/main/java/androidx/xr/compose/integration/layout/curvedpanelandrowapp/CurvedPanelAndRowApp.kt
index 2fd343f..9ea27fd 100644
--- a/xr/compose/integration-tests/layout/curvedpanelandrowapp/src/main/java/androidx/xr/compose/integration/layout/curvedpanelandrowapp/CurvedPanelAndRowApp.kt
+++ b/xr/compose/integration-tests/layout/curvedpanelandrowapp/src/main/java/androidx/xr/compose/integration/layout/curvedpanelandrowapp/CurvedPanelAndRowApp.kt
@@ -59,7 +59,6 @@
 import androidx.xr.compose.spatial.Subspace
 import androidx.xr.compose.subspace.MainPanel
 import androidx.xr.compose.subspace.SpatialColumn
-import androidx.xr.compose.subspace.SpatialCurvedRow
 import androidx.xr.compose.subspace.SpatialLayoutSpacer
 import androidx.xr.compose.subspace.SpatialPanel
 import androidx.xr.compose.subspace.SpatialRow
@@ -107,7 +106,7 @@
                     }
                 }
             }
-            SpatialCurvedRow(
+            SpatialRow(
                 modifier = SubspaceModifier.width(2000.dp).height(600.dp),
                 alignment = SpatialAlignment.BottomCenter,
                 curveRadius = curveRadius,
diff --git a/xr/compose/integration-tests/layout/depthstackingapp/build.gradle b/xr/compose/integration-tests/layout/depthstackingapp/build.gradle
index 8b00959..910be7d 100644
--- a/xr/compose/integration-tests/layout/depthstackingapp/build.gradle
+++ b/xr/compose/integration-tests/layout/depthstackingapp/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import androidx.build.AndroidXConfig
-
 plugins {
     id("com.android.application")
     id("AndroidXPlugin")
@@ -46,6 +43,4 @@
     implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
-}
+}
\ No newline at end of file
diff --git a/xr/compose/integration-tests/layout/depthstackingapp/src/main/java/androidx/xr/compose/integration/layout/depthstackingapp/DepthStackingApp.kt b/xr/compose/integration-tests/layout/depthstackingapp/src/main/java/androidx/xr/compose/integration/layout/depthstackingapp/DepthStackingApp.kt
index 7779868..2f2da78 100644
--- a/xr/compose/integration-tests/layout/depthstackingapp/src/main/java/androidx/xr/compose/integration/layout/depthstackingapp/DepthStackingApp.kt
+++ b/xr/compose/integration-tests/layout/depthstackingapp/src/main/java/androidx/xr/compose/integration/layout/depthstackingapp/DepthStackingApp.kt
@@ -37,7 +37,6 @@
 import androidx.xr.compose.subspace.layout.SubspaceModifier
 import androidx.xr.compose.subspace.layout.height
 import androidx.xr.compose.subspace.layout.offset
-import androidx.xr.compose.subspace.layout.testTag
 import androidx.xr.compose.subspace.layout.width
 
 class DepthStackingApp : ComponentActivity() {
@@ -50,13 +49,13 @@
     private fun SpatialContent() {
         val panelSize = SubspaceModifier.width(200.dp).height(200.dp)
 
-        SpatialPanel(modifier = panelSize.offset(0.dp, 0.dp, (-50).dp).testTag("BackPanel")) {
+        SpatialPanel(modifier = panelSize.offset(0.dp, 0.dp, (-50).dp), name = "BackPanel") {
             PanelContent(Color.Red, "Back Panel")
         }
-        SpatialPanel(modifier = panelSize.testTag("MiddlePanel")) {
+        SpatialPanel(modifier = panelSize, name = "MiddlePanel") {
             PanelContent(Color.White, "Middle Panel")
         }
-        SpatialPanel(modifier = panelSize.offset(0.dp, 0.dp, 50.dp).testTag("FrontPanel")) {
+        SpatialPanel(modifier = panelSize.offset(0.dp, 0.dp, 50.dp), name = "Front Panel") {
             PanelContent(Color.Blue, "Front Panel")
         }
     }
diff --git a/xr/compose/integration-tests/layout/dialogpermissionsapp/build.gradle b/xr/compose/integration-tests/layout/dialogpermissionsapp/build.gradle
index dfed058..711a274 100644
--- a/xr/compose/integration-tests/layout/dialogpermissionsapp/build.gradle
+++ b/xr/compose/integration-tests/layout/dialogpermissionsapp/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 
 plugins {
@@ -47,8 +46,6 @@
     implementation("androidx.compose.ui:ui:1.7.0")
     implementation("androidx.compose.ui:ui-tooling-preview:1.7.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/compose/integration-tests/layout/dialogpermissionsapp/src/main/java/androidx/xr/compose/integration/layout/dialogpermissionsapp/DialogPermissionsApp.kt b/xr/compose/integration-tests/layout/dialogpermissionsapp/src/main/java/androidx/xr/compose/integration/layout/dialogpermissionsapp/DialogPermissionsApp.kt
index 5fe7ee9..bf81b1ad 100644
--- a/xr/compose/integration-tests/layout/dialogpermissionsapp/src/main/java/androidx/xr/compose/integration/layout/dialogpermissionsapp/DialogPermissionsApp.kt
+++ b/xr/compose/integration-tests/layout/dialogpermissionsapp/src/main/java/androidx/xr/compose/integration/layout/dialogpermissionsapp/DialogPermissionsApp.kt
@@ -27,14 +27,16 @@
 import androidx.xr.compose.subspace.MainPanel
 import androidx.xr.compose.subspace.SubspaceComposable
 import androidx.xr.compose.subspace.layout.SubspaceModifier
+import androidx.xr.compose.subspace.layout.height
 import androidx.xr.compose.subspace.layout.movable
+import androidx.xr.compose.subspace.layout.offset
 import androidx.xr.compose.subspace.layout.resizable
-import androidx.xr.compose.subspace.layout.size
+import androidx.xr.compose.subspace.layout.width
 import androidx.xr.scenecore.PermissionHelper
 
 /**
- * Launches a dialog in the Main Panel for the scene understanding permission. If it is not given,
- * the app will close and alert of missing required permissions.
+ * Creates a new activity which asks for the scene understanding permission. If it is not given will
+ * close the app and alert of missing required permissions.
  */
 class DialogPermissionsApp : ComponentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -54,6 +56,13 @@
     @Composable
     @SubspaceComposable
     private fun SpatialContent() {
-        MainPanel(modifier = SubspaceModifier.size(600.dp).movable().resizable())
+        MainPanel(
+            modifier =
+                SubspaceModifier.offset(100.dp, 200.dp)
+                    .width(100.dp)
+                    .height(100.dp)
+                    .movable()
+                    .resizable()
+        )
     }
 }
diff --git a/xr/compose/integration-tests/layout/modechangeapp/build.gradle b/xr/compose/integration-tests/layout/modechangeapp/build.gradle
index 62cfa07..e68885c 100644
--- a/xr/compose/integration-tests/layout/modechangeapp/build.gradle
+++ b/xr/compose/integration-tests/layout/modechangeapp/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 
 plugins {
@@ -50,8 +49,6 @@
     implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/compose/integration-tests/layout/modifierorderapp/build.gradle b/xr/compose/integration-tests/layout/modifierorderapp/build.gradle
index 7c1b6c3..2b62e46 100644
--- a/xr/compose/integration-tests/layout/modifierorderapp/build.gradle
+++ b/xr/compose/integration-tests/layout/modifierorderapp/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import androidx.build.AndroidXConfig
-
 plugins {
     id("com.android.application")
     id("AndroidXPlugin")
@@ -46,6 +43,4 @@
     implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
-}
+}
\ No newline at end of file
diff --git a/xr/compose/integration-tests/layout/modifierorderapp/src/main/java/androidx/xr/compose/integration/layout/modifierorderapp/ModifierOrderApp.kt b/xr/compose/integration-tests/layout/modifierorderapp/src/main/java/androidx/xr/compose/integration/layout/modifierorderapp/ModifierOrderApp.kt
index be564da..ec6ce74 100644
--- a/xr/compose/integration-tests/layout/modifierorderapp/src/main/java/androidx/xr/compose/integration/layout/modifierorderapp/ModifierOrderApp.kt
+++ b/xr/compose/integration-tests/layout/modifierorderapp/src/main/java/androidx/xr/compose/integration/layout/modifierorderapp/ModifierOrderApp.kt
@@ -43,7 +43,6 @@
 import androidx.xr.compose.subspace.layout.onGloballyPositioned
 import androidx.xr.compose.subspace.layout.resizable
 import androidx.xr.compose.subspace.layout.scale
-import androidx.xr.compose.subspace.layout.testTag
 import androidx.xr.compose.subspace.layout.width
 
 class ModifierOrderApp : ComponentActivity() {
@@ -70,8 +69,8 @@
                     .onGloballyPositioned {
                         Log.i("ModifierOrderApp", "BackPanel position: ${it.poseInRoot}")
                     }
-                    .offset(y = (-100).dp)
-                    .testTag("Back Panel")
+                    .offset(y = (-100).dp),
+            name = "Back Panel",
         ) {
             PanelContent(Color.Red, "Back Panel")
         }
@@ -81,8 +80,8 @@
                     .onGloballyPositioned {
                         Log.i("ModifierOrderApp", "MiddlePanel position: ${it.poseInRoot}")
                     }
-                    .scale(0.9f)
-                    .testTag("Middle Panel")
+                    .scale(0.9f),
+            name = "Middle Panel",
         ) {
             PanelContent(Color.White, "Middle Panel")
         }
@@ -94,8 +93,8 @@
                     .onGloballyPositioned {
                         Log.i("ModifierOrderApp", "FrontPanel position: ${it.poseInRoot}")
                     }
-                    .offset(y = 100.dp)
-                    .testTag("Front Panel")
+                    .offset(y = 100.dp),
+            name = "Front Panel",
         ) {
             PanelContent(Color.Blue, "Front Panel")
         }
diff --git a/xr/compose/integration-tests/layout/movableandresizablepanelapp/build.gradle b/xr/compose/integration-tests/layout/movableandresizablepanelapp/build.gradle
index 336fbac..7236018 100644
--- a/xr/compose/integration-tests/layout/movableandresizablepanelapp/build.gradle
+++ b/xr/compose/integration-tests/layout/movableandresizablepanelapp/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import androidx.build.AndroidXConfig
-
 plugins {
     id("com.android.application")
     id("AndroidXPlugin")
@@ -47,6 +44,4 @@
     implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
-}
+}
\ No newline at end of file
diff --git a/xr/compose/integration-tests/layout/movableandresizablepanelapp/src/main/java/androidx/xr/compose/integration/layout/movableandresizablepanelapp/MovableAndResizablePanelApp.kt b/xr/compose/integration-tests/layout/movableandresizablepanelapp/src/main/java/androidx/xr/compose/integration/layout/movableandresizablepanelapp/MovableAndResizablePanelApp.kt
index 5c3e6f1..a4876fe 100644
--- a/xr/compose/integration-tests/layout/movableandresizablepanelapp/src/main/java/androidx/xr/compose/integration/layout/movableandresizablepanelapp/MovableAndResizablePanelApp.kt
+++ b/xr/compose/integration-tests/layout/movableandresizablepanelapp/src/main/java/androidx/xr/compose/integration/layout/movableandresizablepanelapp/MovableAndResizablePanelApp.kt
@@ -53,7 +53,6 @@
 import androidx.xr.compose.subspace.layout.offset
 import androidx.xr.compose.subspace.layout.padding
 import androidx.xr.compose.subspace.layout.resizable
-import androidx.xr.compose.subspace.layout.testTag
 import androidx.xr.compose.subspace.layout.width
 import kotlin.concurrent.fixedRateTimer
 
@@ -82,17 +81,15 @@
             }
         }
         val panelWidth = (dynamicValue * 40).dp
-        SpatialColumn(SubspaceModifier.testTag("PanelGridColumn")) {
+        SpatialColumn(name = "PanelGridColumn") {
             SpatialRow(
                 modifier = SubspaceModifier.fillMaxWidth(),
                 alignment = SpatialAlignment.BottomCenter,
             ) {
                 SpatialColumn(
                     modifier =
-                        SubspaceModifier.width(400.dp)
-                            .fillMaxHeight()
-                            .padding(horizontal = 20.dp)
-                            .testTag("LeftColumn")
+                        SubspaceModifier.width(400.dp).fillMaxHeight().padding(horizontal = 20.dp),
+                    name = "LeftColumn",
                 ) {
                     if (counter >= 5) {
                         SpatialPanel(
@@ -144,10 +141,8 @@
                 }
                 SpatialColumn(
                     modifier =
-                        SubspaceModifier.width(600.dp)
-                            .fillMaxHeight()
-                            .padding(horizontal = 20.dp)
-                            .testTag("MiddleColumn")
+                        SubspaceModifier.width(600.dp).fillMaxHeight().padding(horizontal = 20.dp),
+                    name = "MiddleColumn",
                 ) {
                     SpatialPanel(
                         modifier = SubspaceModifier.width(panelWidth).height(200.dp).fillMaxWidth()
@@ -166,10 +161,8 @@
                 }
                 SpatialColumn(
                     modifier =
-                        SubspaceModifier.width(400.dp)
-                            .fillMaxHeight()
-                            .padding(horizontal = 20.dp)
-                            .testTag("RightColumn")
+                        SubspaceModifier.width(400.dp).fillMaxHeight().padding(horizontal = 20.dp),
+                    name = "RightColumn",
                 ) {
                     SpatialPanel(
                         modifier = SubspaceModifier.width(panelWidth).height(200.dp).fillMaxWidth()
@@ -185,8 +178,8 @@
                                 .width(panelWidth)
                                 .height(200.dp)
                                 .resizable()
-                                .movable()
-                                .testTag("ActivityPanel"),
+                                .movable(),
+                        name = "ActivityPanel",
                     )
                 }
             }
diff --git a/xr/compose/integration-tests/layout/movablepanelapp/build.gradle b/xr/compose/integration-tests/layout/movablepanelapp/build.gradle
index 8d8203f..001401a 100644
--- a/xr/compose/integration-tests/layout/movablepanelapp/build.gradle
+++ b/xr/compose/integration-tests/layout/movablepanelapp/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 
 plugins {
@@ -49,8 +48,6 @@
     implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/compose/integration-tests/layout/movablepanelapp/src/main/java/androidx/xr/compose/integration/layout/movablepanelapp/MovablePanelApp.kt b/xr/compose/integration-tests/layout/movablepanelapp/src/main/java/androidx/xr/compose/integration/layout/movablepanelapp/MovablePanelApp.kt
index 1dbfd79f..a7206d5 100644
--- a/xr/compose/integration-tests/layout/movablepanelapp/src/main/java/androidx/xr/compose/integration/layout/movablepanelapp/MovablePanelApp.kt
+++ b/xr/compose/integration-tests/layout/movablepanelapp/src/main/java/androidx/xr/compose/integration/layout/movablepanelapp/MovablePanelApp.kt
@@ -60,7 +60,6 @@
 import androidx.xr.compose.subspace.layout.offset
 import androidx.xr.compose.subspace.layout.padding
 import androidx.xr.compose.subspace.layout.rotate
-import androidx.xr.compose.subspace.layout.testTag
 import androidx.xr.compose.subspace.layout.width
 import androidx.xr.runtime.math.Quaternion
 
@@ -106,17 +105,15 @@
         var zValueMovable by remember { mutableStateOf(0.dp) }
         val density = LocalDensity.current
         var rotateValueMovable by remember { mutableStateOf(Quaternion.Identity) }
-        SpatialColumn(SubspaceModifier.testTag("PanelGridSpatialColumn")) {
+        SpatialColumn(name = "PanelGridSpatialColumn") {
             SpatialRow(
                 modifier = SubspaceModifier.fillMaxWidth(),
                 alignment = SpatialAlignment.BottomCenter,
             ) {
                 SpatialColumn(
                     modifier =
-                        SubspaceModifier.width(400.dp)
-                            .fillMaxHeight()
-                            .padding(horizontal = 20.dp)
-                            .testTag("LeftColumn")
+                        SubspaceModifier.width(400.dp).fillMaxHeight().padding(horizontal = 20.dp),
+                    name = "LeftColumn",
                 ) {
                     if (
                         transition.value >= 150f
@@ -150,10 +147,8 @@
                 }
                 SpatialColumn(
                     modifier =
-                        SubspaceModifier.width(600.dp)
-                            .fillMaxHeight()
-                            .padding(horizontal = 20.dp)
-                            .testTag("MiddleColumn")
+                        SubspaceModifier.width(600.dp).fillMaxHeight().padding(horizontal = 20.dp),
+                    name = "MiddleColumn",
                 ) {
                     SpatialPanel(
                         modifier = SubspaceModifier.width(panelWidth).height(200.dp).fillMaxWidth()
@@ -191,10 +186,8 @@
                 }
                 SpatialColumn(
                     modifier =
-                        SubspaceModifier.width(400.dp)
-                            .fillMaxHeight()
-                            .padding(horizontal = 20.dp)
-                            .testTag("RightColumn")
+                        SubspaceModifier.width(400.dp).fillMaxHeight().padding(horizontal = 20.dp),
+                    name = "RightColumn",
                 ) {
                     SpatialPanel(
                         modifier = SubspaceModifier.width(panelWidth).height(200.dp).fillMaxWidth()
@@ -208,8 +201,8 @@
                             SubspaceModifier.offset(x = 120.dp)
                                 .width(panelWidth)
                                 .height(200.dp)
-                                .movable(true)
-                                .testTag("ActivityPanel"),
+                                .movable(true),
+                        name = "ActivityPanel",
                     )
                 }
             }
diff --git a/xr/compose/integration-tests/layout/movablescalableapp/build.gradle b/xr/compose/integration-tests/layout/movablescalableapp/build.gradle
index a88ddd3..b3754b7 100644
--- a/xr/compose/integration-tests/layout/movablescalableapp/build.gradle
+++ b/xr/compose/integration-tests/layout/movablescalableapp/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 
 plugins {
@@ -48,8 +47,6 @@
     implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/compose/integration-tests/layout/movabletoggleapp/build.gradle b/xr/compose/integration-tests/layout/movabletoggleapp/build.gradle
index b859c32..a760b68 100644
--- a/xr/compose/integration-tests/layout/movabletoggleapp/build.gradle
+++ b/xr/compose/integration-tests/layout/movabletoggleapp/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import androidx.build.AndroidXConfig
-
 plugins {
     id("com.android.application")
     id("AndroidXPlugin")
@@ -46,6 +43,4 @@
     implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
diff --git a/xr/compose/integration-tests/layout/nestedsubspaceapp/build.gradle b/xr/compose/integration-tests/layout/nestedsubspaceapp/build.gradle
index 6a4b90b..53aad75 100644
--- a/xr/compose/integration-tests/layout/nestedsubspaceapp/build.gradle
+++ b/xr/compose/integration-tests/layout/nestedsubspaceapp/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import androidx.build.AndroidXConfig
-
 plugins {
     id("com.android.application")
     id("AndroidXPlugin")
@@ -46,6 +43,4 @@
     implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
diff --git a/xr/compose/integration-tests/layout/nestedsubspacesetsubspacecontentactivity/build.gradle b/xr/compose/integration-tests/layout/nestedsubspacesetsubspacecontentactivity/build.gradle
index bb5ad37..01d6857 100644
--- a/xr/compose/integration-tests/layout/nestedsubspacesetsubspacecontentactivity/build.gradle
+++ b/xr/compose/integration-tests/layout/nestedsubspacesetsubspacecontentactivity/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import androidx.build.AndroidXConfig
-
 plugins {
     id("com.android.application")
     id("AndroidXPlugin")
@@ -46,6 +43,4 @@
     implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
diff --git a/xr/compose/integration-tests/layout/panelvolumeapp/build.gradle b/xr/compose/integration-tests/layout/panelvolumeapp/build.gradle
index e9824f5..01fca76 100644
--- a/xr/compose/integration-tests/layout/panelvolumeapp/build.gradle
+++ b/xr/compose/integration-tests/layout/panelvolumeapp/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import androidx.build.AndroidXConfig
-
 plugins {
     id("com.android.application")
     id("AndroidXPlugin")
@@ -49,6 +46,4 @@
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
     implementation(libs.kotlinCoroutinesGuava)
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
diff --git a/xr/compose/integration-tests/layout/panelvolumeapp/src/main/java/androidx/xr/compose/integration/layout/panelvolumeapp/PanelVolumeApp.kt b/xr/compose/integration-tests/layout/panelvolumeapp/src/main/java/androidx/xr/compose/integration/layout/panelvolumeapp/PanelVolumeApp.kt
index f971dbe..524c9e1 100644
--- a/xr/compose/integration-tests/layout/panelvolumeapp/src/main/java/androidx/xr/compose/integration/layout/panelvolumeapp/PanelVolumeApp.kt
+++ b/xr/compose/integration-tests/layout/panelvolumeapp/src/main/java/androidx/xr/compose/integration/layout/panelvolumeapp/PanelVolumeApp.kt
@@ -51,7 +51,6 @@
 import androidx.xr.compose.subspace.layout.movable
 import androidx.xr.compose.subspace.layout.offset
 import androidx.xr.compose.subspace.layout.scale
-import androidx.xr.compose.subspace.layout.testTag
 import androidx.xr.compose.subspace.layout.width
 import androidx.xr.compose.unit.Meter.Companion.meters
 import androidx.xr.scenecore.GltfModel
@@ -86,11 +85,8 @@
 
         SpatialPanel(
             modifier =
-                SubspaceModifier.width(200.dp)
-                    .height(200.dp)
-                    .offset(y = panelYOffset)
-                    .movable()
-                    .testTag("RootPanel")
+                SubspaceModifier.width(200.dp).height(200.dp).offset(y = panelYOffset).movable(),
+            name = "RootPanel",
         ) {
             Box(
                 modifier = Modifier.background(Color.LightGray).fillMaxSize(),
diff --git a/xr/compose/integration-tests/layout/resizablepanelapp/build.gradle b/xr/compose/integration-tests/layout/resizablepanelapp/build.gradle
index 456aa3d..6846250 100644
--- a/xr/compose/integration-tests/layout/resizablepanelapp/build.gradle
+++ b/xr/compose/integration-tests/layout/resizablepanelapp/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import androidx.build.AndroidXConfig
-
 plugins {
     id("com.android.application")
     id("AndroidXPlugin")
@@ -47,6 +44,4 @@
     implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
-}
+}
\ No newline at end of file
diff --git a/xr/compose/integration-tests/layout/resizablepanelapp/src/main/java/androidx/xr/compose/integration/layout/resizablepanelapp/ResizablePanelApp.kt b/xr/compose/integration-tests/layout/resizablepanelapp/src/main/java/androidx/xr/compose/integration/layout/resizablepanelapp/ResizablePanelApp.kt
index 385811d..c5421ce 100644
--- a/xr/compose/integration-tests/layout/resizablepanelapp/src/main/java/androidx/xr/compose/integration/layout/resizablepanelapp/ResizablePanelApp.kt
+++ b/xr/compose/integration-tests/layout/resizablepanelapp/src/main/java/androidx/xr/compose/integration/layout/resizablepanelapp/ResizablePanelApp.kt
@@ -58,7 +58,6 @@
 import androidx.xr.compose.subspace.layout.offset
 import androidx.xr.compose.subspace.layout.padding
 import androidx.xr.compose.subspace.layout.resizable
-import androidx.xr.compose.subspace.layout.testTag
 import androidx.xr.compose.subspace.layout.width
 import androidx.xr.compose.unit.DpVolumeSize
 
@@ -87,17 +86,15 @@
         // recomposition.
         var onSizeChangeWidth by remember { mutableStateOf(200.dp) }
         var onSizeChangeHeight by remember { mutableStateOf(200.dp) }
-        SpatialColumn(modifier = SubspaceModifier.testTag("PanelGridColumn")) {
+        SpatialColumn(name = "PanelGridColumn") {
             SpatialRow(
                 modifier = SubspaceModifier.fillMaxWidth(),
                 alignment = SpatialAlignment.BottomCenter,
             ) {
                 SpatialColumn(
                     modifier =
-                        SubspaceModifier.width(400.dp)
-                            .fillMaxHeight()
-                            .padding(horizontal = 20.dp)
-                            .testTag("LeftColumn")
+                        SubspaceModifier.width(400.dp).fillMaxHeight().padding(horizontal = 20.dp),
+                    name = "LeftColumn",
                 ) {
                     if (
                         transition.value >= 150f
@@ -134,10 +131,8 @@
                 }
                 SpatialColumn(
                     modifier =
-                        SubspaceModifier.width(600.dp)
-                            .fillMaxHeight()
-                            .padding(horizontal = 20.dp)
-                            .testTag("MiddleColumn")
+                        SubspaceModifier.width(600.dp).fillMaxHeight().padding(horizontal = 20.dp),
+                    name = "MiddleColumn",
                 ) {
                     val density = LocalDensity.current
                     SpatialPanel(
@@ -169,10 +164,8 @@
                 }
                 SpatialColumn(
                     modifier =
-                        SubspaceModifier.width(400.dp)
-                            .fillMaxHeight()
-                            .padding(horizontal = 20.dp)
-                            .testTag("RightColumn")
+                        SubspaceModifier.width(400.dp).fillMaxHeight().padding(horizontal = 20.dp),
+                    name = "RightColumn",
                 ) {
                     SpatialPanel(
                         modifier = SubspaceModifier.width(panelWidth).height(200.dp).fillMaxWidth()
@@ -186,8 +179,8 @@
                             SubspaceModifier.offset(x = 120.dp)
                                 .width(panelWidth)
                                 .height(200.dp)
-                                .resizable(true)
-                                .testTag("ActivityPanel"),
+                                .resizable(true),
+                        name = "ActivityPanel",
                     )
                 }
             }
diff --git a/xr/compose/integration-tests/layout/resizabletoggleapp/build.gradle b/xr/compose/integration-tests/layout/resizabletoggleapp/build.gradle
index 4e1299a..91c9144 100644
--- a/xr/compose/integration-tests/layout/resizabletoggleapp/build.gradle
+++ b/xr/compose/integration-tests/layout/resizabletoggleapp/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import androidx.build.AndroidXConfig
-
 plugins {
     id("com.android.application")
     id("AndroidXPlugin")
@@ -46,6 +43,4 @@
     implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
-}
+}
\ No newline at end of file
diff --git a/xr/compose/integration-tests/layout/rotationapp/build.gradle b/xr/compose/integration-tests/layout/rotationapp/build.gradle
index 5883140..03b26e3 100644
--- a/xr/compose/integration-tests/layout/rotationapp/build.gradle
+++ b/xr/compose/integration-tests/layout/rotationapp/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 
 plugins {
@@ -48,8 +47,6 @@
     implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/compose/integration-tests/layout/rotationapp/src/main/java/androidx/xr/compose/integration/layout/rotationapp/RotationApp.kt b/xr/compose/integration-tests/layout/rotationapp/src/main/java/androidx/xr/compose/integration/layout/rotationapp/RotationApp.kt
index 80e6950..0808239 100644
--- a/xr/compose/integration-tests/layout/rotationapp/src/main/java/androidx/xr/compose/integration/layout/rotationapp/RotationApp.kt
+++ b/xr/compose/integration-tests/layout/rotationapp/src/main/java/androidx/xr/compose/integration/layout/rotationapp/RotationApp.kt
@@ -53,7 +53,6 @@
 import androidx.xr.compose.subspace.layout.padding
 import androidx.xr.compose.subspace.layout.rotate
 import androidx.xr.compose.subspace.layout.size
-import androidx.xr.compose.subspace.layout.testTag
 import androidx.xr.compose.subspace.layout.width
 import androidx.xr.runtime.math.Vector3
 import kotlin.math.floor
@@ -109,62 +108,66 @@
                     ),
             )
 
-        SpatialColumn(SubspaceModifier.testTag("OutermostContainer")) {
-            SpatialRow(SubspaceModifier.testTag("StatusRow")) {
+        SpatialColumn(name = "OutermostContainer") {
+            SpatialRow(name = "StatusRow") {
                 AppPanel(
-                    modifier = SubspaceModifier.height(80.dp).testTag("StatusPanel"),
+                    modifier = SubspaceModifier.height(80.dp),
+                    name = "StatusPanel",
                     text = "Rotation Axis: ${axisAngle.x}, ${axisAngle.y}, ${axisAngle.z}",
                 )
             }
-            SpatialRow(SubspaceModifier.testTag("ContentRow")) {
+            SpatialRow(name = "ContentRow") {
                 SpatialColumn(
-                    modifier =
-                        SubspaceModifier.rotate(axisAngle, rotationValue).testTag("RotatingColumn")
+                    modifier = SubspaceModifier.rotate(axisAngle, rotationValue),
+                    name = "RotatingColumn",
                 ) {
                     val rotatedColumnPanelModifier = SubspaceModifier.size(200.dp).padding(20.dp)
                     AppPanel(
-                        modifier = rotatedColumnPanelModifier.testTag("TopPanelRotatingColumn"),
+                        modifier = rotatedColumnPanelModifier,
+                        name = "TopPanelRotatingColumn",
                         text = "Top panel: ${rotationValue.roundToInt()}",
                     )
                     AppPanel(
-                        modifier = rotatedColumnPanelModifier.testTag("CenterPanelRotatingColumn"),
+                        modifier = rotatedColumnPanelModifier,
+                        name = "CenterPanelRotatingColumn",
                         text = "Center panel: ${rotationValue.roundToInt()}",
                     )
                     AppPanel(
-                        modifier = rotatedColumnPanelModifier.testTag("BottomPanelRotatingColumn"),
+                        modifier = rotatedColumnPanelModifier,
+                        name = "BottomPanelRotatingColumn",
                         text = "Bottom panel: ${rotationValue.roundToInt()}",
                     )
                 }
-                SpatialColumn(SubspaceModifier.testTag("RightmostColumn")) {
+                SpatialColumn(name = "RightmostColumn") {
                     val rotatedRowPanelModifier = SubspaceModifier.size(200.dp).padding(20.dp)
                     SpatialRow(
-                        modifier =
-                            SubspaceModifier.rotate(axisAngle, rotationValue).testTag("RotatingRow")
+                        modifier = SubspaceModifier.rotate(axisAngle, rotationValue),
+                        name = "RotatingRow",
                     ) {
                         AppPanel(
-                            modifier = rotatedRowPanelModifier.testTag("LeftPanelRotatingRow"),
+                            modifier = rotatedRowPanelModifier,
+                            name = "RightPanelRotatingRow",
                             text = "Left panel: ${rotationValue.roundToInt()}",
                         )
                         AppPanel(
-                            modifier = rotatedRowPanelModifier.testTag("CenterPanelRotatingRow"),
+                            modifier = rotatedRowPanelModifier,
+                            name = "CenterPanelRotatingRow",
                             text = "Center panel: ${rotationValue.roundToInt()}",
                         )
                         AppPanel(
-                            modifier = rotatedRowPanelModifier.testTag("RightPanelRotatingRow"),
+                            modifier = rotatedRowPanelModifier,
+                            name = "LeftPanelRotatingRow",
                             text = "Right panel: ${rotationValue.roundToInt()}",
                         )
                     }
-                    SpatialRow(
-                        modifier = SubspaceModifier.testTag("RowWithRotatingPanel"),
-                        alignment = SpatialAlignment.Center,
-                    ) {
+                    SpatialRow(alignment = SpatialAlignment.Center, name = "RowWithRotatingPanel") {
                         AppPanel(
                             modifier =
                                 SubspaceModifier.width(400.dp)
                                     .height(400.dp)
                                     .padding(20.dp)
-                                    .rotate(axisAngle, rotationValue)
-                                    .testTag("RotatingPanel"),
+                                    .rotate(axisAngle, rotationValue),
+                            name = "RotatingPanel",
                             text = "Rotating Panel: ${rotationValue.roundToInt()}",
                         )
                     }
@@ -175,8 +178,8 @@
 
     @SubspaceComposable
     @Composable
-    fun AppPanel(modifier: SubspaceModifier = SubspaceModifier, text: String = "") {
-        SpatialPanel(modifier = modifier) { PanelContent(text) }
+    fun AppPanel(modifier: SubspaceModifier = SubspaceModifier, name: String, text: String = "") {
+        SpatialPanel(modifier = modifier, name = name) { PanelContent(text) }
     }
 
     @UiComposable
diff --git a/xr/compose/integration-tests/layout/spatialcomposeapp/build.gradle b/xr/compose/integration-tests/layout/spatialcomposeapp/build.gradle
index 5b95d7b..38b81da0c 100644
--- a/xr/compose/integration-tests/layout/spatialcomposeapp/build.gradle
+++ b/xr/compose/integration-tests/layout/spatialcomposeapp/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 
 plugins {
@@ -52,12 +51,10 @@
     implementation("androidx.compose.ui:ui:1.7.0")
     implementation("androidx.compose.ui:ui-tooling-preview:1.7.0")
     implementation("androidx.compose.material:material-icons-core:1.6.7")
-    implementation("androidx.compose.material3:material3:1.4.0-alpha01")
+    implementation("androidx.compose.material3:material3:1.3.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
     implementation(libs.kotlinCoroutinesGuava)
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/compose/integration-tests/layout/spatialcomposeapp/src/main/java/androidx/xr/compose/integration/layout/spatialcomposeapp/SpatialComposeAppActivity.kt b/xr/compose/integration-tests/layout/spatialcomposeapp/src/main/java/androidx/xr/compose/integration/layout/spatialcomposeapp/SpatialComposeAppActivity.kt
index 49d1929..20a5993 100644
--- a/xr/compose/integration-tests/layout/spatialcomposeapp/src/main/java/androidx/xr/compose/integration/layout/spatialcomposeapp/SpatialComposeAppActivity.kt
+++ b/xr/compose/integration-tests/layout/spatialcomposeapp/src/main/java/androidx/xr/compose/integration/layout/spatialcomposeapp/SpatialComposeAppActivity.kt
@@ -39,14 +39,11 @@
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Check
-import androidx.compose.material.icons.filled.Lock
 import androidx.compose.material3.Button
-import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
 import androidx.compose.material3.Icon
 import androidx.compose.material3.IconButton
 import androidx.compose.material3.Surface
 import androidx.compose.material3.Text
-import androidx.compose.material3.ToggleButton
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.derivedStateOf
@@ -75,9 +72,9 @@
 import androidx.xr.compose.spatial.Subspace
 import androidx.xr.compose.subspace.MainPanel
 import androidx.xr.compose.subspace.SpatialColumn
-import androidx.xr.compose.subspace.SpatialCurvedRow
 import androidx.xr.compose.subspace.SpatialLayoutSpacer
 import androidx.xr.compose.subspace.SpatialPanel
+import androidx.xr.compose.subspace.SpatialRow
 import androidx.xr.compose.subspace.SubspaceComposable
 import androidx.xr.compose.subspace.Volume
 import androidx.xr.compose.subspace.layout.SpatialAlignment
@@ -87,11 +84,8 @@
 import androidx.xr.compose.subspace.layout.fillMaxHeight
 import androidx.xr.compose.subspace.layout.fillMaxWidth
 import androidx.xr.compose.subspace.layout.height
-import androidx.xr.compose.subspace.layout.movable
 import androidx.xr.compose.subspace.layout.offset
 import androidx.xr.compose.subspace.layout.padding
-import androidx.xr.compose.subspace.layout.resizable
-import androidx.xr.compose.subspace.layout.testTag
 import androidx.xr.compose.subspace.layout.width
 import androidx.xr.compose.unit.Meter.Companion.meters
 import androidx.xr.runtime.math.Pose
@@ -157,15 +151,6 @@
                 ) {
                     Text("Switch Space Mode")
                 }
-                Button(
-                    onClick = {
-                        val intent =
-                            Intent(this@SpatialComposeAppActivity, VideoPlayerActivity::class.java)
-                        startActivity(intent)
-                    }
-                ) {
-                    Text("Launch Video Player")
-                }
             }
         }
     }
@@ -175,14 +160,16 @@
     fun PanelGrid() {
         val sidePanelModifier = SubspaceModifier.fillMaxWidth().height(200.dp)
         val curveRadius = 1025.dp
-        SpatialColumn(SubspaceModifier.testTag("PanelGridColumn")) {
-            SpatialCurvedRow(
-                modifier = SubspaceModifier.width(2000.dp).height(1200.dp).testTag("PanelGridRow"),
+        SpatialColumn(name = "PanelGridColumn") {
+            SpatialRow(
+                modifier = SubspaceModifier.width(2000.dp).height(1200.dp),
                 alignment = SpatialAlignment.BottomCenter,
                 curveRadius = curveRadius,
+                name = "PanelGridRow",
             ) {
                 SpatialColumn(
-                    modifier = SubspaceModifier.width(200.dp).fillMaxHeight().testTag("LeftColumn")
+                    modifier = SubspaceModifier.width(200.dp).fillMaxHeight(),
+                    name = "LeftColumn",
                 ) {
                     Orbiter(
                         position = OrbiterEdge.Start,
@@ -206,22 +193,21 @@
                 }
                 SpatialColumn(
                     modifier =
-                        SubspaceModifier.width(800.dp)
-                            .fillMaxHeight()
-                            .padding(horizontal = 20.dp)
-                            .testTag("CenterColumn"),
+                        SubspaceModifier.width(800.dp).fillMaxHeight().padding(horizontal = 20.dp),
                     alignment = SpatialAlignment.TopCenter,
+                    name = "CenterColumn",
                 ) {
                     MainPanel(modifier = SubspaceModifier.fillMaxWidth().height(600.dp))
                     SpatialPanel(
-                        modifier =
-                            SubspaceModifier.fillMaxWidth().height(400.dp).testTag("ActivityPanel"),
+                        modifier = SubspaceModifier.fillMaxWidth().height(400.dp),
+                        name = "ActivityPanel",
                         intent =
                             Intent(this@SpatialComposeAppActivity, AnotherActivity::class.java),
                     )
                 }
                 SpatialColumn(
-                    modifier = SubspaceModifier.width(200.dp).fillMaxHeight().testTag("RightColumn")
+                    modifier = SubspaceModifier.width(200.dp).fillMaxHeight(),
+                    name = "RightColumn",
                 ) {
                     AppPanel(modifier = sidePanelModifier, text = "Panel Top Right")
                     SpatialLayoutSpacer(modifier = SubspaceModifier.height(20.dp))
@@ -231,35 +217,20 @@
         }
     }
 
-    @OptIn(ExperimentalMaterial3ExpressiveApi::class)
     @SubspaceComposable
     @Composable
     fun AppPanel(modifier: SubspaceModifier = SubspaceModifier, text: String = "") {
-        var moveResizeLocked by remember { mutableStateOf(true) }
-        SpatialPanel(
-            modifier =
-                modifier
-                    .testTag(text)
-                    .movable(enabled = !moveResizeLocked)
-                    .resizable(enabled = !moveResizeLocked)
-        ) {
-            PanelContent { Text(text) }
+        SpatialPanel(modifier = modifier, name = text) { PanelContent(text) }
+    }
 
-            Orbiter(
-                position = OrbiterEdge.Bottom,
-                offset = 24.dp,
-                shape = SpatialRoundedCornerShape(size = CornerSize(50)),
-                settings = OrbiterSettings(shouldRenderInNonSpatial = false),
-            ) {
-                ToggleButton(
-                    checked = moveResizeLocked,
-                    onCheckedChange = { moveResizeLocked = !moveResizeLocked },
-                ) {
-                    Icon(
-                        imageVector = Icons.Filled.Lock,
-                        contentDescription =
-                            if (moveResizeLocked) "Enable Move/Resize" else "Disable Move/Resize",
-                    )
+    @UiComposable
+    @SubspaceComposable
+    @Composable
+    fun PanelContent(vararg texts: String) {
+        PanelContent {
+            Column {
+                for (text in texts) {
+                    Text(text)
                 }
             }
         }
@@ -268,7 +239,6 @@
     @UiComposable
     @Composable
     fun PanelContent(content: @Composable () -> Unit) {
-        var showArrows by remember { mutableStateOf(false) }
         var addHighlight by remember { mutableStateOf(false) }
         val borderWidth by remember { derivedStateOf { if (addHighlight) 3.dp else 0.dp } }
         var showDialog by remember { mutableStateOf(false) }
@@ -280,9 +250,6 @@
             horizontalAlignment = Alignment.CenterHorizontally,
             verticalArrangement = Arrangement.Center,
         ) {
-            if (showArrows) {
-                Subspace { XyzArrows() }
-            }
             content()
             Orbiter(
                 position = OrbiterEdge.End,
@@ -291,10 +258,7 @@
                 settings = OrbiterSettings(shouldRenderInNonSpatial = false),
             ) {
                 IconButton(
-                    onClick = {
-                        addHighlight = !addHighlight
-                        showArrows = !showArrows
-                    },
+                    onClick = { addHighlight = !addHighlight },
                     modifier = Modifier.background(Color.Gray),
                 ) {
                     Icon(imageVector = Icons.Filled.Check, contentDescription = "Add highlight")
@@ -338,7 +302,6 @@
         SpatialPanel(view = textView, modifier = modifier)
     }
 
-    @SubspaceComposable
     @Composable
     fun XyzArrows(modifier: SubspaceModifier = SubspaceModifier) {
         val session =
diff --git a/xr/compose/integration-tests/layout/spatialcomposeapp/src/main/java/androidx/xr/compose/integration/layout/spatialcomposeapp/VideoPlayerActivity.kt b/xr/compose/integration-tests/layout/spatialcomposeapp/src/main/java/androidx/xr/compose/integration/layout/spatialcomposeapp/VideoPlayerActivity.kt
deleted file mode 100644
index d5c9204..0000000
--- a/xr/compose/integration-tests/layout/spatialcomposeapp/src/main/java/androidx/xr/compose/integration/layout/spatialcomposeapp/VideoPlayerActivity.kt
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.compose.integration.layout.spatialcomposeapp
-
-import android.media.MediaPlayer
-import android.os.Bundle
-import android.util.Log
-import androidx.activity.ComponentActivity
-import androidx.activity.compose.BackHandler
-import androidx.activity.compose.setContent
-import androidx.compose.foundation.background
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.padding
-import androidx.compose.material3.Button
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.ComposeView
-import androidx.compose.ui.platform.ViewCompositionStrategy
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.sp
-import androidx.xr.compose.spatial.Subspace
-import androidx.xr.compose.subspace.SpatialPanel
-import androidx.xr.compose.subspace.layout.SubspaceModifier
-import androidx.xr.compose.subspace.layout.height
-import androidx.xr.compose.subspace.layout.movable
-import androidx.xr.compose.subspace.layout.width
-import androidx.xr.runtime.math.Pose
-import androidx.xr.runtime.math.Quaternion
-import androidx.xr.runtime.math.Vector3
-import androidx.xr.scenecore.Dimensions
-import androidx.xr.scenecore.MovableComponent
-import androidx.xr.scenecore.PanelEntity
-import androidx.xr.scenecore.PixelDimensions
-import androidx.xr.scenecore.Session
-import androidx.xr.scenecore.SurfaceEntity
-
-/**
- * This is a sample activity that shows how to use Compose XR to create a SurfaceEntity and use it
- * to display a video.
- */
-class VideoPlayerActivity : ComponentActivity() {
-    private lateinit var mediaPlayer: MediaPlayer
-
-    private val session by lazy { Session.create(this) }
-
-    private var surfaceEntity: SurfaceEntity? = null
-    private var movableComponent: MovableComponent? = null
-    private var videoPlaying by mutableStateOf<Boolean>(false)
-    private var controlPanelEntity: PanelEntity? = null
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        session.spatialEnvironment.setPassthroughOpacityPreference(0.0f)
-        setContent { Subspace { SurfaceEntityContent(session) } }
-    }
-
-    /** Sets up the surface entity */
-    @Composable
-    private fun SurfaceEntityContent(session: Session) {
-
-        SpatialPanel(SubspaceModifier.height(600.dp).width(600.dp).movable()) {
-            Box(
-                modifier = Modifier.background(Color.LightGray).fillMaxSize(),
-                contentAlignment = Alignment.Center,
-            ) {
-                BackHandler {
-                    Log.i(
-                        "BackHandler",
-                        "Gnav BACK is being handled by Surface Entity back handler"
-                    )
-                    destroySurfaceEntity()
-                    finish()
-                }
-                VideoPlayerTestActivityUI(session)
-            }
-        }
-    }
-
-    @Composable
-    fun BigBuckBunnyButton() {
-        Button(
-            onClick = {
-                surfaceEntity =
-                    SurfaceEntity.create(
-                        session,
-                        SurfaceEntity.StereoMode.TOP_BOTTOM,
-                        Pose(Vector3(0f, 0.0f, 0.1f), Quaternion(0.0f, 0.0f, 0.0f, 1.0f)),
-                    )
-                // Make the video player movable (to make it easier to look at it from different
-                // angles and distances)
-                movableComponent = MovableComponent.create(session)
-
-                // The quad has a radius of 1.0 meters
-                movableComponent!!.size = Dimensions(1.0f, 1.0f, 1.0f)
-
-                @Suppress("UNUSED_VARIABLE")
-                val unused = surfaceEntity!!.addComponent(movableComponent!!)
-
-                // Set up MediaPlayer
-                mediaPlayer = MediaPlayer()
-                mediaPlayer.setSurface(surfaceEntity!!.getSurface())
-
-                // For Testers: This file should be packaged with the APK.
-                mediaPlayer.setDataSource(assets.openFd("vid_bigbuckbunny.mp4"))
-
-                mediaPlayer.setOnCompletionListener { mediaPlayer.release() }
-                mediaPlayer.setOnVideoSizeChangedListener { _, width, height ->
-                    check(width >= 0 && height >= 0) { "Video dimensions must be positive" }
-                    // Resize the canvas to match the video aspect ratio - accounting for the stereo
-                    // mode.
-                    var dimensions =
-                        getCanvasAspectRatio(SurfaceEntity.StereoMode.TOP_BOTTOM, width, height)
-                    surfaceEntity!!.canvasShape =
-                        SurfaceEntity.CanvasShape.Quad(dimensions.width, dimensions.height)
-
-                    // Resize the MovableComponent to match the canvas dimensions.
-                    movableComponent!!.size = surfaceEntity!!.dimensions
-                }
-                mediaPlayer.setOnPreparedListener { mediaPlayer.start() }
-                mediaPlayer.prepareAsync()
-                videoPlaying = true
-            }
-        ) {
-            Text(text = "Play Big Buck Bunny", fontSize = 20.sp)
-        }
-    }
-
-    @Composable
-    fun VideoPlayerControls() {
-        Column(
-            horizontalAlignment = Alignment.CenterHorizontally,
-            verticalArrangement = Arrangement.Center,
-        ) {
-            Row(verticalAlignment = Alignment.CenterVertically) {
-                Button(onClick = { destroySurfaceEntity() }) {
-                    Text(text = "End Video", fontSize = 10.sp)
-                }
-            }
-            Row(verticalAlignment = Alignment.CenterVertically) {
-                Button(
-                    onClick = {
-                        surfaceEntity!!.canvasShape = SurfaceEntity.CanvasShape.Quad(1.0f, 1.0f)
-                        // Move the Quad-shaped canvas to a spot in front of the User.
-                        surfaceEntity!!.setPose(
-                            session.spatialUser.head?.transformPoseTo(
-                                Pose(
-                                    Vector3(0.0f, 0.0f, -1.5f),
-                                    Quaternion(0.0f, 0.0f, 0.0f, 1.0f)
-                                ),
-                                session.activitySpace,
-                            )!!
-                        )
-                    }
-                ) {
-                    Text(text = "Set Quad", fontSize = 10.sp)
-                }
-                Button(
-                    onClick = {
-                        surfaceEntity!!.canvasShape = SurfaceEntity.CanvasShape.Vr360Sphere(1.0f)
-                    }
-                ) {
-                    Text(text = "Set Vr360", fontSize = 10.sp)
-                }
-                Button(
-                    onClick = {
-                        surfaceEntity!!.canvasShape =
-                            SurfaceEntity.CanvasShape.Vr180Hemisphere(1.0f)
-                    }
-                ) {
-                    Text(text = "Set Vr180", fontSize = 10.sp)
-                }
-            } // end row
-            Row(verticalAlignment = Alignment.CenterVertically) {
-                Button(onClick = { surfaceEntity!!.stereoMode = SurfaceEntity.StereoMode.MONO }) {
-                    Text(text = "Mono", fontSize = 10.sp)
-                }
-                Button(
-                    onClick = { surfaceEntity!!.stereoMode = SurfaceEntity.StereoMode.TOP_BOTTOM }
-                ) {
-                    Text(text = "Top-Bottom", fontSize = 10.sp)
-                }
-                Button(
-                    onClick = { surfaceEntity!!.stereoMode = SurfaceEntity.StereoMode.SIDE_BY_SIDE }
-                ) {
-                    Text(text = "Side-by-Side", fontSize = 10.sp)
-                }
-            } // end row
-        } // end column
-    }
-
-    private fun setupControlPanel() {
-        // Technically this leaks, but it's a sample / test app.
-        val panelContentView =
-            ComposeView(this).apply {
-                setViewCompositionStrategy(
-                    ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
-                )
-                setContent { VideoPlayerControls() }
-            }
-
-        controlPanelEntity =
-            PanelEntity.create(
-                session,
-                panelContentView,
-                pixelDimensions = PixelDimensions(640, 480),
-                "playerControls",
-                Pose(Vector3(0.0f, -0.4f, -0.85f)), // kind of low, but within a 1m radius
-            )
-        controlPanelEntity!!.setParent(surfaceEntity!!)
-    }
-
-    fun destroySurfaceEntity() {
-        if (surfaceEntity == null) {
-            return
-        }
-        if (::mediaPlayer.isInitialized) {
-            mediaPlayer.release()
-        }
-        videoPlaying = false
-        surfaceEntity!!.dispose()
-        surfaceEntity = null
-    }
-
-    fun getCanvasAspectRatio(stereoMode: Int, videoWidth: Int, videoHeight: Int): Dimensions {
-        when (stereoMode) {
-            SurfaceEntity.StereoMode.MONO ->
-                return Dimensions(1.0f, videoHeight.toFloat() / videoWidth, 0.0f)
-            SurfaceEntity.StereoMode.TOP_BOTTOM ->
-                return Dimensions(1.0f, 0.5f * videoHeight.toFloat() / videoWidth, 0.0f)
-            SurfaceEntity.StereoMode.SIDE_BY_SIDE ->
-                return Dimensions(1.0f, 2.0f * videoHeight.toFloat() / videoWidth, 0.0f)
-            else -> throw IllegalArgumentException("Unsupported stereo mode: $stereoMode")
-        }
-    }
-
-    @Composable
-    fun VideoPlayerTestActivityUI(session: Session) {
-        val movableComponentMP = remember { mutableStateOf<MovableComponent?>(null) }
-        val videoPaused = remember { mutableStateOf(false) }
-        movableComponentMP.value = MovableComponent.create(session)
-        @Suppress("UNUSED_VARIABLE")
-        val unused = session.mainPanelEntity.addComponent(movableComponentMP.value!!)
-        Row(modifier = Modifier.fillMaxWidth().padding(16.dp)) {
-            Column(
-                verticalArrangement = Arrangement.Center,
-                modifier = Modifier.weight(1f).padding(8.dp),
-            ) {
-                Text(text = "(Stereo) SurfaceEntity", fontSize = 50.sp)
-                if (videoPlaying == false) {
-                    // High level testcases
-                    BigBuckBunnyButton()
-                } else {
-                    Column(
-                        verticalArrangement = Arrangement.Center,
-                        modifier = Modifier.weight(1f).padding(8.dp),
-                    ) {
-                        VideoPlayerControls()
-                        Button(
-                            onClick = {
-                                videoPaused.value = !videoPaused.value
-                                if (videoPaused.value) {
-                                    mediaPlayer.pause()
-                                } else {
-                                    mediaPlayer.start()
-                                }
-                            }
-                        ) {
-                            Text(text = "Toggle Pause Stereo video", fontSize = 30.sp)
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/xr/compose/integration-tests/layout/uxtestapp/build.gradle b/xr/compose/integration-tests/layout/uxtestapp/build.gradle
index e2105cc..c316112 100644
--- a/xr/compose/integration-tests/layout/uxtestapp/build.gradle
+++ b/xr/compose/integration-tests/layout/uxtestapp/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import androidx.build.AndroidXConfig
-
 plugins {
     id("com.android.application")
     id("AndroidXPlugin")
@@ -47,6 +44,4 @@
     implementation("androidx.compose.material:material:1.7.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
-}
+}
\ No newline at end of file
diff --git a/xr/compose/integration-tests/mediaplayerapp/build.gradle b/xr/compose/integration-tests/mediaplayerapp/build.gradle
index 128c929..eb28c13 100644
--- a/xr/compose/integration-tests/mediaplayerapp/build.gradle
+++ b/xr/compose/integration-tests/mediaplayerapp/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 
 plugins {
@@ -50,8 +49,6 @@
     implementation("androidx.compose.ui:ui:1.7.0")
     implementation("androidx.compose.ui:ui-tooling-preview:1.7.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/compose/integration-tests/spatialelevation/build.gradle b/xr/compose/integration-tests/spatialelevation/build.gradle
index b3a38e3..312927a 100644
--- a/xr/compose/integration-tests/spatialelevation/build.gradle
+++ b/xr/compose/integration-tests/spatialelevation/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 
 plugins {
@@ -50,8 +49,6 @@
     implementation("androidx.compose.ui:ui:1.7.0")
     implementation("androidx.compose.ui:ui-tooling-preview:1.7.0")
     implementation("androidx.compose.runtime:runtime:1.8.0-alpha06")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/compose/integration-tests/subspacecomposableapp/build.gradle b/xr/compose/integration-tests/subspacecomposableapp/build.gradle
index 682eb35..23fa601 100644
--- a/xr/compose/integration-tests/subspacecomposableapp/build.gradle
+++ b/xr/compose/integration-tests/subspacecomposableapp/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import androidx.build.AndroidXConfig
-
 plugins {
     id("com.android.application")
     id("AndroidXPlugin")
@@ -50,6 +47,4 @@
     implementation("androidx.compose.foundation:foundation-layout:1.8.0-alpha06")
     implementation(libs.kotlinCoroutinesGuava)
     implementation("androidx.navigation:navigation-compose:2.7.6")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
-}
+}
\ No newline at end of file
diff --git a/xr/compose/integration-tests/subspacecomposableapp/src/main/java/androidx/xr/compose/integration/subspacecomposableapp/SubspaceComposableApp.kt b/xr/compose/integration-tests/subspacecomposableapp/src/main/java/androidx/xr/compose/integration/subspacecomposableapp/SubspaceComposableApp.kt
index be222dad..1802871 100644
--- a/xr/compose/integration-tests/subspacecomposableapp/src/main/java/androidx/xr/compose/integration/subspacecomposableapp/SubspaceComposableApp.kt
+++ b/xr/compose/integration-tests/subspacecomposableapp/src/main/java/androidx/xr/compose/integration/subspacecomposableapp/SubspaceComposableApp.kt
@@ -76,7 +76,6 @@
 import androidx.xr.compose.spatial.OrbiterEdge
 import androidx.xr.compose.spatial.Subspace
 import androidx.xr.compose.subspace.SpatialColumn
-import androidx.xr.compose.subspace.SpatialCurvedRow
 import androidx.xr.compose.subspace.SpatialLayoutSpacer
 import androidx.xr.compose.subspace.SpatialPanel
 import androidx.xr.compose.subspace.SpatialRow
@@ -233,7 +232,7 @@
                     }
                 }
             }
-            SpatialCurvedRow(
+            SpatialRow(
                 modifier = SubspaceModifier.width(2000.dp).height(600.dp),
                 alignment = SpatialAlignment.BottomCenter,
                 curveRadius = curveRadius,
diff --git a/xr/compose/material3/integration-tests/testapp/build.gradle b/xr/compose/material3/integration-tests/testapp/build.gradle
index 86585ec..e734047 100644
--- a/xr/compose/material3/integration-tests/testapp/build.gradle
+++ b/xr/compose/material3/integration-tests/testapp/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 
 plugins {
@@ -28,7 +27,7 @@
     implementation(libs.kotlinStdlib)
 
     implementation(project(":appcompat:appcompat"))
-    implementation("androidx.activity:activity-compose:1.10.1")
+    implementation(project(":activity:activity-compose"))
     implementation(project(":compose:foundation:foundation"))
     implementation(project(":compose:foundation:foundation-layout"))
     implementation(project(":compose:material3:material3"))
@@ -48,8 +47,6 @@
     implementation(project(":xr:compose:compose"))
     implementation(project(":xr:scenecore:scenecore"))
 
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
-
     // TODO(b/374796755): Write unit-tests for this test app
 }
 
diff --git a/xr/runtime/runtime-openxr/api/restricted_current.txt b/xr/runtime/runtime-openxr/api/restricted_current.txt
index de3e528..17531b2 100644
--- a/xr/runtime/runtime-openxr/api/restricted_current.txt
+++ b/xr/runtime/runtime-openxr/api/restricted_current.txt
@@ -22,7 +22,7 @@
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class HandState {
     ctor public HandState();
-    ctor public HandState(optional androidx.xr.runtime.internal.TrackingState trackingState, optional java.util.List<androidx.xr.runtime.math.Pose> handJoints);
+    ctor public HandState(optional boolean isActive, optional java.util.List<androidx.xr.runtime.math.Pose> handJoints);
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class HitData {
@@ -55,11 +55,11 @@
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class OpenXrHand implements androidx.xr.runtime.internal.Hand {
-    method public java.nio.ByteBuffer getHandJointsBuffer();
-    method public androidx.xr.runtime.internal.TrackingState getTrackingState();
+    method public java.util.Map<androidx.xr.runtime.internal.HandJointType,androidx.xr.runtime.math.Pose> getHandJoints();
+    method public boolean isActive();
     method public void update(long xrTime);
-    property public java.nio.ByteBuffer handJointsBuffer;
-    property public androidx.xr.runtime.internal.TrackingState trackingState;
+    property public java.util.Map<androidx.xr.runtime.internal.HandJointType,androidx.xr.runtime.math.Pose> handJoints;
+    property public boolean isActive;
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class OpenXrManager implements androidx.xr.runtime.internal.LifecycleManager {
diff --git a/xr/runtime/runtime-openxr/dependencyAnalysis-baseline.json b/xr/runtime/runtime-openxr/dependencyAnalysis-baseline.json
index cc63f523..b4a8cdb 100644
--- a/xr/runtime/runtime-openxr/dependencyAnalysis-baseline.json
+++ b/xr/runtime/runtime-openxr/dependencyAnalysis-baseline.json
@@ -4,6 +4,14 @@
     {
       "coordinates": {
         "type": "module",
+        "identifier": "androidx.annotation:annotation",
+        "resolvedVersion": "1.8.1"
+      },
+      "fromConfiguration": "implementation"
+    },
+    {
+      "coordinates": {
+        "type": "module",
         "identifier": "androidx.appcompat:appcompat",
         "resolvedVersion": "1.2.0"
       },
diff --git a/xr/runtime/runtime-openxr/src/androidTest/kotlin/androidx/xr/runtime/openxr/HandStateTest.kt b/xr/runtime/runtime-openxr/src/androidTest/kotlin/androidx/xr/runtime/openxr/HandStateTest.kt
index 743ca6e..dd3bdb8 100644
--- a/xr/runtime/runtime-openxr/src/androidTest/kotlin/androidx/xr/runtime/openxr/HandStateTest.kt
+++ b/xr/runtime/runtime-openxr/src/androidTest/kotlin/androidx/xr/runtime/openxr/HandStateTest.kt
@@ -18,7 +18,6 @@
 
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
-import androidx.xr.runtime.internal.TrackingState
 import kotlin.test.assertFailsWith
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -29,8 +28,6 @@
 
     @Test
     fun constructor_ActiveButNoHandJoints_throwsIllegalArgumentException() {
-        assertFailsWith<IllegalArgumentException> {
-            HandState(trackingState = TrackingState.Tracking, emptyList())
-        }
+        assertFailsWith<IllegalArgumentException> { HandState(isActive = true, emptyList()) }
     }
 }
diff --git a/xr/runtime/runtime-openxr/src/androidTest/kotlin/androidx/xr/runtime/openxr/OpenXrHandTest.kt b/xr/runtime/runtime-openxr/src/androidTest/kotlin/androidx/xr/runtime/openxr/OpenXrHandTest.kt
index 0066c00..c9f4907 100644
--- a/xr/runtime/runtime-openxr/src/androidTest/kotlin/androidx/xr/runtime/openxr/OpenXrHandTest.kt
+++ b/xr/runtime/runtime-openxr/src/androidTest/kotlin/androidx/xr/runtime/openxr/OpenXrHandTest.kt
@@ -22,7 +22,6 @@
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.xr.runtime.internal.HandJointType
-import androidx.xr.runtime.internal.TrackingState
 import androidx.xr.runtime.math.Quaternion
 import androidx.xr.runtime.math.Vector3
 import com.google.common.truth.Truth.assertThat
@@ -58,14 +57,14 @@
     @Test
     fun update_updatesActiveStatus() = initOpenXrManagerAndRunTest {
         val xrTime = 50L * 1_000_000 // 50 milliseconds in nanoseconds.
-        check(underTest.trackingState != TrackingState.Tracking)
+        check(!underTest.isActive)
 
         underTest.update(xrTime)
 
         // TODO - b/346615429: Define values here using the stub's Kotlin API. For the time being
         // they
         // come from `kPose` defined in //third_party/jetpack_xr_natives/openxr/openxr_stub.cc
-        assertThat(underTest.trackingState).isEqualTo(TrackingState.Tracking)
+        assertThat(underTest.isActive).isTrue()
     }
 
     @Test
@@ -78,24 +77,11 @@
         // TODO - b/346615429: Define values here using the stub's Kotlin API. For the time being
         // they
         // come from `kPose` defined in //third_party/jetpack_xr_natives/openxr/openxr_stub.cc
-        val fetchedHandJoints = underTest.handJoints
-        assertThat(fetchedHandJoints.size).isEqualTo(HandJointType.values().size)
-        for (jointType in HandJointType.values()) {
-            val jointTypeIndex = jointType.ordinal.toFloat()
-            assertThat(underTest.handJoints[jointType]!!.rotation)
-                .isEqualTo(
-                    Quaternion(
-                        jointTypeIndex + 0.1f,
-                        jointTypeIndex + 0.2f,
-                        jointTypeIndex + 0.3f,
-                        jointTypeIndex + 0.4f,
-                    )
-                )
-            assertThat(underTest.handJoints[jointType]!!.translation)
-                .isEqualTo(
-                    Vector3(jointTypeIndex + 0.5f, jointTypeIndex + 0.6f, jointTypeIndex + 0.7f)
-                )
-        }
+        assertThat(underTest.handJoints).hasSize(1)
+        assertThat(underTest.handJoints[HandJointType.PALM]!!.rotation)
+            .isEqualTo(Quaternion(1.0f, 2.0f, 3.0f, 4.0f))
+        assertThat(underTest.handJoints[HandJointType.PALM]!!.translation)
+            .isEqualTo(Vector3(5.0f, 6.0f, 7.0f))
     }
 
     private fun initOpenXrManagerAndRunTest(testBody: () -> Unit) {
diff --git a/xr/runtime/runtime-openxr/src/androidTest/kotlin/androidx/xr/runtime/openxr/OpenXrPerceptionManagerTest.kt b/xr/runtime/runtime-openxr/src/androidTest/kotlin/androidx/xr/runtime/openxr/OpenXrPerceptionManagerTest.kt
index f437ba4..32ec004 100644
--- a/xr/runtime/runtime-openxr/src/androidTest/kotlin/androidx/xr/runtime/openxr/OpenXrPerceptionManagerTest.kt
+++ b/xr/runtime/runtime-openxr/src/androidTest/kotlin/androidx/xr/runtime/openxr/OpenXrPerceptionManagerTest.kt
@@ -23,7 +23,6 @@
 import androidx.test.filters.SdkSuppress
 import androidx.xr.runtime.internal.AnchorResourcesExhaustedException
 import androidx.xr.runtime.internal.HandJointType
-import androidx.xr.runtime.internal.TrackingState
 import androidx.xr.runtime.math.Pose
 import androidx.xr.runtime.math.Quaternion
 import androidx.xr.runtime.math.Ray
@@ -124,53 +123,26 @@
     @Test
     fun update_updatesHands() = initOpenXrManagerAndRunTest {
         check(underTest.xrResources.updatables.size == 2)
-        check(underTest.leftHand.trackingState != TrackingState.Tracking)
-        check(underTest.rightHand.trackingState != TrackingState.Tracking)
+        check(!underTest.leftHand.isActive)
+        check(!underTest.rightHand.isActive)
 
         underTest.update(XR_TIME)
 
         // TODO - b/346615429: Define values here using the stub's Kotlin API. For the time being
         // they
         // come from `kPose` defined in //third_party/jetpack_xr_natives/openxr/openxr_stub.cc
-        val leftHandJoints = underTest.leftHand.handJoints
-        assertThat(underTest.leftHand.trackingState).isEqualTo(TrackingState.Tracking)
-        assertThat(leftHandJoints).hasSize(HandJointType.values().size)
-        for (jointType in HandJointType.values()) {
-            val jointTypeIndex = jointType.ordinal.toFloat()
-            assertThat(leftHandJoints[jointType]!!.rotation)
-                .isEqualTo(
-                    Quaternion(
-                        jointTypeIndex + 0.1f,
-                        jointTypeIndex + 0.2f,
-                        jointTypeIndex + 0.3f,
-                        jointTypeIndex + 0.4f,
-                    )
-                )
-            assertThat(leftHandJoints[jointType]!!.translation)
-                .isEqualTo(
-                    Vector3(jointTypeIndex + 0.5f, jointTypeIndex + 0.6f, jointTypeIndex + 0.7f)
-                )
-        }
-
-        val rightHandJoints = underTest.rightHand.handJoints
-        assertThat(underTest.rightHand.trackingState).isEqualTo(TrackingState.Tracking)
-        assertThat(rightHandJoints).hasSize(HandJointType.values().size)
-        for (jointType in HandJointType.values()) {
-            val jointTypeIndex = jointType.ordinal.toFloat()
-            assertThat(rightHandJoints[jointType]!!.rotation)
-                .isEqualTo(
-                    Quaternion(
-                        jointTypeIndex + 0.1f,
-                        jointTypeIndex + 0.2f,
-                        jointTypeIndex + 0.3f,
-                        jointTypeIndex + 0.4f,
-                    )
-                )
-            assertThat(rightHandJoints[jointType]!!.translation)
-                .isEqualTo(
-                    Vector3(jointTypeIndex + 0.5f, jointTypeIndex + 0.6f, jointTypeIndex + 0.7f)
-                )
-        }
+        assertThat(underTest.leftHand.isActive).isTrue()
+        assertThat(underTest.leftHand.handJoints).hasSize(1)
+        assertThat(underTest.leftHand.handJoints[HandJointType.PALM]!!.rotation)
+            .isEqualTo(Quaternion(1.0f, 2.0f, 3.0f, 4.0f))
+        assertThat(underTest.leftHand.handJoints[HandJointType.PALM]!!.translation)
+            .isEqualTo(Vector3(5.0f, 6.0f, 7.0f))
+        assertThat(underTest.rightHand.isActive).isTrue()
+        assertThat(underTest.rightHand.handJoints).hasSize(1)
+        assertThat(underTest.rightHand.handJoints[HandJointType.PALM]!!.rotation)
+            .isEqualTo(Quaternion(1.0f, 2.0f, 3.0f, 4.0f))
+        assertThat(underTest.rightHand.handJoints[HandJointType.PALM]!!.translation)
+            .isEqualTo(Vector3(5.0f, 6.0f, 7.0f))
     }
 
     @Test
diff --git a/xr/runtime/runtime-openxr/src/main/kotlin/androidx/xr/runtime/openxr/HandState.kt b/xr/runtime/runtime-openxr/src/main/kotlin/androidx/xr/runtime/openxr/HandState.kt
index b027211..a8bab4e 100644
--- a/xr/runtime/runtime-openxr/src/main/kotlin/androidx/xr/runtime/openxr/HandState.kt
+++ b/xr/runtime/runtime-openxr/src/main/kotlin/androidx/xr/runtime/openxr/HandState.kt
@@ -17,7 +17,6 @@
 package androidx.xr.runtime.openxr
 
 import androidx.annotation.RestrictTo
-import androidx.xr.runtime.internal.TrackingState
 import androidx.xr.runtime.math.Pose
 
 /**
@@ -28,12 +27,12 @@
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class HandState(
-    internal val trackingState: TrackingState = TrackingState.Paused,
+    internal val isActive: Boolean = false,
     internal val handJoints: List<Pose> = listOf(),
 ) {
     init {
-        require(trackingState != TrackingState.Tracking || handJoints.isNotEmpty()) {
-            "Hand joints cannot be empty if the hand is being tracked."
+        require(isActive == false || handJoints.isNotEmpty()) {
+            "Hand joints cannot be empty if the hand is active."
         }
     }
 }
diff --git a/xr/runtime/runtime-openxr/src/main/kotlin/androidx/xr/runtime/openxr/OpenXrHand.kt b/xr/runtime/runtime-openxr/src/main/kotlin/androidx/xr/runtime/openxr/OpenXrHand.kt
index 0023127..0a52ca7 100644
--- a/xr/runtime/runtime-openxr/src/main/kotlin/androidx/xr/runtime/openxr/OpenXrHand.kt
+++ b/xr/runtime/runtime-openxr/src/main/kotlin/androidx/xr/runtime/openxr/OpenXrHand.kt
@@ -18,31 +18,27 @@
 
 import androidx.annotation.RestrictTo
 import androidx.xr.runtime.internal.Hand
-import androidx.xr.runtime.internal.TrackingState
-import java.nio.ByteBuffer
-import java.nio.ByteOrder
+import androidx.xr.runtime.internal.HandJointType
+import androidx.xr.runtime.math.Pose
 
 /** Wraps the native [XrHandJointLocationsEXT] with the [Hand] interface. */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class OpenXrHand internal constructor(private val isLeftHand: Boolean) : Hand, Updatable {
 
-    override var trackingState: TrackingState = TrackingState.Paused
+    override var isActive: Boolean = false
         private set
 
-    override var handJointsBuffer: ByteBuffer = ByteBuffer.allocate(0)
+    override var handJoints: Map<HandJointType, Pose> = emptyMap()
         private set
 
     override fun update(xrTime: Long) {
-        val handDataBuffer =
-            nativeGetHandDataBuffer(isLeftHand, xrTime)
-                ?: throw IllegalStateException("Could not get hand data buffer.")
-        trackingState =
-            if (handDataBuffer.int != 0) TrackingState.Tracking else TrackingState.Paused
-        handJointsBuffer = handDataBuffer.slice().order(ByteOrder.nativeOrder())
+        val handState: HandState =
+            nativeLocateHandJoints(isLeftHand, xrTime)
+                ?: throw IllegalStateException("Could not locate hand joints for hand.")
+
+        isActive = handState.isActive
+        handJoints = HandJointType.values().zip(handState.handJoints).toMap()
     }
 
-    private external fun nativeGetHandDataBuffer(
-        isLeftHand: Boolean,
-        timestampNs: Long
-    ): ByteBuffer?
+    private external fun nativeLocateHandJoints(isLeftHand: Boolean, timestampNs: Long): HandState?
 }
diff --git a/xr/runtime/runtime-testing/api/restricted_current.txt b/xr/runtime/runtime-testing/api/restricted_current.txt
index 3171234..64bfe7f 100644
--- a/xr/runtime/runtime-testing/api/restricted_current.txt
+++ b/xr/runtime/runtime-testing/api/restricted_current.txt
@@ -102,13 +102,13 @@
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class FakeRuntimeHand implements androidx.xr.runtime.internal.Hand {
     ctor public FakeRuntimeHand();
-    ctor public FakeRuntimeHand(optional androidx.xr.runtime.internal.TrackingState trackingState, optional java.nio.ByteBuffer handJointsBuffer);
-    method public java.nio.ByteBuffer getHandJointsBuffer();
-    method public androidx.xr.runtime.internal.TrackingState getTrackingState();
-    method public void setHandJointsBuffer(java.nio.ByteBuffer);
-    method public void setTrackingState(androidx.xr.runtime.internal.TrackingState);
-    property public java.nio.ByteBuffer handJointsBuffer;
-    property public androidx.xr.runtime.internal.TrackingState trackingState;
+    ctor public FakeRuntimeHand(optional boolean isActive, optional java.util.Map<androidx.xr.runtime.internal.HandJointType,androidx.xr.runtime.math.Pose> handJoints);
+    method public java.util.Map<androidx.xr.runtime.internal.HandJointType,androidx.xr.runtime.math.Pose> getHandJoints();
+    method public boolean isActive();
+    method public void setActive(boolean);
+    method public void setHandJoints(java.util.Map<androidx.xr.runtime.internal.HandJointType,androidx.xr.runtime.math.Pose>);
+    property public java.util.Map<androidx.xr.runtime.internal.HandJointType,androidx.xr.runtime.math.Pose> handJoints;
+    property public boolean isActive;
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class FakeRuntimePlane implements androidx.xr.runtime.testing.AnchorHolder androidx.xr.runtime.internal.Plane {
diff --git a/xr/runtime/runtime-testing/src/main/kotlin/androidx/xr/runtime/testing/FakeRuntimeHand.kt b/xr/runtime/runtime-testing/src/main/kotlin/androidx/xr/runtime/testing/FakeRuntimeHand.kt
index 7b4d98f..92af55f 100644
--- a/xr/runtime/runtime-testing/src/main/kotlin/androidx/xr/runtime/testing/FakeRuntimeHand.kt
+++ b/xr/runtime/runtime-testing/src/main/kotlin/androidx/xr/runtime/testing/FakeRuntimeHand.kt
@@ -18,11 +18,11 @@
 
 import androidx.annotation.RestrictTo
 import androidx.xr.runtime.internal.Hand as RuntimeHand
-import androidx.xr.runtime.internal.TrackingState
-import java.nio.ByteBuffer
+import androidx.xr.runtime.internal.HandJointType
+import androidx.xr.runtime.math.Pose
 
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class FakeRuntimeHand(
-    override var trackingState: TrackingState = TrackingState.Paused,
-    override var handJointsBuffer: ByteBuffer = ByteBuffer.allocate(0),
+    override var isActive: Boolean = false,
+    override var handJoints: Map<HandJointType, Pose> = emptyMap(),
 ) : RuntimeHand {}
diff --git a/xr/runtime/runtime/api/restricted_current.txt b/xr/runtime/runtime/api/restricted_current.txt
index d6bcbb3..b6c0619 100644
--- a/xr/runtime/runtime/api/restricted_current.txt
+++ b/xr/runtime/runtime/api/restricted_current.txt
@@ -3,61 +3,24 @@
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class CoreState {
     ctor public CoreState(kotlin.time.ComparableTimeMark timeMark);
+    method public kotlin.time.ComparableTimeMark component1();
+    method public androidx.xr.runtime.CoreState copy(kotlin.time.ComparableTimeMark timeMark);
     method public kotlin.time.ComparableTimeMark getTimeMark();
     property public kotlin.time.ComparableTimeMark timeMark;
   }
 
-  public final class ManifestFeature {
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String FEATURE_XR_API_OPENXR;
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String FEATURE_XR_API_SPATIAL;
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String FEATURE_XR_INPUT_CONTROLLER;
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String FEATURE_XR_INPUT_EYE_TRACKING;
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String FEATURE_XR_INPUT_HAND_TRACKING;
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String FEATURE_XR_API_OPENXR;
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String FEATURE_XR_API_SPATIAL;
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String FEATURE_XR_INPUT_CONTROLLER;
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String FEATURE_XR_INPUT_EYE_TRACKING;
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String FEATURE_XR_INPUT_HAND_TRACKING;
-  }
-
-  public final class ManifestPermission {
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String EYE_TRACKING_COARSE;
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String EYE_TRACKING_FINE;
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String FACE_TRACKING;
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String HAND_TRACKING;
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String HEAD_TRACKING;
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String SCENE_UNDERSTANDING_COARSE;
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String SCENE_UNDERSTANDING_FINE;
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String EYE_TRACKING_COARSE;
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String EYE_TRACKING_FINE;
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String FACE_TRACKING;
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String HAND_TRACKING;
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String HEAD_TRACKING;
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String SCENE_UNDERSTANDING_COARSE;
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String SCENE_UNDERSTANDING_FINE;
-  }
-
-  public final class ManifestPermissionGroup {
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String XR_TRACKING;
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String XR_TRACKING_SENSITIVE;
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String XR_TRACKING;
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String XR_TRACKING_SENSITIVE;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Session implements androidx.lifecycle.LifecycleOwner {
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Session {
     method public androidx.xr.runtime.SessionConfigureResult configure();
     method public static androidx.xr.runtime.SessionCreateResult create(android.app.Activity activity);
     method public static androidx.xr.runtime.SessionCreateResult create(android.app.Activity activity, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
     method public void destroy();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public kotlinx.coroutines.CoroutineScope getCoroutineScope();
-    method public androidx.lifecycle.Lifecycle getLifecycle();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.xr.runtime.internal.Runtime getRuntime();
     method public kotlinx.coroutines.flow.StateFlow<androidx.xr.runtime.CoreState> getState();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public java.util.List<androidx.xr.runtime.StateExtender> getStateExtenders();
     method public void pause();
     method public androidx.xr.runtime.SessionResumeResult resume();
     property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public kotlinx.coroutines.CoroutineScope coroutineScope;
-    property public androidx.lifecycle.Lifecycle lifecycle;
     property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.xr.runtime.internal.Runtime runtime;
     property public kotlinx.coroutines.flow.StateFlow<androidx.xr.runtime.CoreState> state;
     property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public java.util.List<androidx.xr.runtime.StateExtender> stateExtenders;
@@ -275,37 +238,34 @@
     method public void addInputEventListener(java.util.concurrent.Executor executor, androidx.xr.runtime.internal.InputEventListener listener);
     method public void dispose();
     method public float getActivitySpaceAlpha();
-    method public default float getAlpha();
-    method public float getAlpha(int relativeTo);
+    method public float getAlpha();
     method public java.util.List<androidx.xr.runtime.internal.Entity> getChildren();
     method public String getContentDescription();
     method public androidx.xr.runtime.internal.Entity? getParent();
-    method public default androidx.xr.runtime.math.Pose getPose();
-    method public androidx.xr.runtime.math.Pose getPose(int relativeTo);
-    method public default androidx.xr.runtime.math.Vector3 getScale();
-    method public androidx.xr.runtime.math.Vector3 getScale(int relativeTo);
+    method public androidx.xr.runtime.math.Pose getPose();
+    method public androidx.xr.runtime.math.Vector3 getScale();
     method public androidx.xr.runtime.internal.Dimensions getSize();
     method public boolean isHidden();
     method public boolean isHidden(boolean includeParents);
     method public void removeAllComponents();
     method public void removeComponent(androidx.xr.runtime.internal.Component component);
     method public void removeInputEventListener(androidx.xr.runtime.internal.InputEventListener listener);
-    method public default void setAlpha(float alpha);
-    method public void setAlpha(float alpha, int relativeTo);
+    method public void setAlpha(float);
     method public void setChildren(java.util.List<? extends androidx.xr.runtime.internal.Entity>);
     method public void setContentDescription(String);
     method public void setHidden(boolean);
     method public void setParent(androidx.xr.runtime.internal.Entity?);
-    method public default void setPose(androidx.xr.runtime.math.Pose pose);
-    method public void setPose(androidx.xr.runtime.math.Pose pose, int relativeTo);
-    method public default void setScale(androidx.xr.runtime.math.Vector3 scale);
-    method public void setScale(androidx.xr.runtime.math.Vector3 scale, int relativeTo);
+    method public void setPose(androidx.xr.runtime.math.Pose);
+    method public void setScale(androidx.xr.runtime.math.Vector3);
     method public void setSize(androidx.xr.runtime.internal.Dimensions);
     property public abstract float activitySpaceAlpha;
+    property public abstract float alpha;
     property public abstract java.util.List<androidx.xr.runtime.internal.Entity> children;
     property public abstract String contentDescription;
     property public abstract boolean isHidden;
     property public abstract androidx.xr.runtime.internal.Entity? parent;
+    property public abstract androidx.xr.runtime.math.Pose pose;
+    property public abstract androidx.xr.runtime.math.Vector3 scale;
     property public abstract androidx.xr.runtime.internal.Dimensions size;
   }
 
@@ -323,18 +283,10 @@
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface Hand {
-    method public default java.util.Map<androidx.xr.runtime.internal.HandJointType,androidx.xr.runtime.math.Pose> getHandJoints();
-    method public java.nio.ByteBuffer getHandJointsBuffer();
-    method public androidx.xr.runtime.internal.TrackingState getTrackingState();
-    method public static java.util.Map<androidx.xr.runtime.internal.HandJointType,androidx.xr.runtime.math.Pose> parseHandJoint(androidx.xr.runtime.internal.TrackingState trackingState, java.nio.ByteBuffer handJointsBuffer);
-    property public default java.util.Map<androidx.xr.runtime.internal.HandJointType,androidx.xr.runtime.math.Pose> handJoints;
-    property public abstract java.nio.ByteBuffer handJointsBuffer;
-    property public abstract androidx.xr.runtime.internal.TrackingState trackingState;
-    field public static final androidx.xr.runtime.internal.Hand.Companion Companion;
-  }
-
-  public static final class Hand.Companion {
-    method public java.util.Map<androidx.xr.runtime.internal.HandJointType,androidx.xr.runtime.math.Pose> parseHandJoint(androidx.xr.runtime.internal.TrackingState trackingState, java.nio.ByteBuffer handJointsBuffer);
+    method public java.util.Map<androidx.xr.runtime.internal.HandJointType,androidx.xr.runtime.math.Pose> getHandJoints();
+    method public boolean isActive();
+    property public abstract java.util.Map<androidx.xr.runtime.internal.HandJointType,androidx.xr.runtime.math.Pose> handJoints;
+    property public abstract boolean isActive;
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public enum HandJointType {
@@ -454,7 +406,6 @@
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface JxrPlatformAdapter {
     method public void addSpatialCapabilitiesListener(java.util.concurrent.Executor callbackExecutor, kotlin.jvm.functions.Function1<? super androidx.xr.runtime.internal.SpatialCapabilities,kotlin.Unit> listener);
-    method public androidx.xr.runtime.internal.TextureResource? borrowReflectionTexture();
     method public androidx.xr.runtime.internal.ActivityPanelEntity createActivityPanelEntity(androidx.xr.runtime.math.Pose pose, androidx.xr.runtime.internal.PixelDimensions windowBoundsPx, String name, android.app.Activity hostActivity, androidx.xr.runtime.internal.Entity parent);
     method public androidx.xr.runtime.internal.AnchorEntity createAnchorEntity(androidx.xr.runtime.internal.Anchor anchor);
     method public androidx.xr.runtime.internal.AnchorEntity createAnchorEntity(androidx.xr.runtime.internal.Dimensions bounds, androidx.xr.runtime.internal.PlaneType planeType, androidx.xr.runtime.internal.PlaneSemantic planeSemantic, java.time.Duration searchTimeout);
@@ -464,15 +415,11 @@
     method public androidx.xr.runtime.internal.InteractableComponent createInteractableComponent(java.util.concurrent.Executor executor, androidx.xr.runtime.internal.InputEventListener listener);
     method public androidx.xr.runtime.internal.LoggingEntity createLoggingEntity(androidx.xr.runtime.math.Pose pose);
     method public androidx.xr.runtime.internal.MovableComponent createMovableComponent(boolean systemMovable, boolean scaleInZ, java.util.Set<? extends androidx.xr.runtime.internal.AnchorPlacement> anchorPlacement, boolean shouldDisposeParentAnchor);
-    method public androidx.xr.runtime.internal.PanelEntity createPanelEntity(android.content.Context context, androidx.xr.runtime.math.Pose pose, android.view.View view, androidx.xr.runtime.internal.Dimensions dimensions, String name, androidx.xr.runtime.internal.Entity parent);
-    method public androidx.xr.runtime.internal.PanelEntity createPanelEntity(android.content.Context context, androidx.xr.runtime.math.Pose pose, android.view.View view, androidx.xr.runtime.internal.PixelDimensions pixelDimensions, String name, androidx.xr.runtime.internal.Entity parent);
+    method public androidx.xr.runtime.internal.PanelEntity createPanelEntity(androidx.xr.runtime.math.Pose pose, android.view.View view, androidx.xr.runtime.internal.PixelDimensions surfaceDimensionsPx, androidx.xr.runtime.internal.Dimensions dimensions, String name, android.content.Context context, androidx.xr.runtime.internal.Entity parent);
     method public androidx.xr.runtime.internal.AnchorEntity createPersistedAnchorEntity(java.util.UUID uuid, java.time.Duration searchTimeout);
     method public void createPointerCaptureComponent(java.util.concurrent.Executor executor, androidx.xr.runtime.internal.PointerCaptureComponent.StateListener stateListener, androidx.xr.runtime.internal.InputEventListener inputListener);
     method public void createResizableComponent(androidx.xr.runtime.internal.Dimensions minimumSize, androidx.xr.runtime.internal.Dimensions maximumSize);
     method public androidx.xr.runtime.internal.SurfaceEntity createSurfaceEntity(int stereoMode, androidx.xr.runtime.internal.SurfaceEntity.CanvasShape canvasShape, androidx.xr.runtime.math.Pose pose, androidx.xr.runtime.internal.Entity parentEntity);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.runtime.internal.MaterialResource> createWaterMaterial(boolean isAlphaMapVersion);
-    method public void destroyTexture(androidx.xr.runtime.internal.TextureResource texture);
-    method public void destroyWaterMaterial(androidx.xr.runtime.internal.MaterialResource material);
     method public void dispose();
     method public androidx.xr.runtime.internal.ActivitySpace getActivitySpace();
     method public androidx.xr.runtime.internal.Entity getActivitySpaceRootImpl();
@@ -488,22 +435,12 @@
     method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.runtime.internal.ExrImageResource> loadExrImageByAssetName(String assetName);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.runtime.internal.GltfModelResource> loadGltfByAssetName(String assetName);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.runtime.internal.GltfModelResource> loadGltfByAssetNameSplitEngine(String assetName);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.runtime.internal.GltfModelResource> loadGltfByByteArray(java.util.List<java.lang.Byte> assetData, String assetKey);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.runtime.internal.TextureResource>? loadTexture(String assetName, androidx.xr.runtime.internal.TextureSampler sampler);
     method public void removeSpatialCapabilitiesListener(kotlin.jvm.functions.Function1<? super androidx.xr.runtime.internal.SpatialCapabilities,kotlin.Unit> listener);
     method public void requestFullSpaceMode();
     method public void requestHomeSpaceMode();
-    method public void setAlphaMap(androidx.xr.runtime.internal.MaterialResource material, androidx.xr.runtime.internal.TextureResource alphaMap);
-    method public void setAlphaStepMultiplier(androidx.xr.runtime.internal.MaterialResource material, float alphaStepMultiplier);
     method public android.os.Bundle setFullSpaceMode(android.os.Bundle bundle);
     method public android.os.Bundle setFullSpaceModeWithEnvironmentInherited(android.os.Bundle bundle);
-    method public void setNormalBoundary(androidx.xr.runtime.internal.MaterialResource material, float normalBoundary);
-    method public void setNormalMap(androidx.xr.runtime.internal.MaterialResource material, androidx.xr.runtime.internal.TextureResource normalMap);
-    method public void setNormalSpeed(androidx.xr.runtime.internal.MaterialResource material, float normalSpeed);
-    method public void setNormalTiling(androidx.xr.runtime.internal.MaterialResource material, float normalTiling);
-    method public void setNormalZ(androidx.xr.runtime.internal.MaterialResource material, float normalZ);
     method public void setPreferredAspectRatio(android.app.Activity activity, float preferredRatio);
-    method public void setReflectionCube(androidx.xr.runtime.internal.MaterialResource material, androidx.xr.runtime.internal.TextureResource reflectionCube);
     method public void startRenderer();
     method public void stopRenderer();
     property public abstract androidx.xr.runtime.internal.ActivitySpace activitySpace;
@@ -531,9 +468,6 @@
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface LoggingEntity extends androidx.xr.runtime.internal.Entity {
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MaterialResource extends androidx.xr.runtime.internal.Resource {
-  }
-
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MediaPlayerExtensionsWrapper {
     method public void setPointSourceAttributes(android.media.MediaPlayer mediaPlayer, androidx.xr.runtime.internal.PointSourceAttributes attributes);
     method public void setSoundFieldAttributes(android.media.MediaPlayer mediaPlayer, androidx.xr.runtime.internal.SoundFieldAttributes attributes);
@@ -592,14 +526,13 @@
     method public float getCornerRadius();
     method public androidx.xr.runtime.internal.Dimensions getPanelSize();
     method public androidx.xr.runtime.math.Vector3 getPixelDensity();
-    method public androidx.xr.runtime.internal.PixelDimensions getSizeInPixels();
+    method public androidx.xr.runtime.internal.PixelDimensions getPixelDimensions();
     method public void setCornerRadius(float);
-    method public void setPanelSize(androidx.xr.runtime.internal.Dimensions);
-    method public void setSizeInPixels(androidx.xr.runtime.internal.PixelDimensions);
+    method public void setPixelDimensions(androidx.xr.runtime.internal.PixelDimensions);
     property public abstract float cornerRadius;
     property public abstract androidx.xr.runtime.internal.Dimensions panelSize;
     property public abstract androidx.xr.runtime.math.Vector3 pixelDensity;
-    property public abstract androidx.xr.runtime.internal.PixelDimensions sizeInPixels;
+    property public abstract androidx.xr.runtime.internal.PixelDimensions pixelDimensions;
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface PerceptionManager {
@@ -776,14 +709,18 @@
     method public void play(android.media.SoundPool soundPool, int soundId, androidx.xr.runtime.internal.SoundFieldAttributes attributes, float volume, int priority, int loop, float rate);
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Space {
-    property public static int ACTIVITY;
-    property public static int PARENT;
-    property public static int REAL_WORLD;
-    field public static final int ACTIVITY = 1; // 0x1
-    field public static final androidx.xr.runtime.internal.Space INSTANCE;
-    field public static final int PARENT = 0; // 0x0
-    field public static final int REAL_WORLD = 2; // 0x2
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface Space extends androidx.xr.runtime.internal.Trackable {
+  }
+
+  public static final class Space.Type {
+    field public static final androidx.xr.runtime.internal.Space.Type.Companion Companion;
+    field public static final androidx.xr.runtime.internal.Space.Type Local;
+    field public static final androidx.xr.runtime.internal.Space.Type LocalFloor;
+  }
+
+  public static final class Space.Type.Companion {
+    property public androidx.xr.runtime.internal.Space.Type Local;
+    property public androidx.xr.runtime.internal.Space.Type LocalFloor;
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class SpatialCapabilities {
@@ -877,7 +814,7 @@
   }
 
   public static final class SpatialEnvironment.SpatialEnvironmentPreference {
-    ctor public SpatialEnvironment.SpatialEnvironmentPreference(androidx.xr.runtime.internal.ExrImageResource? skybox, androidx.xr.runtime.internal.GltfModelResource? geometry, androidx.xr.runtime.internal.MaterialResource? geometryMaterial, String? geometryMeshName, String? geometryAnimationName);
+    ctor public SpatialEnvironment.SpatialEnvironmentPreference(androidx.xr.runtime.internal.GltfModelResource? geometry, androidx.xr.runtime.internal.ExrImageResource? skybox);
     method public androidx.xr.runtime.internal.GltfModelResource? getGeometry();
     method public androidx.xr.runtime.internal.ExrImageResource? getSkybox();
     property public androidx.xr.runtime.internal.GltfModelResource? geometry;
@@ -988,71 +925,6 @@
     method public void onSpaceUpdated();
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TextureResource extends androidx.xr.runtime.internal.Resource {
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class TextureSampler {
-    ctor public TextureSampler(@androidx.xr.runtime.internal.TextureSampler.WrapMode int wrapModeS, @androidx.xr.runtime.internal.TextureSampler.WrapMode int wrapModeT, @androidx.xr.runtime.internal.TextureSampler.WrapMode int wrapModeR, @androidx.xr.runtime.internal.TextureSampler.WrapMode int minFilter, @androidx.xr.runtime.internal.TextureSampler.WrapMode int magFilter, @androidx.xr.runtime.internal.TextureSampler.WrapMode int compareMode, @androidx.xr.runtime.internal.TextureSampler.WrapMode int compareFunc, @androidx.xr.runtime.internal.TextureSampler.WrapMode int anisotropyLog2);
-    method public int getAnisotropyLog2();
-    method public int getCompareFunc();
-    method public int getCompareMode();
-    method public int getMagFilter();
-    method public int getMinFilter();
-    method public int getWrapModeR();
-    method public int getWrapModeS();
-    method public int getWrapModeT();
-    property @androidx.xr.runtime.internal.TextureSampler.WrapMode public int anisotropyLog2;
-    property @androidx.xr.runtime.internal.TextureSampler.WrapMode public int compareFunc;
-    property @androidx.xr.runtime.internal.TextureSampler.WrapMode public int compareMode;
-    property @androidx.xr.runtime.internal.TextureSampler.WrapMode public int magFilter;
-    property @androidx.xr.runtime.internal.TextureSampler.WrapMode public int minFilter;
-    property @androidx.xr.runtime.internal.TextureSampler.WrapMode public int wrapModeR;
-    property @androidx.xr.runtime.internal.TextureSampler.WrapMode public int wrapModeS;
-    property @androidx.xr.runtime.internal.TextureSampler.WrapMode public int wrapModeT;
-    field public static final int CLAMP_TO_EDGE = 0; // 0x0
-    field public static final int COMPARE_TO_TEXTURE = 1; // 0x1
-    field public static final androidx.xr.runtime.internal.TextureSampler.Companion Companion;
-    field public static final int LINEAR = 1; // 0x1
-    field public static final int LINEAR_MIPMAP_LINEAR = 5; // 0x5
-    field public static final int LINEAR_MIPMAP_NEAREST = 3; // 0x3
-    field public static final int MAG_LINEAR = 1; // 0x1
-    field public static final int MAG_NEAREST = 0; // 0x0
-    field public static final int MIRRORED_REPEAT = 2; // 0x2
-    field public static final int NEAREST = 0; // 0x0
-    field public static final int NEAREST_MIPMAP_LINEAR = 4; // 0x4
-    field public static final int NEAREST_MIPMAP_NEAREST = 2; // 0x2
-    field public static final int NONE = 0; // 0x0
-    field public static final int REPEAT = 1; // 0x1
-  }
-
-  public static final class TextureSampler.Companion {
-    property public static int CLAMP_TO_EDGE;
-    property public static int COMPARE_TO_TEXTURE;
-    property public static int LINEAR;
-    property public static int LINEAR_MIPMAP_LINEAR;
-    property public static int LINEAR_MIPMAP_NEAREST;
-    property public static int MAG_LINEAR;
-    property public static int MAG_NEAREST;
-    property public static int MIRRORED_REPEAT;
-    property public static int NEAREST;
-    property public static int NEAREST_MIPMAP_LINEAR;
-    property public static int NEAREST_MIPMAP_NEAREST;
-    property public static int NONE;
-    property public static int REPEAT;
-  }
-
-  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface TextureSampler.CompareMode {
-  }
-
-  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface TextureSampler.MagFilter {
-  }
-
-  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface TextureSampler.MinFilter {
-  }
-
-  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface TextureSampler.WrapMode {
-  }
-
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface Trackable {
     method public androidx.xr.runtime.internal.Anchor createAnchor(androidx.xr.runtime.math.Pose pose);
     method public androidx.xr.runtime.internal.TrackingState getTrackingState();
diff --git a/xr/runtime/runtime/build.gradle b/xr/runtime/runtime/build.gradle
index 4c6cd6b..1f26582a 100644
--- a/xr/runtime/runtime/build.gradle
+++ b/xr/runtime/runtime/build.gradle
@@ -38,11 +38,9 @@
     api(libs.kotlinStdlib)
     api(libs.kotlinCoroutinesCore)
     api("androidx.annotation:annotation:1.8.1")
-    api("androidx.lifecycle:lifecycle-common:2.8.7")
 
     implementation(libs.kotlinCoroutinesGuava)
     implementation("androidx.core:core:1.1.0")
-    implementation("androidx.lifecycle:lifecycle-runtime:2.8.7")
 
     testImplementation(libs.kotlinCoroutinesTest)
     testImplementation(libs.junit)
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/CoreState.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/CoreState.kt
index 18a1f7d..16c1669 100644
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/CoreState.kt
+++ b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/CoreState.kt
@@ -22,23 +22,8 @@
 /**
  * Represents the state of the XR system at a specific point in time.
  *
- * Instances of this class can be accessed via the [Session.state] [StateFlow] property. This class
- * may include extension properties provided by implementations of the [StateExtender] interface
- * found during [Session] creation.
- *
  * @property timeMark at which the state was computed.
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public class CoreState(public val timeMark: ComparableTimeMark) {
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is CoreState) return false
-        if (timeMark != other.timeMark) return false
-        return true
-    }
-
-    override fun hashCode(): Int = timeMark.hashCode()
-
-    override fun toString(): String = "CoreState(timeMark=$timeMark)"
-}
+@Suppress("DataClassDefinition")
+public data class CoreState(val timeMark: ComparableTimeMark) {}
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/ManifestFeature.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/ManifestFeature.kt
deleted file mode 100644
index c649d5c..0000000
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/ManifestFeature.kt
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-@file:JvmName("ManifestFeature")
-
-package androidx.xr.runtime
-
-import androidx.annotation.RestrictTo
-
-/**
- * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: This device
- * supports XR input from XR controllers.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-@JvmField
-public val FEATURE_XR_INPUT_CONTROLLER: String = "android.hardware.xr.input.controller"
-
-/**
- * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: This device
- * supports XR input from the user's hands.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-@JvmField
-public val FEATURE_XR_INPUT_HAND_TRACKING: String = "android.hardware.xr.input.hand_tracking"
-
-/**
- * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: This device
- * supports XR input from the user's eye gaze.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-@JvmField
-public val FEATURE_XR_INPUT_EYE_TRACKING: String = "android.hardware.xr.input.eye_tracking"
-
-/**
- * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: This device
- * supports <a href="https://www.khronos.org/openxr/">OpenXR</a>. The feature version indicates the
- * highest version of OpenXR supported by the device using the following encoding:
- * <ul>
- * <li> Major version in bits 31-16</li>
- * <li> Minor version in bits 15-0</li>
- * </ul>
- *
- * This is the same encoding as the top 32 bits of an {@code XrVersion}.
- *
- * <p>
- * Example: OpenXR 1.1 support is encoded as 0x00010001.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-@JvmField
-public val FEATURE_XR_API_OPENXR: String = "android.software.xr.api.openxr"
-
-/**
- * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: This device
- * supports the Android XR Spatial APIs. The feature version indicates the highest version of the
- * Android XR Spatial APIs supported by the device.
- *
- * <p>Also see <a href="https://developer.android.com/develop/xr">Develop with the Android XR
- * SDK</a>.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-@JvmField
-public val FEATURE_XR_API_SPATIAL: String = "android.software.xr.api.spatial"
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/ManifestPermission.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/ManifestPermission.kt
deleted file mode 100644
index a9d6dda..0000000
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/ManifestPermission.kt
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-@file:JvmName("ManifestPermission")
-
-package androidx.xr.runtime
-
-import androidx.annotation.RestrictTo
-
-/**
- * Allows an application to get approximate eye gaze.
- *
- * <p>Protection level: dangerous
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-@JvmField
-public val EYE_TRACKING_COARSE: String = "android.permission.EYE_TRACKING_COARSE"
-
-/**
- * Allows an application to get face tracking data.
- *
- * <p>Protection level: dangerous
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-@JvmField
-public val FACE_TRACKING: String = "android.permission.FACE_TRACKING"
-
-/**
- * Allows an application to get hand tracking data.
- *
- * <p>Protection level: dangerous
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-@JvmField
-public val HAND_TRACKING: String = "android.permission.HAND_TRACKING"
-
-/**
- * Allows an application to get data derived by sensing the user's environment.
- *
- * <p>Protection level: dangerous
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-@JvmField
-public val SCENE_UNDERSTANDING_COARSE: String = "android.permission.SCENE_UNDERSTANDING_COARSE"
-
-/**
- * Allows an application to get precise eye gaze data.
- *
- * <p>Protection level: dangerous
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-@JvmField
-public val EYE_TRACKING_FINE: String = "android.permission.EYE_TRACKING_FINE"
-
-/**
- * Allows an application to get head tracking data. Unmanaged activities (OpenXR activities with the
- * manifest property "android.window.PROPERTY_XR_ACTIVITY_START_MODE" set to
- * "XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED") do not require this permission to get head
- * tracking data.
- *
- * {@see
- * https://developer.android.com/develop/xr/get-started#property_activity_xr_start_mode_property}
- *
- * <p>Protection level: dangerous
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-@JvmField
-public val HEAD_TRACKING: String = "android.permission.HEAD_TRACKING"
-
-/**
- * Allows an application to get highly precise data derived by sensing the user's environment, such
- * as a depth map.
- *
- * <p>Protection level: dangerous
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-@JvmField
-public val SCENE_UNDERSTANDING_FINE: String = "android.permission.SCENE_UNDERSTANDING_FINE"
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/ManifestPermissionGroup.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/ManifestPermissionGroup.kt
deleted file mode 100644
index 91ef369..0000000
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/ManifestPermissionGroup.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-@file:JvmName("ManifestPermissionGroup")
-
-package androidx.xr.runtime
-
-import androidx.annotation.RestrictTo
-
-/**
- * Used for permissions that are associated with accessing XR tracked information about the person
- * using the device and the environment around them.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-@JvmField
-public val XR_TRACKING: String = "android.permission-group.XR_TRACKING"
-
-/**
- * Used for permissions that are associated with accessing particularly sensitive XR tracking data.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-@JvmField
-public val XR_TRACKING_SENSITIVE: String = "android.permission-group.XR_TRACKING_SENSITIVE"
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/Session.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/Session.kt
index d32e03fe..5ccd631 100644
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/Session.kt
+++ b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/Session.kt
@@ -20,9 +20,6 @@
 import android.content.pm.PackageManager
 import androidx.annotation.RestrictTo
 import androidx.core.content.ContextCompat
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LifecycleOwner
-import androidx.lifecycle.LifecycleRegistry
 import androidx.xr.runtime.internal.Runtime
 import androidx.xr.runtime.internal.RuntimeFactory
 import java.util.ServiceLoader
@@ -58,12 +55,12 @@
     @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
     public val coroutineScope: CoroutineScope,
     private val activity: Activity,
-) : LifecycleOwner {
+) {
     public companion object {
         /**
          * Creates a new [Session].
          *
-         * Creating a session requires the `android.permission.SCENE_UNDERSTANDING_COARSE` and
+         * Creating a session requires the `android.permission.SCENE_UNDERSTANDING` and
          * `android.permission.HAND_TRACKING` permissions to be granted.
          *
          * @param activity the [Activity] that owns the session.
@@ -95,26 +92,28 @@
             }
             val session =
                 Session(runtime, stateExtenders, CoroutineScope(coroutineDispatcher), activity)
-
-            session.lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
-
             return SessionCreateSuccess(session)
         }
 
         // TODO(b/392919087): Move the Hand Tracking permission to another place.
         internal val SESSION_PERMISSIONS: List<String> =
-            listOf(SCENE_UNDERSTANDING_COARSE, HAND_TRACKING)
+            listOf("android.permission.SCENE_UNDERSTANDING", "android.permission.HAND_TRACKING")
     }
 
-    private val lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)
-
-    override public val lifecycle: Lifecycle = lifecycleRegistry
+    /** The state of the runtime. */
+    private enum class RuntimeState {
+        INITIALIZED,
+        RESUMED,
+        PAUSED,
+        STOPPED,
+    }
 
     private val _state = MutableStateFlow<CoreState>(CoreState(TimeSource.Monotonic.markNow()))
 
     /** A [StateFlow] of the current state. */
     public val state: StateFlow<CoreState> = _state.asStateFlow()
 
+    private var runtimeState: RuntimeState = RuntimeState.INITIALIZED
     private var updateJob: Job? = null
 
     /**
@@ -126,9 +125,7 @@
      * @throws IllegalStateException if the session has been destroyed.
      */
     public fun configure(): SessionConfigureResult {
-        check(lifecycleRegistry.currentState != Lifecycle.State.DESTROYED) {
-            "Session has been destroyed."
-        }
+        check(runtimeState != RuntimeState.STOPPED) { "Session has been destroyed." }
         runtime.lifecycleManager.configure()
         return SessionConfigureSuccess()
     }
@@ -136,7 +133,7 @@
     /**
      * Starts or resumes the session.
      *
-     * Resuming a session requires the `android.permission.SCENE_UNDERSTANDING_COARSE` and
+     * Resuming a session requires the `android.permission.SCENE_UNDERSTANDING` and
      * `android.permission.HAND_TRACKING` permissions to be granted.
      *
      * @return the result of the operation. Can be [SessionResumeSuccess] if the session was
@@ -145,17 +142,16 @@
      * @throws IllegalStateException if the session has been destroyed.
      */
     public fun resume(): SessionResumeResult {
-        check(lifecycleRegistry.currentState != Lifecycle.State.DESTROYED) {
-            "Session has been destroyed."
-        }
-        if (lifecycleRegistry.currentState != Lifecycle.State.RESUMED) {
+        check(runtimeState != RuntimeState.STOPPED) { "Session has been destroyed." }
+
+        if (runtimeState != RuntimeState.RESUMED) {
             val missingPermissions = activity.selectMissing(SESSION_PERMISSIONS)
             if (missingPermissions.isNotEmpty()) {
                 return SessionResumePermissionsNotGranted(missingPermissions)
             }
 
             runtime.lifecycleManager.resume()
-            lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
+            runtimeState = RuntimeState.RESUMED
             updateJob = coroutineScope.launch { updateLoop() }
         }
 
@@ -171,13 +167,11 @@
      * @throws IllegalStateException if the session has been destroyed.
      */
     public fun pause() {
-        check(lifecycleRegistry.currentState != Lifecycle.State.DESTROYED) {
-            "Session has been destroyed."
-        }
+        check(runtimeState != RuntimeState.STOPPED) { "Session has been destroyed." }
 
-        if (lifecycleRegistry.currentState == Lifecycle.State.RESUMED) {
-            lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE)
+        if (runtimeState == RuntimeState.RESUMED) {
             runtime.lifecycleManager.pause()
+            runtimeState = RuntimeState.PAUSED
             updateJob?.cancel()
             updateJob = null
         }
@@ -191,18 +185,19 @@
      * an active session will first call [pause].
      */
     public fun destroy() {
-        if (lifecycleRegistry.currentState == Lifecycle.State.DESTROYED) {
+        if (runtimeState == RuntimeState.STOPPED) {
             return
-        } else if (lifecycleRegistry.currentState == Lifecycle.State.RESUMED) {
+        } else if (runtimeState == RuntimeState.RESUMED) {
             pause()
         }
-        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
+
         runtime.lifecycleManager.stop()
         coroutineScope.cancel()
+        runtimeState = RuntimeState.STOPPED
     }
 
     private suspend fun updateLoop() {
-        while (lifecycleRegistry.currentState == Lifecycle.State.RESUMED) {
+        while (runtimeState == RuntimeState.RESUMED) {
             update()
         }
     }
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Entity.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Entity.kt
index 2cb9e40..aaf9021 100644
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Entity.kt
+++ b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Entity.kt
@@ -25,6 +25,24 @@
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public interface Entity : ActivityPose {
 
+    /** Updates the pose (position and rotation) of the Entity relative to its parent. */
+    public var pose: Pose
+
+    /**
+     * Sets the scale of this entity relative to its parent. This value will affect the rendering of
+     * this Entity's children. As the scale increases, this will stretch the content of the Entity.
+     *
+     * @param scale The [Vector3] scale factor from the parent.
+     */
+    public var scale: Vector3
+
+    /**
+     * Add given Entity as child. The child Entity's pose will be relative to the pose of its parent
+     *
+     * @param child The child entity.
+     */
+    public fun addChild(child: Entity)
+
     /** Sets the provided Entities to be children of the Entity. */
     public var children: List<Entity>
 
@@ -46,6 +64,13 @@
      */
     public var size: Dimensions
 
+    /**
+     * Sets the alpha transparency for the given Entity.
+     *
+     * @param alpha Alpha transparency level for the Entity.
+     */
+    public var alpha: Float
+
     /** Returns the total alpha transparency level for this Entity. */
     public val activitySpaceAlpha: Float
 
@@ -59,80 +84,6 @@
     public var isHidden: Boolean
 
     /**
-     * Add given Entity as child. The child Entity's pose will be relative to the pose of its parent
-     *
-     * @param child The child entity.
-     */
-    public fun addChild(child: Entity)
-
-    /** Returns the pose for this entity, relative to the given space. */
-    public fun getPose(@SpaceValue relativeTo: Int): Pose
-
-    /** Returns the pose for this entity, relative to its parent. */
-    public fun getPose(): Pose = getPose(Space.PARENT)
-
-    /** Updates the pose (position and rotation) of the Entity relative to the given space. */
-    public fun setPose(pose: Pose, @SpaceValue relativeTo: Int)
-
-    /** Updates the pose (position and rotation) of the Entity relative to its parent. */
-    public fun setPose(pose: Pose): Unit = setPose(pose, Space.PARENT)
-
-    /**
-     * Returns the scale of this entity, relative to the given space.
-     *
-     * @return Current [Vector3] scale relative to the given space.
-     */
-    public fun getScale(@SpaceValue relativeTo: Int): Vector3
-
-    /**
-     * Returns the scale of this entity, relative to its parent.
-     *
-     * @return Current [Vector3] scale relative to the parent.
-     */
-    public fun getScale(): Vector3 = getScale(Space.PARENT)
-
-    /**
-     * Sets the scale of this entity relative to the given space. This value will affect the
-     * rendering of this Entity's children. As the scale increases, this will stretch the content of
-     * the Entity.
-     *
-     * @param scale The [Vector3] scale factor relative to the given space.
-     */
-    public fun setScale(scale: Vector3, @SpaceValue relativeTo: Int)
-
-    /**
-     * Sets the scale of this entity relative to its parent. This value will affect the rendering of
-     * this Entity's children. As the scale increases, this will stretch the content of the Entity.
-     *
-     * @param scale The [Vector3] scale factor from the parent.
-     */
-    public fun setScale(scale: Vector3): Unit = setScale(scale, Space.PARENT)
-
-    /**
-     * Returns the effective alpha transparency level of the entity, relative to the given space.
-     *
-     * @param relativeTo The space in which to evaluate the alpha.
-     */
-    public fun getAlpha(@SpaceValue relativeTo: Int): Float
-
-    /** Returns the set alpha transparency level for this Entity. */
-    public fun getAlpha(): Float = getAlpha(Space.PARENT)
-
-    /**
-     * Sets the alpha transparency for the given Entity, relative to the given space.
-     *
-     * @param alpha Alpha transparency level for the Entity.
-     */
-    public fun setAlpha(alpha: Float, @SpaceValue relativeTo: Int)
-
-    /**
-     * Sets the alpha transparency for the given Entity.
-     *
-     * @param alpha Alpha transparency level for the Entity.
-     */
-    public fun setAlpha(alpha: Float): Unit = setAlpha(alpha, Space.PARENT)
-
-    /**
      * Returns the hidden status of this Entity.
      *
      * @param includeParents Whether to include the hidden status of parents in the returned value.
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Hand.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Hand.kt
index d30876d..67c3346 100644
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Hand.kt
+++ b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Hand.kt
@@ -18,10 +18,6 @@
 
 import androidx.annotation.RestrictTo
 import androidx.xr.runtime.math.Pose
-import androidx.xr.runtime.math.Quaternion
-import androidx.xr.runtime.math.Vector3
-import java.nio.ByteBuffer
-import java.nio.ByteOrder
 
 /** Represents the type of hand joint. */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@@ -94,47 +90,9 @@
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public interface Hand {
 
-    public companion object {
-        /**
-         * Parses the hand joint data from the buffer.
-         *
-         * @param trackingState the current [TrackingState] of the hand.
-         * @param handJointsBuffer the [ByteBuffer] containing the pose of each joint in the hand.
-         * @return a map of [HandJointType] to [Pose] representing the current pose of each joint in
-         *   the hand.
-         */
-        @JvmStatic
-        public fun parseHandJoint(
-            trackingState: TrackingState,
-            handJointsBuffer: ByteBuffer,
-        ): Map<HandJointType, Pose> {
-            if (trackingState != TrackingState.Tracking) {
-                return emptyMap()
-            }
-            val buffer = handJointsBuffer.duplicate().order(ByteOrder.nativeOrder())
-            val jointCount = HandJointType.values().size
-            val poses = mutableListOf<Pose>()
-            repeat(jointCount) {
-                val qx = buffer.float
-                val qy = buffer.float
-                val qz = buffer.float
-                val qw = buffer.float
-                val px = buffer.float
-                val py = buffer.float
-                val pz = buffer.float
-                poses.add(Pose(Vector3(px, py, pz), Quaternion(qx, qy, qz, qw)))
-            }
-            return HandJointType.values().zip(poses).toMap()
-        }
-    }
-
-    /** The current [TrackingState] of the hand's data. */
-    public val trackingState: TrackingState
-
-    /** The value describing the data of the hand, including trackingState and handJoints' poses. */
-    public val handJointsBuffer: ByteBuffer
+    /** The value describing if the hand is active. */
+    public val isActive: Boolean
 
     /** The value describing the poses of the hand joints. */
     public val handJoints: Map<HandJointType, Pose>
-        get() = parseHandJoint(trackingState, handJointsBuffer)
 }
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/JxrPlatformAdapter.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/JxrPlatformAdapter.kt
index b6142d8..0e7428e 100644
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/JxrPlatformAdapter.kt
+++ b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/JxrPlatformAdapter.kt
@@ -89,70 +89,11 @@
         assetName: String
     ): ListenableFuture<GltfModelResource>
 
-    /**
-     * Loads glTF Asset from a provided byte array. The future returned by this method will fire
-     * listeners on the UI thread if Runnable::run is supplied.
-     */
-    // TODO(b/397746548): Add InputStream support for loading glTFs.
-    // Suppressed to allow CompletableFuture.
-    public fun loadGltfByByteArray(
-        assetData: List<Byte>,
-        assetKey: String,
-    ): ListenableFuture<GltfModelResource>
-
     /** Loads an ExrImage for the given asset name from the assets folder. */
     // Suppressed to allow CompletableFuture.
     public fun loadExrImageByAssetName(assetName: String): ListenableFuture<ExrImageResource>
 
     /**
-     * Loads a texture resource for the given asset name or URL. The future returned by this method
-     * will fire listeners on the UI thread if Runnable::run is supplied.
-     */
-    public fun loadTexture(
-        assetName: String,
-        sampler: TextureSampler,
-    ): ListenableFuture<TextureResource>?
-
-    /** Borrows the reflection texture from the currently set environment IBL. */
-    public fun borrowReflectionTexture(): TextureResource?
-
-    /** Destroys the given texture resource. */
-    public fun destroyTexture(texture: TextureResource)
-
-    /**
-     * Creates a water material by querying it from the system's built-in materials. The future
-     * returned by this method will fire listeners on the UI thread if Runnable::run is supplied.
-     */
-    public fun createWaterMaterial(isAlphaMapVersion: Boolean): ListenableFuture<MaterialResource>
-
-    /** Destroys the given water material resource. */
-    public fun destroyWaterMaterial(material: MaterialResource)
-
-    /** Sets the reflection cube texture for the water material. */
-    public fun setReflectionCube(material: MaterialResource, reflectionCube: TextureResource)
-
-    /** Sets the normal map texture for the water material. */
-    public fun setNormalMap(material: MaterialResource, normalMap: TextureResource)
-
-    /** Sets the normal tiling for the water material. */
-    public fun setNormalTiling(material: MaterialResource, normalTiling: Float)
-
-    /** Sets the normal speed for the water material. */
-    public fun setNormalSpeed(material: MaterialResource, normalSpeed: Float)
-
-    /** Sets the alpha step multiplier for the water material. */
-    public fun setAlphaStepMultiplier(material: MaterialResource, alphaStepMultiplier: Float)
-
-    /** Sets the alpha map for the water material. */
-    public fun setAlphaMap(material: MaterialResource, alphaMap: TextureResource)
-
-    /** Sets the normal z for the water material. */
-    public fun setNormalZ(material: MaterialResource, normalZ: Float)
-
-    /** Sets the normal boundary for the water material. */
-    public fun setNormalBoundary(material: MaterialResource, normalBoundary: Float)
-
-    /**
      * A factory function to create a SceneCore GltfEntity. The parent may be the activity space or
      * GltfEntity in the scene.
      */
@@ -205,38 +146,21 @@
     /**
      * A factory function to create a platform PanelEntity. The parent can be any entity.
      *
-     * @param context Application Context.
      * @param pose Initial pose of the panel.
      * @param view View inflating this panel.
+     * @param surfaceDimensionsPx Dimensions for the underlying surface for the given view.
      * @param dimensions Size of the panel in meters.
      * @param name Name of the panel.
+     * @param context Application Context.
      * @param parent Parent entity.
      */
     public fun createPanelEntity(
-        context: Context,
         pose: Pose,
         view: View,
+        surfaceDimensionsPx: PixelDimensions,
         dimensions: Dimensions,
         name: String,
-        parent: Entity,
-    ): PanelEntity
-
-    /**
-     * A factory function to create a platform PanelEntity. The parent can be any entity.
-     *
-     * @param context Application Context.
-     * @param pose Initial pose of the panel.
-     * @param view View inflating this panel.
-     * @param pixelDimensions Dimensions for the underlying surface for the given view in pixels.
-     * @param name Name of the panel.
-     * @param parent Parent entity.
-     */
-    public fun createPanelEntity(
         context: Context,
-        pose: Pose,
-        view: View,
-        pixelDimensions: PixelDimensions,
-        name: String,
         parent: Entity,
     ): PanelEntity
 
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/PanelEntity.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/PanelEntity.kt
index c7b23b3..d4352f6 100644
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/PanelEntity.kt
+++ b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/PanelEntity.kt
@@ -29,7 +29,7 @@
      *
      * @param dimensions The [PixelDimensions] of the underlying surface to set.
      */
-    public var sizeInPixels: PixelDimensions
+    public var pixelDimensions: PixelDimensions
 
     /**
      * Sets a corner radius on all four corners of this PanelEntity.
@@ -44,7 +44,6 @@
      * including parent scale.
      *
      * @return Vector3 scale applied to pixels within the Panel. (Z will be 0)
-     * @deprecated This method will be removed in a future release.
      */
     public val pixelDensity: Vector3
 
@@ -54,5 +53,5 @@
      *
      * @return [Dimensions] size of this panel in meters. (Z will be 0)
      */
-    public var panelSize: Dimensions
+    public val panelSize: Dimensions
 }
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Resource.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Resource.kt
index 19bfbf2..b97cf4e 100644
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Resource.kt
+++ b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Resource.kt
@@ -29,9 +29,3 @@
 
 /** Interface for a glTF resource. This can be used for creating glTF entities. */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface GltfModelResource : Resource {}
-
-/** Interface for a texture resource. This can be used alongside materials. */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TextureResource : Resource {}
-
-/** Interface for a material resource. This can be used to override materials on meshes. */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MaterialResource : Resource {}
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Space.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Space.kt
index d85ae9dd..a0af994 100644
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Space.kt
+++ b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/Space.kt
@@ -16,20 +16,28 @@
 
 package androidx.xr.runtime.internal
 
-import androidx.annotation.IntDef
 import androidx.annotation.RestrictTo
 
-@IntDef(Space.PARENT, Space.ACTIVITY, Space.REAL_WORLD)
-@Retention(AnnotationRetention.SOURCE)
-internal annotation class SpaceValue
-
-/** Coordinate spaces in which to apply the transformation values. */
+/**
+ * Describes a well-known coordinate system that is available for [anchors][Anchor] to be attached
+ * to.
+ */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public object Space {
-    /** The local coordinate space of an [Entity], relative to its parent. */
-    public const val PARENT: Int = 0
-    /** The global coordinate space, at the root of the scene graph for the activity. */
-    public const val ACTIVITY: Int = 1
-    /** The global coordinate space, unscaled, at the root of the scene graph of the activity. */
-    public const val REAL_WORLD: Int = 2
+public interface Space : Trackable {
+    /** Describes the origin and extents of the well-known coordinate system. */
+    public class Type private constructor(private val name: Int) {
+        public companion object {
+            /**
+             * A world-locked origin useful when an application needs to render seated-scale content
+             * that is not positioned relative to the physical floor.
+             */
+            @JvmField public val Local: Type = Type(0)
+
+            /**
+             * Similar to [LOCAL] but with a different height/Y coordinate. Matches [STAGE] but with
+             * potentially reduced bounds.
+             */
+            @JvmField public val LocalFloor: Type = Type(1)
+        }
+    }
 }
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/SpatialEnvironment.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/SpatialEnvironment.kt
index 86e3103..b610b3a 100644
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/SpatialEnvironment.kt
+++ b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/SpatialEnvironment.kt
@@ -165,29 +165,16 @@
      *   If null, there will be no geometry.
      * @param skybox the preferred skybox for the environment based on a pre-loaded EXR Image. If
      *   null, it will be all black.
-     * @param geometryMaterial the material to override a given mesh in the geometry. If null, the
-     *   material will not override any mesh.
-     * @param geometryMeshName the name of the mesh to override with the material. If null, the
-     *   material will not override any mesh.
-     * @param geometryAnimationName the name of the animation to play on the geometry. If null, the
-     *   geometry will not play any animation. Note that the animation will be played in loop.
      */
     public class SpatialEnvironmentPreference(
-        public val skybox: ExrImageResource?,
         public val geometry: GltfModelResource?,
-        internal val geometryMaterial: MaterialResource?,
-        internal val geometryMeshName: String?,
-        internal val geometryAnimationName: String?,
+        public val skybox: ExrImageResource?,
     ) {
         override fun equals(other: Any?): Boolean {
             if (this === other) return true
             if (other !is SpatialEnvironmentPreference) return false
 
-            return skybox == other.skybox &&
-                geometry == other.geometry &&
-                geometryMaterial == other.geometryMaterial &&
-                geometryMeshName == other.geometryMeshName &&
-                geometryAnimationName == other.geometryAnimationName
+            return skybox == other.skybox && geometry == other.geometry
         }
 
         override fun hashCode(): Int {
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/TextureSampler.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/TextureSampler.kt
deleted file mode 100644
index fec3297..0000000
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/internal/TextureSampler.kt
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.runtime.internal
-
-import androidx.annotation.RestrictTo
-
-/**
- * TextureSampler class used to define the way a texture gets sampled. The fields of this sampler
- * are based on the public Filament TextureSampler class but may diverge over time.
- * https://github.com/google/filament/blob/main/android/filament-android/src/main/java/com/google/android/filament/TextureSampler.java
- *
- * @param wrapModeS wrap mode S for the texture sampler.
- * @param wrapModeT wrap mode T for the texture sampler.
- * @param wrapModeR wrap mode R for the texture sampler.
- * @param minFilter min filter for the texture sampler.
- * @param magFilter mag filter for the texture sampler.
- * @param compareMode compare mode for the texture sampler.
- * @param compareFunc compare function for the texture sampler.
- * @param anisotropyLog2 anisotropy log 2 for the texture sampler.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public class TextureSampler(
-    @TextureSampler.WrapMode public val wrapModeS: Int,
-    @TextureSampler.WrapMode public val wrapModeT: Int,
-    @TextureSampler.WrapMode public val wrapModeR: Int,
-    @TextureSampler.WrapMode public val minFilter: Int,
-    @TextureSampler.WrapMode public val magFilter: Int,
-    @TextureSampler.WrapMode public val compareMode: Int,
-    @TextureSampler.WrapMode public val compareFunc: Int,
-    @TextureSampler.WrapMode public val anisotropyLog2: Int,
-) {
-    /**
-     * Defines how texture coordinates outside the range [0, 1] are handled. Although these values
-     * are based on the public Filament values, they may diverge over time.
-     */
-    public annotation class WrapMode {}
-
-    /**
-     * Specifies how the texture is sampled when it's minified (appears smaller than its original
-     * size). Although these values are based on the public Filament values, they may diverge over
-     * time.
-     */
-    public annotation class MinFilter {}
-
-    /**
-     * Specifies how the texture is sampled when it's magnified (appears larger than its original
-     * size). Although these values are based on the public Filament values, they may diverge over
-     * time.
-     */
-    public annotation class MagFilter {}
-
-    /**
-     * Used for depth texture comparisons, determining how the sampled depth value is compared to a
-     * reference depth. Although these values are based on the public Filament values, they may
-     * diverge over time.
-     */
-    public annotation class CompareMode {}
-
-    public companion object {
-        /** The edge of the texture extends to infinity. */
-        public const val CLAMP_TO_EDGE: Int = 0
-
-        /** The texture infinitely repeats in the wrap direction. */
-        public const val REPEAT: Int = 1
-
-        /** The texture infinitely repeats and mirrors in the wrap direction. */
-        public const val MIRRORED_REPEAT: Int = 2
-
-        /** No filtering. Nearest neighbor is used. */
-        public const val NEAREST: Int = 0
-
-        /** Box filtering. Weighted average of 4 neighbors is used. */
-        public const val LINEAR: Int = 1
-
-        /** Mip-mapping is activated. But no filtering occurs. */
-        public const val NEAREST_MIPMAP_NEAREST: Int = 2
-
-        /** Box filtering within a mip-map level. */
-        public const val LINEAR_MIPMAP_NEAREST: Int = 3
-
-        /** Mip-map levels are interpolated, but no other filtering occurs. */
-        public const val NEAREST_MIPMAP_LINEAR: Int = 4
-
-        /** Both interpolated Mip-mapping and linear filtering are used. */
-        public const val LINEAR_MIPMAP_LINEAR: Int = 5
-
-        /** No filtering. Nearest neighbor is used. */
-        public const val MAG_NEAREST: Int = 0
-
-        /** Box filtering. Weighted average of 4 neighbors is used. */
-        public const val MAG_LINEAR: Int = 1
-
-        public const val NONE: Int = 0
-
-        public const val COMPARE_TO_TEXTURE: Int = 1
-    }
-}
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Matrix4.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Matrix4.kt
index fefc2cb..635bd04 100644
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Matrix4.kt
+++ b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Matrix4.kt
@@ -182,7 +182,23 @@
     }
 
     /** Standard hash code calculation using constructor values */
-    public override fun hashCode(): Int = data.contentHashCode()
+    public override fun hashCode(): Int =
+        31 * data[0].hashCode() +
+            data[1].hashCode() +
+            data[2].hashCode() +
+            data[3].hashCode() +
+            data[4].hashCode() +
+            data[5].hashCode() +
+            data[6].hashCode() +
+            data[7].hashCode() +
+            data[8].hashCode() +
+            data[9].hashCode() +
+            data[10].hashCode() +
+            data[11].hashCode() +
+            data[12].hashCode() +
+            data[13].hashCode() +
+            data[14].hashCode() +
+            data[15].hashCode()
 
     /** Standard toString() implementation */
     public override fun toString(): String =
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Quaternion.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Quaternion.kt
index 698686f..9b19e12 100644
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Quaternion.kt
+++ b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Quaternion.kt
@@ -205,13 +205,7 @@
         return this.x == other.x && this.y == other.y && this.z == other.z && this.w == other.w
     }
 
-    override fun hashCode(): Int {
-        var result = x.hashCode()
-        result = 31 * result + y.hashCode()
-        result = 31 * result + z.hashCode()
-        result = 31 * result + w.hashCode()
-        return result
-    }
+    override fun hashCode(): Int = 31 * x.hashCode() + y.hashCode() + z.hashCode() + w.hashCode()
 
     override fun toString(): String = "[x=$x, y=$y, z=$z, w=$w]"
 
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Vector3.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Vector3.kt
index a986c60..59dac4c 100644
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Vector3.kt
+++ b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Vector3.kt
@@ -107,12 +107,7 @@
         return this.x == other.x && this.y == other.y && this.z == other.z
     }
 
-    override fun hashCode(): Int {
-        var result = x.hashCode()
-        result = 31 * result + y.hashCode()
-        result = 31 * result + z.hashCode()
-        return result
-    }
+    override fun hashCode(): Int = 31 * x.hashCode() + y.hashCode() + z.hashCode()
 
     override fun toString(): String = "[x=$x, y=$y, z=$z]"
 
diff --git a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Vector4.kt b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Vector4.kt
index 9b73033..5473cc3 100644
--- a/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Vector4.kt
+++ b/xr/runtime/runtime/src/main/kotlin/androidx/xr/runtime/math/Vector4.kt
@@ -118,13 +118,7 @@
         return this.x == other.x && this.y == other.y && this.z == other.z && this.w == other.w
     }
 
-    override fun hashCode(): Int {
-        var result = x.hashCode()
-        result = 31 * result + y.hashCode()
-        result = 31 * result + z.hashCode()
-        result = 31 * result + w.hashCode()
-        return result
-    }
+    override fun hashCode(): Int = 31 * x.hashCode() + y.hashCode() + z.hashCode() + w.hashCode()
 
     override fun toString(): String = "[x=$x, y=$y, z=$z, w=$w]"
 
diff --git a/xr/runtime/runtime/src/test/kotlin/androidx/xr/runtime/CoreStateTest.kt b/xr/runtime/runtime/src/test/kotlin/androidx/xr/runtime/CoreStateTest.kt
deleted file mode 100644
index 83dae31..0000000
--- a/xr/runtime/runtime/src/test/kotlin/androidx/xr/runtime/CoreStateTest.kt
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.runtime
-
-import com.google.common.truth.Truth.assertThat
-import kotlin.time.Duration.Companion.seconds
-import kotlin.time.TestTimeSource
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@RunWith(JUnit4::class)
-class CoreStateTest {
-
-    private val timeSource = TestTimeSource()
-
-    @Test
-    fun equals_sameObject_returnsTrue() {
-        val coreState = CoreState(timeMark = timeSource.markNow())
-
-        assertThat(coreState).isEqualTo(coreState)
-    }
-
-    @Test
-    fun equals_sameTimeMark_returnsTrue() {
-        val timeMark = timeSource.markNow()
-        val coreState1 = CoreState(timeMark = timeMark)
-        val coreState2 = CoreState(timeMark = timeMark)
-
-        assertThat(coreState1).isEqualTo(coreState2)
-    }
-
-    @Test
-    fun equals_differentTimeMark_returnsFalse() {
-        val coreState1 = CoreState(timeMark = timeSource.markNow())
-        timeSource += 1.seconds
-        val coreState2 = CoreState(timeMark = timeSource.markNow())
-
-        assertThat(coreState1).isNotEqualTo(coreState2)
-    }
-
-    @Test
-    fun equals_differentObjectType_returnsFalse() {
-        val coreState = CoreState(timeMark = timeSource.markNow())
-        val other = Object()
-
-        assertThat(coreState).isNotEqualTo(other)
-    }
-
-    @Test
-    fun hashCode_sameTimeMark_returnsSameHashCode() {
-        val timeMark = timeSource.markNow()
-        val coreState1 = CoreState(timeMark = timeMark)
-        val coreState2 = CoreState(timeMark = timeMark)
-
-        assertThat(coreState1.hashCode()).isEqualTo(coreState2.hashCode())
-    }
-
-    @Test
-    fun hashCode_differentTimeMark_returnsDifferentHashCode() {
-        val coreState1 = CoreState(timeMark = timeSource.markNow())
-        timeSource += 1.seconds
-        val coreState2 = CoreState(timeMark = timeSource.markNow())
-
-        assertThat(coreState1.hashCode()).isNotEqualTo(coreState2.hashCode())
-    }
-
-    @Test
-    fun toString_returnsCorrectString() {
-        val timeMark = timeSource.markNow()
-        val coreState = CoreState(timeMark = timeMark)
-
-        assertThat(coreState.toString()).isEqualTo("CoreState(timeMark=$timeMark)")
-    }
-}
diff --git a/xr/runtime/runtime/src/test/kotlin/androidx/xr/runtime/SessionTest.kt b/xr/runtime/runtime/src/test/kotlin/androidx/xr/runtime/SessionTest.kt
index d3bcef5..3110bae 100644
--- a/xr/runtime/runtime/src/test/kotlin/androidx/xr/runtime/SessionTest.kt
+++ b/xr/runtime/runtime/src/test/kotlin/androidx/xr/runtime/SessionTest.kt
@@ -27,6 +27,7 @@
 import kotlin.time.Duration.Companion.milliseconds
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.StandardTestDispatcher
 import kotlinx.coroutines.test.TestDispatcher
@@ -84,7 +85,7 @@
 
     @Test
     fun create_permissionNotGranted_returnsPermissionsNotGranted() {
-        val permission = "android.permission.SCENE_UNDERSTANDING_COARSE"
+        val permission = "android.permission.SCENE_UNDERSTANDING"
         shadowOf(activity).denyPermissions(permission)
 
         val result = Session.create(activity) as SessionCreatePermissionsNotGranted
@@ -125,7 +126,7 @@
     @Test
     fun resume_permissionNotGranted_returnsPermissionsNotGranted() {
         val underTest = (Session.create(activity) as SessionCreateSuccess).session
-        val permission = "android.permission.SCENE_UNDERSTANDING_COARSE"
+        val permission = "android.permission.SCENE_UNDERSTANDING"
         shadowOf(activity).denyPermissions(permission)
 
         val result = underTest.resume() as SessionResumePermissionsNotGranted
diff --git a/xr/runtime/runtime/src/test/kotlin/androidx/xr/runtime/java/CoroutinesTest.kt b/xr/runtime/runtime/src/test/kotlin/androidx/xr/runtime/java/CoroutinesTest.kt
index eb3f723..3bc395a 100644
--- a/xr/runtime/runtime/src/test/kotlin/androidx/xr/runtime/java/CoroutinesTest.kt
+++ b/xr/runtime/runtime/src/test/kotlin/androidx/xr/runtime/java/CoroutinesTest.kt
@@ -49,7 +49,7 @@
         activityScenarioRule.scenario.onActivity { this.activity = it }
         shadowOf(activity)
             .grantPermissions(
-                "android.permission.SCENE_UNDERSTANDING_COARSE",
+                "android.permission.SCENE_UNDERSTANDING",
                 "android.permission.HAND_TRACKING",
             )
 
diff --git a/xr/runtime/runtime/src/test/kotlin/androidx/xr/runtime/java/FlowsTest.kt b/xr/runtime/runtime/src/test/kotlin/androidx/xr/runtime/java/FlowsTest.kt
index 0fdf169..30af430 100644
--- a/xr/runtime/runtime/src/test/kotlin/androidx/xr/runtime/java/FlowsTest.kt
+++ b/xr/runtime/runtime/src/test/kotlin/androidx/xr/runtime/java/FlowsTest.kt
@@ -50,7 +50,7 @@
         activityScenarioRule.scenario.onActivity { this.activity = it }
         shadowOf(activity)
             .grantPermissions(
-                "android.permission.SCENE_UNDERSTANDING_COARSE",
+                "android.permission.SCENE_UNDERSTANDING",
                 "android.permission.HAND_TRACKING",
             )
 
diff --git a/xr/scenecore/integration-tests/activitypanel/build.gradle b/xr/scenecore/integration-tests/activitypanel/build.gradle
index cc23f44..088c32a 100644
--- a/xr/scenecore/integration-tests/activitypanel/build.gradle
+++ b/xr/scenecore/integration-tests/activitypanel/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 import androidx.build.SoftwareType
 
@@ -67,8 +66,6 @@
     implementation("androidx.activity:activity-compose:1.9.3")
     implementation("androidx.appcompat:appcompat:1.7.0")
     implementation("androidx.compose.runtime:runtime:1.7.5")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/scenecore/integration-tests/activitypanel/src/main/kotlin/androidx/xr/scenecore/samples/activitypanel/ActivityPanelHostActivity.kt b/xr/scenecore/integration-tests/activitypanel/src/main/kotlin/androidx/xr/scenecore/samples/activitypanel/ActivityPanelHostActivity.kt
index af4211f..7813920 100644
--- a/xr/scenecore/integration-tests/activitypanel/src/main/kotlin/androidx/xr/scenecore/samples/activitypanel/ActivityPanelHostActivity.kt
+++ b/xr/scenecore/integration-tests/activitypanel/src/main/kotlin/androidx/xr/scenecore/samples/activitypanel/ActivityPanelHostActivity.kt
@@ -23,6 +23,7 @@
 import androidx.xr.runtime.math.Pose
 import androidx.xr.runtime.math.Vector3
 import androidx.xr.scenecore.ActivityPanelEntity
+import androidx.xr.scenecore.Dimensions
 import androidx.xr.scenecore.MovableComponent
 import androidx.xr.scenecore.Session
 import androidx.xr.scenecore.SpatialCapabilities
@@ -48,13 +49,23 @@
             activityPanelEntity.launchActivity(intent)
             activityPanelEntity.setPose(Pose(Vector3(0.5f, 0.5f, 0.0f)))
             val movableComponent = MovableComponent.create(session)
-            movableComponent.size = activityPanelEntity.getSize()
+            movableComponent.size = getSizeInLocalSpace(activityPanelEntity)
             @Suppress("UNUSED_VARIABLE")
             val unused = activityPanelEntity.addComponent(movableComponent)
         }
         setContentView(CommonTestView(this))
     }
 
+    private fun getSizeInLocalSpace(activityPanelEntity: ActivityPanelEntity): Dimensions {
+        val scaledSize = activityPanelEntity.getSize()
+        val worldSpaceScale = activityPanelEntity.getWorldSpaceScale()
+        return Dimensions(
+            scaledSize.width / worldSpaceScale,
+            scaledSize.height / worldSpaceScale,
+            scaledSize.depth / worldSpaceScale,
+        )
+    }
+
     override fun onDestroy() {
         super.onDestroy()
         activityPanelEntity.setParent(null)
diff --git a/xr/scenecore/integration-tests/activitypanel/src/main/kotlin/androidx/xr/scenecore/samples/activitypanel/CounterActivity.kt b/xr/scenecore/integration-tests/activitypanel/src/main/kotlin/androidx/xr/scenecore/samples/activitypanel/CounterActivity.kt
index 05b8fe3..a0ae875 100644
--- a/xr/scenecore/integration-tests/activitypanel/src/main/kotlin/androidx/xr/scenecore/samples/activitypanel/CounterActivity.kt
+++ b/xr/scenecore/integration-tests/activitypanel/src/main/kotlin/androidx/xr/scenecore/samples/activitypanel/CounterActivity.kt
@@ -17,17 +17,14 @@
 package androidx.xr.scenecore.samples.activitypanel
 
 import android.os.Bundle
-import android.util.Log
 import androidx.appcompat.app.AppCompatActivity
 import androidx.xr.scenecore.samples.commontestview.DebugTextLinearView
 import java.util.Timer
 import java.util.TimerTask
 
-class CounterActivity : AppCompatActivity() {
-    var counter = 0
-    private val TAG = "CounterActivity"
-    private val timer = Timer()
+var counter = 0
 
+class CounterActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
@@ -35,24 +32,17 @@
         view.setName("Secondary Counter Activity")
         setContentView(view)
 
-        // Schedule a timer to update the counter every second
-        Log.i(TAG, "Counter Activity timer scheduled")
+        // Create a timer to update the counter every second
+        val timer = Timer()
         timer.schedule(createTimerTask(view), 0, 1000)
     }
-
-    override fun onDestroy() {
-        super.onDestroy()
-        Log.i(TAG, "Counter Activity onDestroy called")
-        timer.cancel()
-        timer.purge()
-    }
-
-    // Timer task that increments a counter and updates the view.
-    private fun createTimerTask(view: DebugTextLinearView) =
-        object : TimerTask() {
-            override fun run() {
-                counter++
-                view.setLine("counter", counter.toString())
-            }
-        }
 }
+
+// Timer task that increments a counter and updates the view.
+fun createTimerTask(view: DebugTextLinearView) =
+    object : TimerTask() {
+        override fun run() {
+            counter++
+            view.setLine("counter", counter.toString())
+        }
+    }
diff --git a/xr/scenecore/integration-tests/anchortest/build.gradle b/xr/scenecore/integration-tests/anchortest/build.gradle
index 90ef3b7f..839a841 100644
--- a/xr/scenecore/integration-tests/anchortest/build.gradle
+++ b/xr/scenecore/integration-tests/anchortest/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 import androidx.build.KotlinTarget
 import androidx.build.SoftwareType
@@ -72,7 +71,6 @@
     implementation("androidx.core:core:1.9.0")
     implementation("androidx.lifecycle:lifecycle-common:2.8.7")
 
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/scenecore/integration-tests/commontestview/build.gradle b/xr/scenecore/integration-tests/commontestview/build.gradle
index c17b895..dfe0193 100644
--- a/xr/scenecore/integration-tests/commontestview/build.gradle
+++ b/xr/scenecore/integration-tests/commontestview/build.gradle
@@ -21,7 +21,6 @@
  * Please use that script when creating a new project, rather than copying an existing project and
  * modifying its settings.
  */
-
 import androidx.build.SoftwareType
 
 plugins {
diff --git a/xr/scenecore/integration-tests/commontestview/src/main/kotlin/androidx/xr/scenecore/samples/commontestview/DebugTextPanel.kt b/xr/scenecore/integration-tests/commontestview/src/main/kotlin/androidx/xr/scenecore/samples/commontestview/DebugTextPanel.kt
index 3c0fb40..aa6320f 100644
--- a/xr/scenecore/integration-tests/commontestview/src/main/kotlin/androidx/xr/scenecore/samples/commontestview/DebugTextPanel.kt
+++ b/xr/scenecore/integration-tests/commontestview/src/main/kotlin/androidx/xr/scenecore/samples/commontestview/DebugTextPanel.kt
@@ -19,9 +19,9 @@
 import android.content.Context
 import androidx.xr.runtime.math.Pose
 import androidx.xr.runtime.math.Vector3
+import androidx.xr.scenecore.Dimensions
 import androidx.xr.scenecore.Entity
 import androidx.xr.scenecore.PanelEntity
-import androidx.xr.scenecore.PixelDimensions
 import androidx.xr.scenecore.Session
 
 /**
@@ -36,15 +36,17 @@
     session: Session,
     /** The parent entity that the Debug panel is attached to. */
     var parent: Entity,
-    pixelDimensions: PixelDimensions = PixelDimensions(550, 750),
-    name: String = "DebugTextPanel",
+    surfaceDimensionsPx: Dimensions = Dimensions(550f, 750f),
+    dimensions: Dimensions = Dimensions(0.1f, 0.1f, 0.1f),
+    name: String = "",
     pose: Pose = Pose(Vector3(0f, -0.1f, 0.1f)),
 ) {
     /** The view that displays the text lines. */
     var view: DebugTextLinearView = DebugTextLinearView(context = context)
 
     /** The panel entity that is created to hold the Debug view. */
-    var panelEntity = PanelEntity.create(session, view, pixelDimensions, name, pose)
+    var panelEntity: PanelEntity =
+        PanelEntity.create(session, view, surfaceDimensionsPx, dimensions, name, pose)
 
     /** Optional entity that the Debug panel is tracking. */
     var trackedEntity: Entity? = null
diff --git a/xr/scenecore/integration-tests/headlocked-ui/build.gradle b/xr/scenecore/integration-tests/headlocked-ui/build.gradle
index 403e377..987dc37 100644
--- a/xr/scenecore/integration-tests/headlocked-ui/build.gradle
+++ b/xr/scenecore/integration-tests/headlocked-ui/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 import androidx.build.SoftwareType
 
@@ -77,8 +76,6 @@
     implementation("androidx.lifecycle:lifecycle-runtime:2.8.7")
     implementation("androidx.lifecycle:lifecycle-viewmodel:2.8.7")
     implementation("androidx.savedstate:savedstate:1.2.1")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/scenecore/integration-tests/headlocked-ui/src/main/kotlin/androidx/xr/scenecore/samples/headlocked_ui/HeadLockedUiActivity.kt b/xr/scenecore/integration-tests/headlocked-ui/src/main/kotlin/androidx/xr/scenecore/samples/headlocked_ui/HeadLockedUiActivity.kt
index 54bcf92..9588177 100644
--- a/xr/scenecore/integration-tests/headlocked-ui/src/main/kotlin/androidx/xr/scenecore/samples/headlocked_ui/HeadLockedUiActivity.kt
+++ b/xr/scenecore/integration-tests/headlocked-ui/src/main/kotlin/androidx/xr/scenecore/samples/headlocked_ui/HeadLockedUiActivity.kt
@@ -52,11 +52,11 @@
 import androidx.xr.runtime.math.Pose
 import androidx.xr.runtime.math.Vector3
 import androidx.xr.scenecore.ActivityPose
+import androidx.xr.scenecore.Dimensions
 import androidx.xr.scenecore.MovableComponent
 import androidx.xr.scenecore.PanelEntity
 import androidx.xr.scenecore.PixelDimensions
 import androidx.xr.scenecore.Session
-import androidx.xr.scenecore.Space
 import androidx.xr.scenecore.samples.commontestview.DebugTextPanel
 
 class HeadLockedUiActivity : AppCompatActivity() {
@@ -79,7 +79,7 @@
         val mActivity = this
 
         // Set the main panel size and make the main panel movable.
-        mSession.mainPanelEntity.setSizeInPixels(PixelDimensions(width = 1500, height = 1100))
+        mSession.mainPanelEntity.setPixelDimensions(PixelDimensions(width = 1500, height = 1100))
         val movableComponent =
             MovableComponent.create(mSession, systemMovable = true, scaleInZ = false)
         val unused = mSession.mainPanelEntity.addComponent(movableComponent)
@@ -90,9 +90,9 @@
                 context = this,
                 session = mSession,
                 parent = mSession.activitySpace,
-                pixelDimensions = PixelDimensions(1500, 1000),
                 name = "DebugPanel",
                 pose = Pose(Vector3(0f, -0.6f, -0.05f)),
+                surfaceDimensionsPx = Dimensions(1500f, 1000f),
             )
 
         // Create the image panel.
@@ -103,7 +103,8 @@
             PanelEntity.create(
                 session = mSession,
                 view = mHeadLockedPanelView,
-                pixelDimensions = PixelDimensions(360, 180),
+                surfaceDimensionsPx = Dimensions(360f, 180f),
+                dimensions = Dimensions(0.1f, 0.1f, 0.1f),
                 name = "headLockedPanel",
                 pose = Pose(Vector3(0f, 0f, 0f)),
             )
@@ -116,7 +117,7 @@
         if (this.mProjectionSource != null) {
             // Since the panel is parented by the activitySpace, we need to inverse its scale
             // so that the panel stays at a fixed size in the view even when ActivitySpace scales.
-            this.mHeadLockedPanel.setScale(0.5f / mSession.activitySpace.getScale(Space.REAL_WORLD))
+            this.mHeadLockedPanel.setScale(0.5f / mSession.activitySpace.getWorldSpaceScale())
             this.mProjectionSource?.transformPoseTo(mUserForward, mSession.activitySpace)?.let {
                 this.mHeadLockedPanel.setPose(it)
                 if (mIsDebugPanelEnabled) updateDebugPanel(it)
@@ -132,11 +133,11 @@
         )
         mDebugPanel.view.setLine(
             "ActivitySpace WorldScale",
-            mSession.activitySpace.getScale(Space.REAL_WORLD).toString(),
+            mSession.activitySpace.getWorldSpaceScale().toString(),
         )
         mDebugPanel.view.setLine(
             "Head Locked Panel WorldScale",
-            this.mHeadLockedPanel.getScale(Space.REAL_WORLD).toString(),
+            this.mHeadLockedPanel.getWorldSpaceScale().toString(),
         )
         mDebugPanel.view.setLine(
             "Head ActivityPose",
diff --git a/xr/scenecore/integration-tests/inputmoveresize/build.gradle b/xr/scenecore/integration-tests/inputmoveresize/build.gradle
index 49441cb..a3f81e9 100644
--- a/xr/scenecore/integration-tests/inputmoveresize/build.gradle
+++ b/xr/scenecore/integration-tests/inputmoveresize/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 import androidx.build.SoftwareType
 
@@ -77,8 +76,6 @@
     implementation("androidx.lifecycle:lifecycle-runtime:2.8.7")
     implementation("androidx.lifecycle:lifecycle-viewmodel:2.8.7")
     implementation("androidx.savedstate:savedstate:1.2.1")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/scenecore/integration-tests/inputmoveresize/src/main/kotlin/androidx/xr/scenecore/samples/inputmoveresize/InputMoveResizeTestActivity.kt b/xr/scenecore/integration-tests/inputmoveresize/src/main/kotlin/androidx/xr/scenecore/samples/inputmoveresize/InputMoveResizeTestActivity.kt
index 5fb2c73..8b8452c7 100644
--- a/xr/scenecore/integration-tests/inputmoveresize/src/main/kotlin/androidx/xr/scenecore/samples/inputmoveresize/InputMoveResizeTestActivity.kt
+++ b/xr/scenecore/integration-tests/inputmoveresize/src/main/kotlin/androidx/xr/scenecore/samples/inputmoveresize/InputMoveResizeTestActivity.kt
@@ -30,7 +30,6 @@
 import androidx.xr.runtime.math.Pose
 import androidx.xr.runtime.math.Ray
 import androidx.xr.runtime.math.Vector3
-import androidx.xr.scenecore.BasePanelEntity
 import androidx.xr.scenecore.Dimensions
 import androidx.xr.scenecore.Entity
 import androidx.xr.scenecore.InputEvent
@@ -100,7 +99,7 @@
 
             override fun onResizeEnd(entity: Entity, finalSize: Dimensions) {
                 Log.i(TAG, "$entity $finalSize")
-                (entity as BasePanelEntity<*>).setSize(finalSize)
+                updatePanelSize(finalSize, entity as PanelEntity)
             }
         }
 
@@ -119,6 +118,29 @@
         textView.text = text
     }
 
+    private fun updatePanelSize(newSize: Dimensions, panelEntity: PanelEntity) {
+        panelEntity.setPixelDimensions(
+            PixelDimensions(
+                (newSize.width * panelEntity.getPixelDensity().x * panelEntity.getWorldSpaceScale())
+                    .toInt(),
+                (newSize.height *
+                        panelEntity.getPixelDensity().y *
+                        panelEntity.getWorldSpaceScale())
+                    .toInt(),
+            )
+        )
+    }
+
+    private fun getSizeInLocalSpace(entity: Entity): Dimensions {
+        val scaledSize = entity.getSize()
+        val worldSpaceScale = entity.getWorldSpaceScale()
+        return Dimensions(
+            scaledSize.width / worldSpaceScale,
+            scaledSize.height / worldSpaceScale,
+            scaledSize.depth / worldSpaceScale,
+        )
+    }
+
     private fun createPanelEntityWithText(text: String, panel: View): PanelEntity {
         updateTextInPanel(text, panel)
         val switch = panel.findViewById<Switch>(R.id.switch1)
@@ -129,7 +151,8 @@
             PanelEntity.create(
                 session,
                 panel,
-                PixelDimensions(640, 480),
+                Dimensions(640f, 480f),
+                Dimensions(0.1f, 0.1f, 0.1f),
                 "panel",
                 Pose(Vector3(0f, -0.5f, 0.5f)),
             )
@@ -150,7 +173,7 @@
         val mainPanelScaleInZ = findViewById<CheckBox>(R.id.scaleInZ)
         mainPanelScaleInZ.isChecked = true
         var mainPanelMovableComponent = MovableComponent.create(session)
-        mainPanelMovableComponent.size = session.mainPanelEntity.getSize()
+        mainPanelMovableComponent.size = getSizeInLocalSpace(session.mainPanelEntity)
 
         fun updateMainPanelMovableComponent() {
             if (mainPanelMovableActive) {
@@ -182,7 +205,7 @@
 
         val mainPanelMovableSwitch = findViewById<Switch>(R.id.movableSwitch)
         mainPanelMovableSwitch.setOnCheckedChangeListener { _, isChecked ->
-            mainPanelMovableComponent.size = session.mainPanelEntity.getSize()
+            mainPanelMovableComponent.size = getSizeInLocalSpace(session.mainPanelEntity)
             when (isChecked) {
                 true -> {
                     updateMainPanelMovableComponent()
@@ -202,7 +225,7 @@
         }
 
         val mainPanelResizableComponent = ResizableComponent.create(session)
-        mainPanelResizableComponent.size = session.mainPanelEntity.getSize()
+        mainPanelResizableComponent.size = getSizeInLocalSpace(session.mainPanelEntity)
         mainPanelResizableComponent.addResizeListener(mainExecutor, resizeListener)
 
         val mainPanelAnyAspectRatioButton = findViewById<RadioButton>(R.id.radioButton1)
@@ -225,7 +248,7 @@
 
         val mainPanelResizableSwitch = findViewById<Switch>(R.id.resizableSwitch)
         mainPanelResizableSwitch.setOnCheckedChangeListener { _, isChecked ->
-            mainPanelResizableComponent.size = session.mainPanelEntity.getSize()
+            mainPanelResizableComponent.size = getSizeInLocalSpace(session.mainPanelEntity)
             when (isChecked) {
                 true ->
                     mainPanelResizableActive =
@@ -259,7 +282,7 @@
         scaleInZCheckBox.isChecked = true
 
         var movablePanelComponent = MovableComponent.create(session)
-        movablePanelComponent.size = movablePanelEntity.getSize()
+        movablePanelComponent.size = getSizeInLocalSpace(movablePanelEntity)
         fun updateMovablePanelComponent() {
             if (movablePanelActive) {
                 movablePanelEntity.removeComponent(movablePanelComponent)
@@ -287,7 +310,7 @@
         val movablePanelSwitch = movablePanelView.findViewById<Switch>(R.id.switch1)
         movablePanelSwitch.text = getString(R.string.movable_label)
         movablePanelSwitch.setOnCheckedChangeListener { _, isChecked ->
-            movablePanelComponent.size = movablePanelEntity.getSize()
+            movablePanelComponent.size = getSizeInLocalSpace(movablePanelEntity)
             when (isChecked) {
                 true -> {
                     updateMovablePanelComponent()
@@ -319,13 +342,13 @@
                 }
             }
         val everythingPanelMovableComponent = MovableComponent.create(session)
-        everythingPanelMovableComponent.size = everythingPanelEntity.getSize()
+        everythingPanelMovableComponent.size = getSizeInLocalSpace(everythingPanelEntity)
         val everythingPanelResizeComponent = ResizableComponent.create(session)
-        everythingPanelResizeComponent.size = everythingPanelEntity.getSize()
+        everythingPanelResizeComponent.size = getSizeInLocalSpace(everythingPanelEntity)
         everythingPanelResizeComponent.addResizeListener(mainExecutor, resizeListener)
         everythingPanelSwitch.setOnCheckedChangeListener { _, isChecked ->
-            everythingPanelMovableComponent.size = everythingPanelEntity.getSize()
-            everythingPanelResizeComponent.size = everythingPanelEntity.getSize()
+            everythingPanelMovableComponent.size = getSizeInLocalSpace(everythingPanelEntity)
+            everythingPanelResizeComponent.size = getSizeInLocalSpace(everythingPanelEntity)
             when (isChecked) {
                 true -> {
                     checkNotNull(
@@ -356,7 +379,7 @@
         resizablePanelEntity.setPose(Pose(Vector3(0.9f, 0.2f, -0.1f)))
         resizablePanelEntity.setParent(session.mainPanelEntity)
         val resizablePanelComponent = ResizableComponent.create(session)
-        resizablePanelComponent.size = resizablePanelEntity.getSize()
+        resizablePanelComponent.size = getSizeInLocalSpace(resizablePanelEntity)
         resizablePanelComponent.addResizeListener(mainExecutor, resizeListener)
 
         val anyAspectRatioButton = resizablePanelView.findViewById<RadioButton>(R.id.radioButton1)
@@ -381,7 +404,7 @@
 
         val resizablePanelSwitch = resizablePanelView.findViewById<Switch>(R.id.switch1)
         resizablePanelSwitch.setOnCheckedChangeListener { _, isChecked ->
-            resizablePanelComponent.size = resizablePanelEntity.getSize()
+            resizablePanelComponent.size = getSizeInLocalSpace(resizablePanelEntity)
             when (isChecked) {
                 true ->
                     resizablePanelActive =
diff --git a/xr/scenecore/integration-tests/movable/build.gradle b/xr/scenecore/integration-tests/movable/build.gradle
index a51bdb7..b2d0e66 100644
--- a/xr/scenecore/integration-tests/movable/build.gradle
+++ b/xr/scenecore/integration-tests/movable/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 import androidx.build.SoftwareType
 
@@ -66,8 +65,6 @@
     implementation("androidx.activity:activity:1.9.3")
     implementation("androidx.appcompat:appcompat:1.7.0")
     implementation("androidx.core:core:1.9.0")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/scenecore/integration-tests/movable/src/main/kotlin/androidx/xr/scenecore/samples/movable/MovableActivity.kt b/xr/scenecore/integration-tests/movable/src/main/kotlin/androidx/xr/scenecore/samples/movable/MovableActivity.kt
index 6a44bf1..5162d88 100644
--- a/xr/scenecore/integration-tests/movable/src/main/kotlin/androidx/xr/scenecore/samples/movable/MovableActivity.kt
+++ b/xr/scenecore/integration-tests/movable/src/main/kotlin/androidx/xr/scenecore/samples/movable/MovableActivity.kt
@@ -27,12 +27,12 @@
 import androidx.xr.runtime.math.Ray
 import androidx.xr.runtime.math.Vector3
 import androidx.xr.scenecore.AnchorPlacement
+import androidx.xr.scenecore.Dimensions
 import androidx.xr.scenecore.Entity
 import androidx.xr.scenecore.MovableComponent
 import androidx.xr.scenecore.MoveListener
 import androidx.xr.scenecore.PanelEntity
 import androidx.xr.scenecore.PermissionHelper
-import androidx.xr.scenecore.PixelDimensions
 import androidx.xr.scenecore.PlaneSemantic
 import androidx.xr.scenecore.PlaneType
 import androidx.xr.scenecore.Session
@@ -83,7 +83,8 @@
             PanelEntity.create(
                 session,
                 stationaryPanelContentView,
-                PixelDimensions(640, 480),
+                Dimensions(640f, 480f),
+                Dimensions(0.1f, 0.1f, 0.1f),
                 "stationaryPanel",
                 Pose(Vector3(1f, 0f, 0f)),
             )
@@ -95,7 +96,8 @@
             PanelEntity.create(
                 session,
                 movablePanelContentView,
-                PixelDimensions(640, 880),
+                Dimensions(640f, 880f),
+                Dimensions(0.1f, 0.1f, 0.1f),
                 "panel",
                 Pose(Vector3(0f, 0f, 0.1f)),
             )
diff --git a/xr/scenecore/integration-tests/panelroundedcorner/build.gradle b/xr/scenecore/integration-tests/panelroundedcorner/build.gradle
index d4c2b21..2db8de2 100644
--- a/xr/scenecore/integration-tests/panelroundedcorner/build.gradle
+++ b/xr/scenecore/integration-tests/panelroundedcorner/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 import androidx.build.SoftwareType
 
@@ -67,8 +66,6 @@
     implementation("androidx.activity:activity-compose:1.9.3")
     implementation("androidx.appcompat:appcompat:1.7.0")
     implementation("androidx.compose.runtime:runtime:1.7.5")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/scenecore/integration-tests/panelroundedcorner/src/main/kotlin/androidx/xr/scenecore/samples/panelroundedcorner/MainPanelActivity.kt b/xr/scenecore/integration-tests/panelroundedcorner/src/main/kotlin/androidx/xr/scenecore/samples/panelroundedcorner/MainPanelActivity.kt
index 4cacae7..d7eae72 100644
--- a/xr/scenecore/integration-tests/panelroundedcorner/src/main/kotlin/androidx/xr/scenecore/samples/panelroundedcorner/MainPanelActivity.kt
+++ b/xr/scenecore/integration-tests/panelroundedcorner/src/main/kotlin/androidx/xr/scenecore/samples/panelroundedcorner/MainPanelActivity.kt
@@ -27,8 +27,8 @@
 import androidx.xr.runtime.math.Pose
 import androidx.xr.runtime.math.Vector3
 import androidx.xr.scenecore.ActivityPanelEntity
+import androidx.xr.scenecore.Dimensions
 import androidx.xr.scenecore.PanelEntity
-import androidx.xr.scenecore.PixelDimensions
 import androidx.xr.scenecore.Session
 import androidx.xr.scenecore.SpatialCapabilities
 import androidx.xr.scenecore.addSpatialCapabilitiesChangedListener
@@ -36,7 +36,6 @@
 
 const val TAG = "MainPanelActivity"
 
-@Suppress("DEPRECATION")
 class MainPanelActivity : AppCompatActivity() {
     private var activityPanelEntity: ActivityPanelEntity? = null
     private lateinit var panelEntity: PanelEntity
@@ -67,7 +66,8 @@
             PanelEntity.create(
                 session,
                 panelEntityView,
-                PixelDimensions(640, 880),
+                Dimensions(640f, 880f),
+                Dimensions(0.1f, 0.1f, 0.1f),
                 "panel_entity",
                 Pose(Vector3(0f, 0f, 0.0f)),
             )
diff --git a/xr/scenecore/integration-tests/spatialcapabilities/build.gradle b/xr/scenecore/integration-tests/spatialcapabilities/build.gradle
index 2cea31b..1ac02e4 100644
--- a/xr/scenecore/integration-tests/spatialcapabilities/build.gradle
+++ b/xr/scenecore/integration-tests/spatialcapabilities/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 import androidx.build.SoftwareType
 
@@ -65,8 +64,6 @@
     implementation("androidx.activity:activity:1.9.3")
     implementation("androidx.appcompat:appcompat:1.7.0")
     implementation("androidx.core:core:1.9.0")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/scenecore/integration-tests/spatialcapabilities/src/main/kotlin/androidx/xr/scenecore/samples/spatialcapabilities/SpatialCapabilitiesTestActivity.kt b/xr/scenecore/integration-tests/spatialcapabilities/src/main/kotlin/androidx/xr/scenecore/samples/spatialcapabilities/SpatialCapabilitiesTestActivity.kt
index 439ed2a..3b372a1 100644
--- a/xr/scenecore/integration-tests/spatialcapabilities/src/main/kotlin/androidx/xr/scenecore/samples/spatialcapabilities/SpatialCapabilitiesTestActivity.kt
+++ b/xr/scenecore/integration-tests/spatialcapabilities/src/main/kotlin/androidx/xr/scenecore/samples/spatialcapabilities/SpatialCapabilitiesTestActivity.kt
@@ -70,7 +70,6 @@
             debugTextString.append(
                 "Bounds Changed event received: w=${bounds.width}, h=${bounds.height}, d=${bounds.depth}\n"
             )
-            isFsm = bounds.width == Float.POSITIVE_INFINITY
         }
     }
 
diff --git a/xr/scenecore/integration-tests/spatialuser/build.gradle b/xr/scenecore/integration-tests/spatialuser/build.gradle
index 626605d..5c6cd35 100644
--- a/xr/scenecore/integration-tests/spatialuser/build.gradle
+++ b/xr/scenecore/integration-tests/spatialuser/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 import androidx.build.SoftwareType
 
@@ -73,8 +72,6 @@
     implementation("androidx.compose.ui:ui:1.7.5")
     implementation("androidx.lifecycle:lifecycle-common:2.8.7")
     implementation("androidx.core:core:1.9.0")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/scenecore/integration-tests/spatialuser/src/main/kotlin/androidx/xr/scenecore/samples/spatialuser/SpatialUserActivity.kt b/xr/scenecore/integration-tests/spatialuser/src/main/kotlin/androidx/xr/scenecore/samples/spatialuser/SpatialUserActivity.kt
index f58c631..f1a6f3e 100644
--- a/xr/scenecore/integration-tests/spatialuser/src/main/kotlin/androidx/xr/scenecore/samples/spatialuser/SpatialUserActivity.kt
+++ b/xr/scenecore/integration-tests/spatialuser/src/main/kotlin/androidx/xr/scenecore/samples/spatialuser/SpatialUserActivity.kt
@@ -26,9 +26,9 @@
 import androidx.xr.runtime.math.Quaternion
 import androidx.xr.runtime.math.Vector3
 import androidx.xr.scenecore.CameraView
+import androidx.xr.scenecore.Dimensions
 import androidx.xr.scenecore.Entity
 import androidx.xr.scenecore.PanelEntity
-import androidx.xr.scenecore.PixelDimensions
 import androidx.xr.scenecore.Session
 import kotlin.math.tan
 import kotlinx.coroutines.delay
@@ -62,7 +62,8 @@
             PanelEntity.create(
                 session,
                 panelContentView,
-                PixelDimensions(640, 480),
+                Dimensions(640f, 480f),
+                Dimensions(0.1f, 0.1f, 0.1f),
                 "panel",
                 Pose(Vector3(0f, 0f, 0.5f)),
             )
diff --git a/xr/scenecore/integration-tests/standalone/build.gradle b/xr/scenecore/integration-tests/standalone/build.gradle
index dd94532..9d935ef 100644
--- a/xr/scenecore/integration-tests/standalone/build.gradle
+++ b/xr/scenecore/integration-tests/standalone/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 import androidx.build.KotlinTarget
 import androidx.build.SoftwareType
@@ -71,8 +70,6 @@
     implementation("androidx.compose.runtime:runtime:1.7.5")
     implementation("androidx.core:core:1.9.0")
     implementation("androidx.lifecycle:lifecycle-common:2.8.7")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/scenecore/integration-tests/standalone/src/main/kotlin/androidx/xr/scenecore/samples/standalone/StandaloneActivity.kt b/xr/scenecore/integration-tests/standalone/src/main/kotlin/androidx/xr/scenecore/samples/standalone/StandaloneActivity.kt
index 9012b6f..d8dcf02 100644
--- a/xr/scenecore/integration-tests/standalone/src/main/kotlin/androidx/xr/scenecore/samples/standalone/StandaloneActivity.kt
+++ b/xr/scenecore/integration-tests/standalone/src/main/kotlin/androidx/xr/scenecore/samples/standalone/StandaloneActivity.kt
@@ -23,10 +23,10 @@
 import androidx.xr.runtime.math.Pose
 import androidx.xr.runtime.math.Quaternion
 import androidx.xr.runtime.math.Vector3
+import androidx.xr.scenecore.Dimensions
 import androidx.xr.scenecore.GltfModel
 import androidx.xr.scenecore.GltfModelEntity
 import androidx.xr.scenecore.PanelEntity
-import androidx.xr.scenecore.PixelDimensions
 import androidx.xr.scenecore.Session
 import kotlin.math.cos
 import kotlin.math.sin
@@ -49,7 +49,8 @@
             PanelEntity.create(
                 session,
                 panelContentView,
-                PixelDimensions(640, 480),
+                Dimensions(640f, 480f),
+                Dimensions(0.1f, 0.1f, 0.1f),
                 "panel",
                 Pose(Vector3(0f, -0.5f, 0.5f)),
             )
diff --git a/xr/scenecore/integration-tests/svxr-example/build.gradle b/xr/scenecore/integration-tests/svxr-example/build.gradle
index 5aa8656..ba1fc24 100644
--- a/xr/scenecore/integration-tests/svxr-example/build.gradle
+++ b/xr/scenecore/integration-tests/svxr-example/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 import androidx.build.SoftwareType
 
@@ -61,8 +60,6 @@
 dependencies {
     implementation("androidx.activity:activity:1.9.3")
     implementation("androidx.appcompat:appcompat:1.7.0")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/scenecore/integration-tests/transformationtests/build.gradle b/xr/scenecore/integration-tests/transformationtests/build.gradle
index aa4b2c9..366e834 100644
--- a/xr/scenecore/integration-tests/transformationtests/build.gradle
+++ b/xr/scenecore/integration-tests/transformationtests/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 import androidx.build.KotlinTarget
 import androidx.build.SoftwareType
@@ -72,8 +71,6 @@
     implementation("androidx.core:core:1.9.0")
     implementation("androidx.lifecycle:lifecycle-common:2.8.7")
     implementation("com.google.errorprone:error_prone_annotations:2.30.0")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/scenecore/integration-tests/transformationtests/src/main/kotlin/androidx/xr/scenecore/samples/transformationtests/TransformationTestsActivity.kt b/xr/scenecore/integration-tests/transformationtests/src/main/kotlin/androidx/xr/scenecore/samples/transformationtests/TransformationTestsActivity.kt
index 30e3b21..72b03d3 100644
--- a/xr/scenecore/integration-tests/transformationtests/src/main/kotlin/androidx/xr/scenecore/samples/transformationtests/TransformationTestsActivity.kt
+++ b/xr/scenecore/integration-tests/transformationtests/src/main/kotlin/androidx/xr/scenecore/samples/transformationtests/TransformationTestsActivity.kt
@@ -30,11 +30,9 @@
 import androidx.xr.scenecore.GltfModel
 import androidx.xr.scenecore.GltfModelEntity
 import androidx.xr.scenecore.MovableComponent
-import androidx.xr.scenecore.PixelDimensions
 import androidx.xr.scenecore.PlaneSemantic
 import androidx.xr.scenecore.PlaneType
 import androidx.xr.scenecore.Session
-import androidx.xr.scenecore.Space
 import androidx.xr.scenecore.samples.commontestview.DebugTextLinearView
 import androidx.xr.scenecore.samples.commontestview.DebugTextPanel
 import com.google.errorprone.annotations.CanIgnoreReturnValue
@@ -199,10 +197,10 @@
                 session,
                 trackedEntity,
                 name = name,
-                pixelDimensions =
-                    PixelDimensions(
-                        (labelDimensions.width * trackedEntity.getScale(Space.REAL_WORLD)).toInt(),
-                        (labelDimensions.height * trackedEntity.getScale(Space.REAL_WORLD)).toInt(),
+                surfaceDimensionsPx =
+                    Dimensions(
+                        labelDimensions.width * trackedEntity.getWorldSpaceScale(),
+                        labelDimensions.height * trackedEntity.getWorldSpaceScale(),
                     ),
             )
         return debugPanel
diff --git a/xr/scenecore/integration-tests/visibilitytest/build.gradle b/xr/scenecore/integration-tests/visibilitytest/build.gradle
index a2f72c8..8277108 100644
--- a/xr/scenecore/integration-tests/visibilitytest/build.gradle
+++ b/xr/scenecore/integration-tests/visibilitytest/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.ApkCopyHelperKt
 import androidx.build.KotlinTarget
 import androidx.build.SoftwareType
@@ -72,8 +71,6 @@
     implementation("androidx.core:core:1.9.0")
     implementation("androidx.lifecycle:lifecycle-common:2.8.7")
     implementation("com.google.errorprone:error_prone_annotations:2.30.0")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
 }
 
 // Making this APK available via Android Build so the QA team can
diff --git a/xr/scenecore/integration-tests/visibilitytest/src/main/kotlin/androidx/xr/scenecore/samples/visibilitytest/VisibilityTestActivity.kt b/xr/scenecore/integration-tests/visibilitytest/src/main/kotlin/androidx/xr/scenecore/samples/visibilitytest/VisibilityTestActivity.kt
index b7a1094..1689fbb 100644
--- a/xr/scenecore/integration-tests/visibilitytest/src/main/kotlin/androidx/xr/scenecore/samples/visibilitytest/VisibilityTestActivity.kt
+++ b/xr/scenecore/integration-tests/visibilitytest/src/main/kotlin/androidx/xr/scenecore/samples/visibilitytest/VisibilityTestActivity.kt
@@ -26,12 +26,12 @@
 import androidx.appcompat.app.AppCompatActivity
 import androidx.xr.runtime.math.Pose
 import androidx.xr.runtime.math.Vector3
+import androidx.xr.scenecore.Dimensions
 import androidx.xr.scenecore.Entity
 import androidx.xr.scenecore.GltfModel
 import androidx.xr.scenecore.GltfModelEntity
 import androidx.xr.scenecore.MovableComponent
 import androidx.xr.scenecore.PanelEntity
-import androidx.xr.scenecore.PixelDimensions
 import androidx.xr.scenecore.Session
 
 class VisibilityTestActivity : AppCompatActivity() {
@@ -155,7 +155,8 @@
             PanelEntity.create(
                 session,
                 panelContentView,
-                PixelDimensions(640, 480),
+                Dimensions(640f, 480f),
+                Dimensions(0.1f, 0.1f, 0.1f),
                 name,
                 Pose(Vector3(-0.5f, -0.1f, 0f)),
             )
diff --git a/xr/scenecore/scenecore-testing/api/restricted_current.txt b/xr/scenecore/scenecore-testing/api/restricted_current.txt
index 59ad0b9e..eb9484e 100644
--- a/xr/scenecore/scenecore-testing/api/restricted_current.txt
+++ b/xr/scenecore/scenecore-testing/api/restricted_current.txt
@@ -5,18 +5,15 @@
     ctor public FakeImpressApi();
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> animateGltfModel(int, String?, boolean);
     method public com.google.ar.imp.apibindings.Texture borrowReflectionTexture();
-    method public void clearPreferredEnvironmentIblAsset();
     method public int createImpressNode();
     method public int createStereoSurface(@com.google.ar.imp.apibindings.ImpressApi.StereoMode int);
     method public com.google.common.util.concurrent.ListenableFuture<com.google.ar.imp.apibindings.WaterMaterial!> createWaterMaterial(boolean);
     method public void destroyImpressNode(int);
     method public void destroyNativeObject(long);
-    method public long getCurrentEnvironmentLight();
     method public int getImpressNodeParent(int);
     method public java.util.Map<androidx.xr.scenecore.testing.FakeImpressApi.GltfNodeData!,androidx.xr.scenecore.testing.FakeImpressApi.GltfNodeData!> getImpressNodes();
     method public java.util.List<java.lang.Integer!> getImpressNodesForToken(long);
     method public java.util.Map<java.lang.Long!,androidx.xr.scenecore.testing.FakeImpressApi.MaterialData!> getMaterials();
-    method public com.google.ar.imp.apibindings.Texture getReflectionTextureFromIbl(long);
     method public java.util.Map<java.lang.Integer!,androidx.xr.scenecore.testing.FakeImpressApi.StereoSurfaceEntityData!> getStereoSurfaceEntities();
     method public android.view.Surface getSurfaceFromStereoSurface(int);
     method public java.util.Map<java.lang.Long!,com.google.ar.imp.apibindings.Texture!> getTextureImages();
@@ -25,28 +22,20 @@
     method public int impressNodeLoopAnimatingSize();
     method public int instanceGltfModel(long);
     method public int instanceGltfModel(long, boolean);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Long!> loadGltfModel(byte[], String);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Long!> loadGltfModel(String);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Long!> loadImageBasedLightingAsset(byte[], String);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Long!> loadImageBasedLightingAsset(String);
     method public com.google.common.util.concurrent.ListenableFuture<com.google.ar.imp.apibindings.Texture!> loadTexture(String, com.google.ar.imp.apibindings.TextureSampler);
     method public void onPause();
     method public void onResume();
     method public void releaseGltfModel(long);
-    method public void releaseImageBasedLightingAsset(long);
-    method public void setAlphaMapOnWaterMaterial(long, long);
     method public void setAlphaStepMultiplierOnWaterMaterial(long, float);
     method public void setAlphaStepUOnWaterMaterial(long, float, float, float, float);
     method public void setAlphaStepVOnWaterMaterial(long, float, float, float, float);
     method public void setGltfModelColliderEnabled(int, boolean);
     method public void setImpressNodeParent(int, int);
     method public void setMaterialOverride(int, long, String);
-    method public void setNormalBoundaryOnWaterMaterial(long, float);
     method public void setNormalMapOnWaterMaterial(long, long);
     method public void setNormalSpeedOnWaterMaterial(long, float);
     method public void setNormalTilingOnWaterMaterial(long, float);
-    method public void setNormalZOnWaterMaterial(long, float);
-    method public void setPreferredEnvironmentLight(long);
     method public void setReflectionCubeOnWaterMaterial(long, long);
     method public void setStereoModeForStereoSurface(int, @com.google.ar.imp.apibindings.ImpressApi.StereoMode int);
     method public void setStereoSurfaceEntityCanvasShapeHemisphere(int, float);
@@ -75,7 +64,6 @@
   public enum FakeImpressApi.MaterialData.Type {
     enum_constant public static final androidx.xr.scenecore.testing.FakeImpressApi.MaterialData.Type GENERIC;
     enum_constant public static final androidx.xr.scenecore.testing.FakeImpressApi.MaterialData.Type WATER;
-    enum_constant public static final androidx.xr.scenecore.testing.FakeImpressApi.MaterialData.Type WATER_ALPHA;
   }
 
   public static class FakeImpressApi.StereoSurfaceEntityData {
@@ -138,8 +126,8 @@
     method public androidx.xr.scenecore.testing.FakeXrExtensions.FakeActivityPanel getActivityPanelForHost(android.app.Activity);
     method public int getApiVersion();
     method public androidx.xr.extensions.Config getConfig();
-    method public androidx.xr.extensions.node.Node? getFakeEnvironmentNode();
-    method public androidx.xr.extensions.node.Node? getFakeNodeForMainWindow();
+    method public androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode? getFakeEnvironmentNode();
+    method public androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode? getFakeNodeForMainWindow();
     method public androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode? getFakeTaskNode();
     method public int getMainWindowHeight();
     method public int getMainWindowWidth();
@@ -168,8 +156,8 @@
     method @Deprecated public androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode testGetNodeWithEnvironmentToken(androidx.xr.extensions.asset.EnvironmentToken);
     method @Deprecated public androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode testGetNodeWithGltfToken(androidx.xr.extensions.asset.GltfModelToken);
     field public final java.util.Map<android.app.Activity!,androidx.xr.scenecore.testing.FakeXrExtensions.FakeActivityPanel!> activityPanelMap;
-    field public final java.util.List<androidx.xr.extensions.asset.EnvironmentToken!> createdEnvironmentTokens;
-    field public final java.util.List<com.android.extensions.xr.asset.FakeGltfModelToken!> createdGltfModelTokens;
+    field public final java.util.List<androidx.xr.scenecore.testing.FakeXrExtensions.FakeEnvironmentToken!> createdEnvironmentTokens;
+    field public final java.util.List<androidx.xr.scenecore.testing.FakeXrExtensions.FakeGltfModelToken!> createdGltfModelTokens;
     field public final java.util.List<androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode!> createdNodes;
     field public final androidx.xr.scenecore.testing.FakeXrExtensions.FakeSpatialAudioExtensions fakeSpatialAudioExtensions;
     field public final androidx.xr.scenecore.testing.FakeXrExtensions.FakeSpatialState fakeSpatialState;
@@ -203,10 +191,56 @@
     method public boolean isClosed();
   }
 
+  public static class FakeXrExtensions.FakeConfig implements androidx.xr.extensions.Config {
+    ctor public FakeXrExtensions.FakeConfig();
+    method public float defaultPixelsPerMeter(float);
+    field public static final float DEFAULT_PIXELS_PER_METER = 1.0f;
+  }
+
+  public static class FakeXrExtensions.FakeEnvironmentToken implements androidx.xr.extensions.asset.EnvironmentToken {
+    ctor public FakeXrExtensions.FakeEnvironmentToken(String);
+    method public String getUrl();
+  }
+
   public static class FakeXrExtensions.FakeEnvironmentVisibilityState implements androidx.xr.extensions.environment.EnvironmentVisibilityState {
     ctor public FakeXrExtensions.FakeEnvironmentVisibilityState(@androidx.xr.extensions.environment.EnvironmentVisibilityState.State int);
   }
 
+  public static class FakeXrExtensions.FakeGltfModelToken implements androidx.xr.extensions.asset.GltfModelToken {
+    ctor public FakeXrExtensions.FakeGltfModelToken(String);
+    method public String getUrl();
+  }
+
+  public static class FakeXrExtensions.FakeInputEvent implements androidx.xr.extensions.node.InputEvent {
+    ctor public FakeXrExtensions.FakeInputEvent();
+    method public int getAction();
+    method public androidx.xr.extensions.node.Vec3 getDirection();
+    method public int getDispatchFlags();
+    method public androidx.xr.extensions.node.InputEvent.HitInfo? getHitInfo();
+    method public androidx.xr.extensions.node.Vec3 getOrigin();
+    method public int getPointerType();
+    method public androidx.xr.extensions.node.InputEvent.HitInfo? getSecondaryHitInfo();
+    method public int getSource();
+    method public long getTimestamp();
+    method public void setDirection(androidx.xr.extensions.node.Vec3);
+    method public void setDispatchFlags(int);
+    method public void setFakeHitInfo(androidx.xr.scenecore.testing.FakeXrExtensions.FakeInputEvent.FakeHitInfo);
+    method public void setOrigin(androidx.xr.extensions.node.Vec3);
+    method public void setTimestamp(long);
+  }
+
+  public static class FakeXrExtensions.FakeInputEvent.FakeHitInfo implements androidx.xr.extensions.node.InputEvent.HitInfo {
+    ctor public FakeXrExtensions.FakeInputEvent.FakeHitInfo();
+    method public androidx.xr.extensions.node.Vec3? getHitPosition();
+    method public androidx.xr.extensions.node.Node getInputNode();
+    method public int getSubspaceImpressNodeId();
+    method public androidx.xr.extensions.node.Mat4f getTransform();
+    method public void setHitPosition(androidx.xr.extensions.node.Vec3?);
+    method public void setInputNode(androidx.xr.extensions.node.Node);
+    method public void setSubspaceImpressNodeId(int);
+    method public void setTransform(androidx.xr.extensions.node.Mat4f);
+  }
+
   public static class FakeXrExtensions.FakeMediaPlayerExtensions implements androidx.xr.extensions.media.MediaPlayerExtensions {
     ctor public FakeXrExtensions.FakeMediaPlayerExtensions();
     method public androidx.xr.extensions.media.PointSourceAttributes? getPointSourceAttributes();
@@ -214,8 +248,6 @@
   }
 
   public static final class FakeXrExtensions.FakeNode implements androidx.xr.extensions.node.Node {
-    ctor public FakeXrExtensions.FakeNode(androidx.xr.extensions.node.Node);
-    ctor public FakeXrExtensions.FakeNode(com.android.extensions.xr.node.Node);
     method public int describeContents();
     method public float getAlpha();
     method public android.os.IBinder? getAnchorId();
@@ -223,14 +255,14 @@
     method @Deprecated public androidx.xr.extensions.asset.EnvironmentToken? getEnvironment();
     method public java.util.concurrent.Executor? getExecutor();
     method @Deprecated public androidx.xr.extensions.asset.GltfModelToken? getGltfModel();
-    method public com.android.extensions.xr.function.Consumer<com.android.extensions.xr.node.InputEvent!>? getListener();
+    method public androidx.xr.extensions.Consumer<androidx.xr.extensions.node.InputEvent!>? getListener();
     method public String? getName();
-    method public androidx.xr.extensions.node.Node? getParent();
+    method public androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode? getParent();
     method public androidx.xr.extensions.Consumer<java.lang.Integer!>? getPointerCaptureStateCallback();
     method public androidx.xr.extensions.node.ReformOptions? getReformOptions();
-    method public android.view.SurfaceControl? getSurfaceControl();
+    method public android.view.SurfaceControlViewHost.SurfacePackage? getSurfacePackage();
     method public java.util.concurrent.Executor? getTransformExecutor();
-    method public com.android.extensions.xr.function.Consumer<com.android.extensions.xr.node.NodeTransform!>? getTransformListener();
+    method public androidx.xr.extensions.Consumer<androidx.xr.extensions.node.NodeTransform!>? getTransformListener();
     method public float getWOrientation();
     method public float getXOrientation();
     method public float getXPosition();
@@ -241,22 +273,68 @@
     method public boolean isVisible();
     method public void listenForInput(androidx.xr.extensions.Consumer<androidx.xr.extensions.node.InputEvent!>, java.util.concurrent.Executor);
     method public void requestPointerCapture(androidx.xr.extensions.Consumer<java.lang.Integer!>, java.util.concurrent.Executor);
-    method public void sendInputEvent(com.android.extensions.xr.node.InputEvent);
-    method public void sendTransformEvent(com.android.extensions.xr.node.NodeTransform);
+    method public void sendInputEvent(androidx.xr.extensions.node.InputEvent);
+    method public void sendTransformEvent(androidx.xr.scenecore.testing.FakeXrExtensions.FakeNodeTransform);
     method public void setNonPointerFocusTarget(android.view.AttachedSurfaceControl);
     method public void stopListeningForInput();
     method public void stopPointerCapture();
     method public java.io.Closeable subscribeToTransform(androidx.xr.extensions.Consumer<androidx.xr.extensions.node.NodeTransform!>, java.util.concurrent.Executor);
     method public void writeToParcel(android.os.Parcel, int);
-    field public final androidx.xr.extensions.node.Node! node;
-    field public final com.android.extensions.xr.node.Node! realNode;
-    field public final com.android.extensions.xr.node.ShadowNode! shadowNode;
+  }
+
+  public static class FakeXrExtensions.FakeNodeTransaction implements androidx.xr.extensions.node.NodeTransaction {
+  }
+
+  public static class FakeXrExtensions.FakeNodeTransform implements androidx.xr.extensions.node.NodeTransform {
+    ctor public FakeXrExtensions.FakeNodeTransform(androidx.xr.extensions.node.Mat4f);
+    method public long getTimestamp();
+    method public androidx.xr.extensions.node.Mat4f getTransform();
   }
 
   public static class FakeXrExtensions.FakePassthroughVisibilityState implements androidx.xr.extensions.environment.PassthroughVisibilityState {
     ctor public FakeXrExtensions.FakePassthroughVisibilityState(@androidx.xr.extensions.environment.PassthroughVisibilityState.State int, float);
   }
 
+  public static class FakeXrExtensions.FakeReformEvent implements androidx.xr.extensions.node.ReformEvent {
+    ctor public FakeXrExtensions.FakeReformEvent();
+    method public androidx.xr.extensions.node.Vec3 getCurrentRayDirection();
+    method public androidx.xr.extensions.node.Vec3 getCurrentRayOrigin();
+    method public int getId();
+    method public androidx.xr.extensions.node.Vec3 getInitialRayDirection();
+    method public androidx.xr.extensions.node.Vec3 getInitialRayOrigin();
+    method public androidx.xr.extensions.node.Quatf getProposedOrientation();
+    method public androidx.xr.extensions.node.Vec3 getProposedPosition();
+    method public androidx.xr.extensions.node.Vec3 getProposedScale();
+    method public androidx.xr.extensions.node.Vec3 getProposedSize();
+    method public int getState();
+    method public int getType();
+    method public void setProposedOrientation(androidx.xr.extensions.node.Quatf);
+    method public void setProposedPosition(androidx.xr.extensions.node.Vec3);
+    method public void setProposedScale(androidx.xr.extensions.node.Vec3);
+    method public void setProposedSize(androidx.xr.extensions.node.Vec3);
+    method public void setState(int);
+    method public void setType(int);
+  }
+
+  public static class FakeXrExtensions.FakeReformOptions implements androidx.xr.extensions.node.ReformOptions {
+    method public androidx.xr.extensions.node.Vec3 getCurrentSize();
+    method public int getEnabledReform();
+    method public androidx.xr.extensions.Consumer<androidx.xr.extensions.node.ReformEvent!> getEventCallback();
+    method public java.util.concurrent.Executor getEventExecutor();
+    method public float getFixedAspectRatio();
+    method public int getFlags();
+    method public androidx.xr.extensions.node.Vec3 getMaximumSize();
+    method public androidx.xr.extensions.node.Vec3 getMinimumSize();
+    method public androidx.xr.extensions.node.ReformOptions setCurrentSize(androidx.xr.extensions.node.Vec3);
+    method public androidx.xr.extensions.node.ReformOptions setEnabledReform(int);
+    method public androidx.xr.extensions.node.ReformOptions setEventCallback(androidx.xr.extensions.Consumer<androidx.xr.extensions.node.ReformEvent!>);
+    method public androidx.xr.extensions.node.ReformOptions setEventExecutor(java.util.concurrent.Executor);
+    method public androidx.xr.extensions.node.ReformOptions setFixedAspectRatio(float);
+    method public androidx.xr.extensions.node.ReformOptions setFlags(int);
+    method public androidx.xr.extensions.node.ReformOptions setMaximumSize(androidx.xr.extensions.node.Vec3);
+    method public androidx.xr.extensions.node.ReformOptions setMinimumSize(androidx.xr.extensions.node.Vec3);
+  }
+
   public static class FakeXrExtensions.FakeSoundPoolExtensions implements androidx.xr.extensions.media.SoundPoolExtensions {
     ctor public FakeXrExtensions.FakeSoundPoolExtensions();
     method public void setPlayAsPointSourceResult(int);
diff --git a/xr/scenecore/scenecore-testing/build.gradle b/xr/scenecore/scenecore-testing/build.gradle
index 665bf5a..92ebe1e 100644
--- a/xr/scenecore/scenecore-testing/build.gradle
+++ b/xr/scenecore/scenecore-testing/build.gradle
@@ -22,7 +22,6 @@
  * modifying its settings.
  */
 
-import androidx.build.AndroidXConfig
 import androidx.build.KotlinTarget
 import androidx.build.SoftwareType
 
@@ -38,9 +37,6 @@
     implementation("androidx.annotation:annotation:1.8.1")
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
     implementation("com.google.ar:impress:0.0.3")
-
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
-    implementation(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.host.test.jar")))
 }
 
 android {
diff --git a/xr/scenecore/scenecore-testing/src/main/java/androidx/xr/scenecore/testing/FakeImpressApi.java b/xr/scenecore/scenecore-testing/src/main/java/androidx/xr/scenecore/testing/FakeImpressApi.java
index cb52d05..3ec4e74 100644
--- a/xr/scenecore/scenecore-testing/src/main/java/androidx/xr/scenecore/testing/FakeImpressApi.java
+++ b/xr/scenecore/scenecore-testing/src/main/java/androidx/xr/scenecore/testing/FakeImpressApi.java
@@ -16,7 +16,6 @@
 
 package androidx.xr.scenecore.testing;
 
-import android.content.res.Resources.NotFoundException;
 import android.graphics.SurfaceTexture;
 import android.view.Surface;
 
@@ -115,8 +114,7 @@
         /** Enum representing the different built-in material types that can be created. */
         public enum Type {
             GENERIC,
-            WATER,
-            WATER_ALPHA
+            WATER
         }
 
         @NonNull public Type type;
@@ -142,12 +140,8 @@
         }
     }
 
-    // Vector of image based lighting asset tokens.
-    private final List<Long> mImageBasedLightingAssets = new ArrayList<>();
-
     // Map of model tokens to the list of impress nodes that are instances of that model.
     private final Map<Long, List<Integer>> mGltfModels = new HashMap<>();
-
     // Map of impress nodes to their parent impress nodes.
     private final Map<GltfNodeData, GltfNodeData> mImpressNodes = new HashMap<>();
 
@@ -166,12 +160,10 @@
     // Map of material tokens to their associated MaterialData object
     public final Map<Long, MaterialData> mMaterials = new HashMap<>();
 
-    private int mNextImageBasedLightingAssetId = 1;
     private int mNextModelId = 1;
     private int mNextNodeId = 1;
     private long mNextTextureId = 1;
     private long mNextMaterialId = 1;
-    private long mCurrentEnvironmentLightId = -1;
 
     @NonNull
     public Map<Integer, StereoSurfaceEntityData> getStereoSurfaceEntities() {
@@ -188,57 +180,9 @@
     public void onPause() {}
 
     @Override
-    public void releaseImageBasedLightingAsset(long iblToken) {
-        if (!mImageBasedLightingAssets.contains(iblToken)) {
-            throw new NotFoundException("Image based lighting asset token not found");
-        }
-        mImageBasedLightingAssets.remove(iblToken);
-    }
-
-    @Override
     @NonNull
     @SuppressWarnings({"RestrictTo", "AsyncSuffixFuture"})
-    public ListenableFuture<Long> loadImageBasedLightingAsset(@NonNull String path) {
-        long imageBasedLightingAssetToken = mNextImageBasedLightingAssetId++;
-        mImageBasedLightingAssets.add(imageBasedLightingAssetToken);
-        // TODO(b/352827267): Enforce minSDK API strategy - go/androidx-api-guidelines#compat-newapi
-        ResolvableFuture<Long> ret = ResolvableFuture.create();
-        ret.set(imageBasedLightingAssetToken);
-
-        return ret;
-    }
-
-    @Override
-    @NonNull
-    @SuppressWarnings({"RestrictTo", "AsyncSuffixFuture"})
-    public ListenableFuture<Long> loadImageBasedLightingAsset(
-            @NonNull byte[] data, @NonNull String key) {
-        long imageBasedLightingAssetToken = mNextImageBasedLightingAssetId++;
-        mImageBasedLightingAssets.add(imageBasedLightingAssetToken);
-        // TODO(b/352827267): Enforce minSDK API strategy - go/androidx-api-guidelines#compat-newapi
-        ResolvableFuture<Long> ret = ResolvableFuture.create();
-        ret.set(imageBasedLightingAssetToken);
-
-        return ret;
-    }
-
-    @Override
-    @NonNull
-    @SuppressWarnings({"RestrictTo", "AsyncSuffixFuture"})
-    public ListenableFuture<Long> loadGltfModel(@NonNull String path) {
-        long modelToken = mNextModelId++;
-        mGltfModels.put(modelToken, new ArrayList<>());
-        // TODO(b/352827267): Enforce minSDK API strategy - go/androidx-api-guidelines#compat-newapi
-        ResolvableFuture<Long> ret = ResolvableFuture.create();
-        ret.set(modelToken);
-
-        return ret;
-    }
-
-    @Override
-    @NonNull
-    @SuppressWarnings({"RestrictTo", "AsyncSuffixFuture"})
-    public ListenableFuture<Long> loadGltfModel(@NonNull byte[] data, @NonNull String key) {
+    public ListenableFuture<Long> loadGltfModel(@NonNull String name) {
         long modelToken = mNextModelId++;
         mGltfModels.put(modelToken, new ArrayList<>());
         // TODO(b/352827267): Enforce minSDK API strategy - go/androidx-api-guidelines#compat-newapi
@@ -251,7 +195,7 @@
     @Override
     public void releaseGltfModel(long modelToken) {
         if (!mGltfModels.containsKey(modelToken)) {
-            throw new NotFoundException("Model token not found");
+            throw new IllegalArgumentException("Model token not found");
         }
         mGltfModels.remove(modelToken);
     }
@@ -499,19 +443,9 @@
     }
 
     @Override
-    @NonNull
-    public Texture getReflectionTextureFromIbl(long iblToken) {
-        long textureImageToken = mNextTextureId++;
-        return new Texture.Builder()
-                .setNativeTexture(textureImageToken)
-                .setTextureSampler(new TextureSampler.Builder().build())
-                .build();
-    }
-
-    @Override
     @SuppressWarnings("RestrictTo")
     @NonNull
-    public ListenableFuture<WaterMaterial> createWaterMaterial(boolean isAlphaMapVersion) {
+    public ListenableFuture<WaterMaterial> createWaterMaterial(boolean transparent) {
         long materialToken = mNextMaterialId++;
         WaterMaterial material =
                 new WaterMaterial.Builder()
@@ -545,35 +479,20 @@
     }
 
     @Override
-    public void setAlphaStepMultiplierOnWaterMaterial(
-            long nativeMaterial, float alphaStepMultiplier) {
-        throw new IllegalArgumentException("not implemented");
-    }
-
-    @Override
-    public void setAlphaMapOnWaterMaterial(long nativeWaterMaterial, long alphaMap) {
-        throw new IllegalArgumentException("not implemented");
-    }
-
-    @Override
-    public void setNormalZOnWaterMaterial(long nativeWaterMaterial, float normalZ) {
-        throw new IllegalArgumentException("not implemented");
-    }
-
-    @Override
-    public void setNormalBoundaryOnWaterMaterial(long nativeWaterMaterial, float normalBoundary) {
-        throw new IllegalArgumentException("not implemented");
-    }
-
-    @Override
     public void setAlphaStepUOnWaterMaterial(
-            long nativeWaterMaterial, float x, float y, float z, float w) {
+            long nativeMaterial, float x, float y, float z, float w) {
         throw new IllegalArgumentException("not implemented");
     }
 
     @Override
     public void setAlphaStepVOnWaterMaterial(
-            long nativeWaterMaterial, float x, float y, float z, float w) {
+            long nativeMaterial, float x, float y, float z, float w) {
+        throw new IllegalArgumentException("not implemented");
+    }
+
+    @Override
+    public void setAlphaStepMultiplierOnWaterMaterial(
+            long nativeMaterial, float alphaStepMultiplier) {
         throw new IllegalArgumentException("not implemented");
     }
 
@@ -597,16 +516,6 @@
         gltfNodeData.setMaterialOverride(mMaterials.get(nativeMaterial));
     }
 
-    @Override
-    public void setPreferredEnvironmentLight(long iblToken) {
-        mCurrentEnvironmentLightId = iblToken;
-    }
-
-    @Override
-    public void clearPreferredEnvironmentIblAsset() {
-        mCurrentEnvironmentLightId = -1;
-    }
-
     /** Returns the map of texture image tokens to their associated Texture object. */
     @NonNull
     public Map<Long, Texture> getTextureImages() {
@@ -625,11 +534,6 @@
         return mImpressNodes;
     }
 
-    /** Returns the current environment light token. */
-    public long getCurrentEnvironmentLight() {
-        return mCurrentEnvironmentLightId;
-    }
-
     @Nullable
     private GltfNodeData getGltfNodeData(int impressNode) {
         for (Map.Entry<GltfNodeData, GltfNodeData> pair : mImpressNodes.entrySet()) {
diff --git a/xr/scenecore/scenecore-testing/src/main/java/androidx/xr/scenecore/testing/FakeXrExtensions.java b/xr/scenecore/scenecore-testing/src/main/java/androidx/xr/scenecore/testing/FakeXrExtensions.java
index 8e18339..a07e96a 100644
--- a/xr/scenecore/scenecore-testing/src/main/java/androidx/xr/scenecore/testing/FakeXrExtensions.java
+++ b/xr/scenecore/scenecore-testing/src/main/java/androidx/xr/scenecore/testing/FakeXrExtensions.java
@@ -16,8 +16,6 @@
 
 package androidx.xr.scenecore.testing;
 
-import static java.util.Objects.requireNonNull;
-
 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.Intent;
@@ -29,7 +27,7 @@
 import android.os.IBinder;
 import android.os.Parcel;
 import android.view.AttachedSurfaceControl;
-import android.view.SurfaceControl;
+import android.view.SurfaceControlViewHost;
 import android.view.View;
 import android.view.ViewGroup;
 
@@ -40,8 +38,6 @@
 import androidx.xr.extensions.Consumer;
 import androidx.xr.extensions.XrExtensionResult;
 import androidx.xr.extensions.XrExtensions;
-import androidx.xr.extensions.XrExtensionsProvider;
-import androidx.xr.extensions.asset.TokenConverter;
 import androidx.xr.extensions.environment.EnvironmentVisibilityState;
 import androidx.xr.extensions.environment.PassthroughVisibilityState;
 import androidx.xr.extensions.media.AudioTrackExtensions;
@@ -52,13 +48,15 @@
 import androidx.xr.extensions.media.SpatializerExtensions;
 import androidx.xr.extensions.media.XrSpatialAudioExtensions;
 import androidx.xr.extensions.node.InputEvent;
+import androidx.xr.extensions.node.Mat4f;
 import androidx.xr.extensions.node.Node;
 import androidx.xr.extensions.node.NodeTransaction;
 import androidx.xr.extensions.node.NodeTransform;
-import androidx.xr.extensions.node.NodeTypeConverter;
+import androidx.xr.extensions.node.Quatf;
 import androidx.xr.extensions.node.ReformEvent;
 import androidx.xr.extensions.node.ReformOptions;
 import androidx.xr.extensions.node.Vec3;
+import androidx.xr.extensions.passthrough.PassthroughState;
 import androidx.xr.extensions.space.ActivityPanel;
 import androidx.xr.extensions.space.ActivityPanelLaunchParameters;
 import androidx.xr.extensions.space.Bounds;
@@ -68,10 +66,6 @@
 import androidx.xr.extensions.splitengine.SplitEngineBridge;
 import androidx.xr.extensions.subspace.Subspace;
 
-import com.android.extensions.xr.asset.FakeGltfModelToken;
-import com.android.extensions.xr.node.NodeRepository;
-import com.android.extensions.xr.node.ShadowNode;
-
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 
 import java.io.Closeable;
@@ -96,31 +90,17 @@
             "This function is not implemented yet in FakeXrExtensions.  Please add an"
                     + " implementation if support is desired for testing.";
 
-    // Because there are many tests which are written to use the FakeXrExtensions (and associated
-    // classes) interface to minimize the scope of changes FakeXrExtensions will defer to
-    // XrExtensionsProvider which when used in a host test will use the fake implementation of the
-    // com.android.extensions.xr classes. FakeXrExtensions is thus a thin androidx.xr.extensions
-    // wrapper around the com.android.extensions.xr fake classes. Once all tests are migrated to use
-    // the com.android.extensions.xr types this fake can be removed.
-    // TODO: b/399893709 - Remove FakeXrExtensions once tests are migrated to use the real
-    // XrExtensionsProvider.
-    @NonNull private final XrExtensions extensions = XrExtensionsProvider.getXrExtensions();
-
-    @NonNull private final NodeRepository mNodeRepository = NodeRepository.getInstance();
-
     @NonNull public final List<FakeNode> createdNodes = new ArrayList<>();
 
     @NonNull public final List<FakeGltfModelToken> createdGltfModelTokens = new ArrayList<>();
 
-    @NonNull
-    public final List<androidx.xr.extensions.asset.EnvironmentToken> createdEnvironmentTokens =
-            new ArrayList<>();
+    @NonNull public final List<FakeEnvironmentToken> createdEnvironmentTokens = new ArrayList<>();
 
     @NonNull public final Map<Activity, FakeActivityPanel> activityPanelMap = new HashMap<>();
 
     FakeNode mFakeTaskNode = null;
-    Node mEnvironmentNode = null;
-    Node mNodeForMainWindow = null;
+    FakeNode mFakeEnvironmentNode = null;
+    FakeNode mFakeNodeForMainWindow = null;
 
     // TODO: b/370033054 - fakeSpatialState should be updated according to some fake extensions
     // calls
@@ -138,39 +118,40 @@
 
     float mPreferredAspectRatioHsm = 0.0f;
     int mOpenXrWorldSpaceType = 0;
-    NodeTransaction mLastFakeNodeTransaction = null;
+    FakeNodeTransaction mLastFakeNodeTransaction = null;
 
     @NonNull
     public final FakeSpatialAudioExtensions fakeSpatialAudioExtensions =
             new FakeSpatialAudioExtensions();
 
     @Nullable
-    public Node getFakeEnvironmentNode() {
-        return mEnvironmentNode;
+    public FakeNode getFakeEnvironmentNode() {
+        return mFakeEnvironmentNode;
     }
 
     @Nullable
-    public Node getFakeNodeForMainWindow() {
-        return mNodeForMainWindow;
+    public FakeNode getFakeNodeForMainWindow() {
+        return mFakeNodeForMainWindow;
     }
 
     @Override
     public int getApiVersion() {
-        return extensions.getApiVersion();
+        // The API surface is aligned with the initial XRU release.
+        return 1;
     }
 
     @Override
     @NonNull
     public Node createNode() {
-        Node node = extensions.createNode();
-        createdNodes.add(new FakeNode(node));
+        FakeNode node = new FakeNode();
+        createdNodes.add(node);
         return node;
     }
 
     @Override
     @NonNull
     public NodeTransaction createNodeTransaction() {
-        mLastFakeNodeTransaction = extensions.createNodeTransaction();
+        mLastFakeNodeTransaction = new FakeNodeTransaction();
         return mLastFakeNodeTransaction;
     }
 
@@ -183,7 +164,7 @@
     @Override
     @NonNull
     public Config getConfig() {
-        return extensions.getConfig();
+        return new FakeConfig();
     }
 
     @NonNull
@@ -303,10 +284,11 @@
             @NonNull Node windowNode,
             @NonNull Consumer<XrExtensionResult> callback,
             @NonNull Executor executor) {
-        mFakeTaskNode = new FakeNode(sceneNode);
+        mFakeTaskNode = (FakeNode) sceneNode;
         mFakeTaskNode.mName = "taskNode";
 
-        mNodeForMainWindow = windowNode;
+        mFakeNodeForMainWindow = (FakeNode) windowNode;
+        mFakeNodeForMainWindow.mName = "nodeForMainWindow";
 
         executor.execute(() -> callback.accept(createAsyncResult()));
     }
@@ -317,7 +299,7 @@
             @NonNull Consumer<XrExtensionResult> callback,
             @NonNull Executor executor) {
         mFakeTaskNode = null;
-        mNodeForMainWindow = null;
+        mFakeNodeForMainWindow = null;
 
         executor.execute(() -> callback.accept(createAsyncResult()));
     }
@@ -333,7 +315,8 @@
             @NonNull Node environmentNode,
             @NonNull Consumer<XrExtensionResult> callback,
             @NonNull Executor executor) {
-        mEnvironmentNode = environmentNode;
+        mFakeEnvironmentNode = (FakeNode) environmentNode;
+        mFakeEnvironmentNode.mName = "environmentNode";
 
         executor.execute(() -> callback.accept(createAsyncResult()));
     }
@@ -343,7 +326,7 @@
             @NonNull Activity activity,
             @NonNull Consumer<XrExtensionResult> callback,
             @NonNull Executor executor) {
-        mEnvironmentNode = null;
+        mFakeEnvironmentNode = null;
 
         executor.execute(() -> callback.accept(createAsyncResult()));
     }
@@ -365,7 +348,7 @@
                     @Nullable String url) {
         FakeGltfModelToken modelToken = new FakeGltfModelToken(url);
         createdGltfModelTokens.add(modelToken);
-        return CompletableFuture.completedFuture(TokenConverter.toLibrary(modelToken));
+        return CompletableFuture.completedFuture(modelToken);
     }
 
     /**
@@ -377,19 +360,18 @@
     @Override
     @NonNull
     @Deprecated
+    //  public ListenableFuture</* @Nullable */ EnvironmentToken>
+    // loadEnvironment(
     public CompletableFuture</* @Nullable */ androidx.xr.extensions.asset.EnvironmentToken>
             loadEnvironment(
                     @Nullable InputStream asset,
                     int regionSizeBytes,
                     int regionOffsetBytes,
                     @Nullable String url) {
-        CompletableFuture<androidx.xr.extensions.asset.EnvironmentToken> future =
-                extensions.loadEnvironment(asset, regionSizeBytes, regionOffsetBytes, url);
-        return future.thenApply(
-                imageToken -> {
-                    createdEnvironmentTokens.add(imageToken);
-                    return imageToken;
-                });
+        FakeEnvironmentToken imageToken = new FakeEnvironmentToken(url);
+        createdEnvironmentTokens.add(imageToken);
+        //    return immediateFuture(imageToken);
+        return CompletableFuture.completedFuture(imageToken);
     }
 
     /**
@@ -441,13 +423,12 @@
     @Deprecated
     public FakeNode testGetNodeWithGltfToken(
             @NonNull androidx.xr.extensions.asset.GltfModelToken token) {
-        com.android.extensions.xr.node.Node node =
-                mNodeRepository.findNode(
-                        (NodeRepository.NodeMetadata metadata) ->
-                                TokenConverter.toFramework(token)
-                                        .equals(metadata.getGltfModelToken()));
-
-        return (node != null) ? new FakeNode(node) : null;
+        for (FakeNode node : createdNodes) {
+            if (node.mGltfModel != null && node.mGltfModel.equals(token)) {
+                return node;
+            }
+        }
+        return null;
     }
 
     /**
@@ -459,13 +440,12 @@
     @Deprecated
     public FakeNode testGetNodeWithEnvironmentToken(
             @NonNull androidx.xr.extensions.asset.EnvironmentToken token) {
-        com.android.extensions.xr.node.Node node =
-                mNodeRepository.findNode(
-                        (NodeRepository.NodeMetadata metadata) ->
-                                TokenConverter.toFramework(token)
-                                        .equals(metadata.getEnvironmentToken()));
-
-        return (node != null) ? new FakeNode(node) : null;
+        for (FakeNode node : createdNodes) {
+            if (node.mEnvironment != null && node.mEnvironment.equals(token)) {
+                return node;
+            }
+        }
+        return null;
     }
 
     @Override
@@ -487,7 +467,7 @@
     @NonNull
     public ReformOptions createReformOptions(
             @NonNull Consumer<ReformEvent> callback, @NonNull Executor executor) {
-        return extensions.createReformOptions(callback, executor);
+        return new FakeReformOptions(callback, executor);
     }
 
     @Override
@@ -566,6 +546,16 @@
         FULL_SPACE
     }
 
+    /** Fake implementation of Extensions Config. */
+    public static class FakeConfig implements Config {
+        public static final float DEFAULT_PIXELS_PER_METER = 1f;
+
+        @Override
+        public float defaultPixelsPerMeter(float density) {
+            return DEFAULT_PIXELS_PER_METER;
+        }
+    }
+
     /** A fake implementation of Closeable. */
     @SuppressWarnings("NotCloseable")
     public static class FakeCloseable implements Closeable {
@@ -584,106 +574,97 @@
     /** A fake implementation of the XR extensions Node. */
     @SuppressWarnings("ParcelCreator")
     public static final class FakeNode implements Node {
-        /**
-         * A shadow of {@link com.android.extensions.xr.node.Node} which has additional methods for
-         * testing.
-         */
-        public final ShadowNode shadowNode;
-
-        /** The actual node returned from XrExtensions.createNode(). */
-        public final com.android.extensions.xr.node.Node realNode;
-
-        /**
-         * The {@link androidx.xr.extensions.node.Node} wrapper of the {@link realNode}.
-         *
-         * <p>This node is an adapter, it converts a {@link com.android.extensions.xr.node.Node} so
-         * it can be passed into the {@link androidx.xr.extensions} set of APIs.
-         */
-        public final Node node;
-
-        @NonNull private final NodeRepository nodeRepository = NodeRepository.getInstance();
-
+        FakeNode mParent = null;
+        float mXPosition = 0.0f;
+        float mYPosition = 0.0f;
+        float mZPosition = 0.0f;
+        float mXOrientation = 0.0f;
+        float mYOrientation = 0.0f;
+        float mZOrientation = 0.0f;
+        float mWOrientation = 1.0f;
+        float mXScale = 1.0f;
+        float mYScale = 1.0f;
+        float mZScale = 1.0f;
+        float mCornerRadius = 0.0f;
+        boolean mIsVisible = false;
+        float mAlpha = 1.0f;
+        androidx.xr.extensions.asset.GltfModelToken mGltfModel = null;
+        IBinder mAnchorId = null;
         String mName = null;
+        float mPassthroughOpacity = 1.0f;
+        @PassthroughState.Mode int mPassthroughMode = 0;
+        SurfaceControlViewHost.SurfacePackage mSurfacePackage = null;
+        androidx.xr.extensions.asset.EnvironmentToken mEnvironment = null;
+        Consumer<InputEvent> mListener = null;
+        Consumer<NodeTransform> mTransformListener = null;
+        Consumer<Integer> mPointerCaptureStateCallback = null;
 
-        public FakeNode(@NonNull com.android.extensions.xr.node.Node node) {
-            requireNonNull(node);
-            realNode = node;
-            shadowNode = ShadowNode.extract(node);
-            this.node = NodeTypeConverter.toLibrary(node);
-        }
+        Executor mExecutor = null;
+        ReformOptions mReformOptions;
+        Executor mTransformExecutor = null;
 
-        public FakeNode(@NonNull Node node) {
-            requireNonNull(node);
-            realNode = NodeTypeConverter.toFramework(node);
-            shadowNode = ShadowNode.extract(realNode);
-            this.node = node;
-        }
+        private FakeNode() {}
 
         @Override
         public void listenForInput(
                 @NonNull Consumer<InputEvent> listener, @NonNull Executor executor) {
-            node.listenForInput(listener, executor);
+            mListener = listener;
+            mExecutor = executor;
         }
 
         @Override
         public void stopListeningForInput() {
-            node.stopListeningForInput();
+            mListener = null;
+            mExecutor = null;
         }
 
         @Override
-        public void setNonPointerFocusTarget(@NonNull AttachedSurfaceControl focusTarget) {
-            node.setNonPointerFocusTarget(focusTarget);
-        }
+        public void setNonPointerFocusTarget(@NonNull AttachedSurfaceControl focusTarget) {}
 
         @Override
         public void requestPointerCapture(
                 @NonNull Consumer<Integer> stateCallback, @NonNull Executor executor) {
-            node.requestPointerCapture(stateCallback, executor);
+            mPointerCaptureStateCallback = stateCallback;
         }
 
         @Override
         public void stopPointerCapture() {
-            node.stopPointerCapture();
+            mPointerCaptureStateCallback = null;
         }
 
         /**
          * Fires the InputEvent callback with the given event. It is invoked on the executor
          * provided in listenForInput.
          */
-        public void sendInputEvent(@NonNull com.android.extensions.xr.node.InputEvent event) {
-            shadowNode
-                    .getInputExecutor()
-                    .execute(() -> shadowNode.getInputListener().accept(event));
+        public void sendInputEvent(@NonNull InputEvent event) {
+            mExecutor.execute(() -> mListener.accept(event));
         }
 
         /**
          * Fires the nodeTransform callback with the given transform. It is invoked on the executor
          * provided in listenForInput.
          */
-        public void sendTransformEvent(
-                @NonNull com.android.extensions.xr.node.NodeTransform nodeTransform) {
-            shadowNode
-                    .getTransformExecutor()
-                    .execute(() -> shadowNode.getTransformListener().accept(nodeTransform));
+        public void sendTransformEvent(@NonNull FakeNodeTransform nodeTransform) {
+            mTransformExecutor.execute(() -> mTransformListener.accept(nodeTransform));
         }
 
         @Override
         @NonNull
         public Closeable subscribeToTransform(
                 @NonNull Consumer<NodeTransform> transformCallback, @NonNull Executor executor) {
-            return node.subscribeToTransform(transformCallback, executor);
+            mTransformListener = transformCallback;
+            mTransformExecutor = executor;
+            return new FakeCloseable();
         }
 
         @Nullable
-        public com.android.extensions.xr.function.Consumer<
-                        com.android.extensions.xr.node.NodeTransform>
-                getTransformListener() {
-            return shadowNode.getTransformListener();
+        public Consumer<NodeTransform> getTransformListener() {
+            return mTransformListener;
         }
 
         @Nullable
         public Executor getTransformExecutor() {
-            return shadowNode.getTransformExecutor();
+            return mTransformExecutor;
         }
 
         @Override
@@ -695,48 +676,48 @@
         }
 
         @Nullable
-        public Node getParent() {
-            return NodeTypeConverter.toLibrary(nodeRepository.getParent(realNode));
+        public FakeNode getParent() {
+            return mParent;
         }
 
         public float getXPosition() {
-            return nodeRepository.getPosition(realNode).x;
+            return mXPosition;
         }
 
         public float getYPosition() {
-            return nodeRepository.getPosition(realNode).y;
+            return mYPosition;
         }
 
         public float getZPosition() {
-            return nodeRepository.getPosition(realNode).z;
+            return mZPosition;
         }
 
         public float getXOrientation() {
-            return nodeRepository.getOrientation(realNode).x;
+            return mXOrientation;
         }
 
         public float getYOrientation() {
-            return nodeRepository.getOrientation(realNode).y;
+            return mYOrientation;
         }
 
         public float getZOrientation() {
-            return nodeRepository.getOrientation(realNode).z;
+            return mZOrientation;
         }
 
         public float getWOrientation() {
-            return nodeRepository.getOrientation(realNode).w;
+            return mWOrientation;
         }
 
         public float getCornerRadius() {
-            return nodeRepository.getCornerRadius(realNode);
+            return mCornerRadius;
         }
 
         public boolean isVisible() {
-            return nodeRepository.isVisible(realNode);
+            return mIsVisible;
         }
 
         public float getAlpha() {
-            return nodeRepository.getAlpha(realNode);
+            return mAlpha;
         }
 
         /**
@@ -745,22 +726,22 @@
         @Nullable
         @Deprecated
         public androidx.xr.extensions.asset.GltfModelToken getGltfModel() {
-            return TokenConverter.toLibrary(nodeRepository.getGltfModelToken(realNode));
+            return mGltfModel;
         }
 
         @Nullable
         public IBinder getAnchorId() {
-            return nodeRepository.getAnchorId(realNode);
+            return mAnchorId;
         }
 
         @Nullable
         public String getName() {
-            return nodeRepository.getName(realNode);
+            return mName;
         }
 
         @Nullable
-        public SurfaceControl getSurfaceControl() {
-            return nodeRepository.getSurfaceControl(realNode);
+        public SurfaceControlViewHost.SurfacePackage getSurfacePackage() {
+            return mSurfacePackage;
         }
 
         /**
@@ -769,43 +750,261 @@
         @Nullable
         @Deprecated
         public androidx.xr.extensions.asset.EnvironmentToken getEnvironment() {
-            return TokenConverter.toLibrary(nodeRepository.getEnvironmentToken(realNode));
+            return mEnvironment;
         }
 
         @Nullable
-        public com.android.extensions.xr.function.Consumer<
-                        com.android.extensions.xr.node.InputEvent>
-                getListener() {
-            return shadowNode.getInputListener();
+        public Consumer<InputEvent> getListener() {
+            return mListener;
         }
 
         @Nullable
         public Consumer<Integer> getPointerCaptureStateCallback() {
-            com.android.extensions.xr.function.Consumer<Integer> callback =
-                    shadowNode.getPointerCaptureStateCallback();
-
-            if (callback == null) {
-                return null;
-            }
-
-            return callback::accept;
+            return mPointerCaptureStateCallback;
         }
 
         @Nullable
         public Executor getExecutor() {
-            return shadowNode.getInputExecutor();
+            return mExecutor;
         }
 
         @Nullable
         public ReformOptions getReformOptions() {
-            com.android.extensions.xr.node.ReformOptions options =
-                    nodeRepository.getReformOptions(realNode);
+            return mReformOptions;
+        }
+    }
 
-            if (options == null) {
-                return null;
-            }
+    /**
+     * A fake implementation of the XR extensions Node transaction.
+     *
+     * <p>All modifications happen immediately and not when the transaction is applied.
+     */
+    @SuppressWarnings("NotCloseable")
+    public static class FakeNodeTransaction implements NodeTransaction {
+        FakeNode mLastFakeNode = null;
+        boolean mApplied = false;
 
-            return NodeTypeConverter.toLibrary(options);
+        private FakeNodeTransaction() {}
+
+        @Override
+        @NonNull
+        public NodeTransaction setParent(@NonNull Node node, @Nullable Node parent) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mParent = (FakeNode) parent;
+            return this;
+        }
+
+        /**
+         * @deprecated This method is no longer supported.
+         */
+        @Override
+        @NonNull
+        @Deprecated
+        public NodeTransaction setEnvironment(
+                @NonNull Node node, @Nullable androidx.xr.extensions.asset.EnvironmentToken token) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mEnvironment = token;
+            return this;
+        }
+
+        @Override
+        @NonNull
+        public NodeTransaction setPosition(@NonNull Node node, float x, float y, float z) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mXPosition = x;
+            ((FakeNode) node).mYPosition = y;
+            ((FakeNode) node).mZPosition = z;
+            return this;
+        }
+
+        @Override
+        @NonNull
+        public NodeTransaction setOrientation(
+                @NonNull Node node, float x, float y, float z, float w) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mXOrientation = x;
+            ((FakeNode) node).mYOrientation = y;
+            ((FakeNode) node).mZOrientation = z;
+            ((FakeNode) node).mWOrientation = w;
+            return this;
+        }
+
+        @Override
+        @NonNull
+        // TODO(b/354731545): Cover this with an AndroidXREntity test
+        public NodeTransaction setScale(@NonNull Node node, float sx, float sy, float sz) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mXScale = sx;
+            ((FakeNode) node).mYScale = sy;
+            ((FakeNode) node).mZScale = sz;
+            return this;
+        }
+
+        @Override
+        @NonNull
+        public NodeTransaction setVisibility(@NonNull Node node, boolean isVisible) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mIsVisible = isVisible;
+            return this;
+        }
+
+        @Override
+        @NonNull
+        public NodeTransaction setAlpha(@NonNull Node node, float value) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mAlpha = value;
+            return this;
+        }
+
+        /**
+         * @deprecated This method is no longer supported.
+         */
+        @Override
+        @NonNull
+        @Deprecated
+        public NodeTransaction setGltfModel(
+                @NonNull Node node,
+                @NonNull androidx.xr.extensions.asset.GltfModelToken gltfModelToken) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mGltfModel = gltfModelToken;
+            return this;
+        }
+
+        @Override
+        @NonNull
+        public NodeTransaction setName(@NonNull Node node, @NonNull String name) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mName = name;
+            return this;
+        }
+
+        @Override
+        @NonNull
+        public NodeTransaction setPassthroughState(
+                @NonNull Node node,
+                float passthroughOpacity,
+                @PassthroughState.Mode int passthroughMode) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mPassthroughOpacity = passthroughOpacity;
+            ((FakeNode) node).mPassthroughMode = passthroughMode;
+            return this;
+        }
+
+        @Override
+        @NonNull
+        public NodeTransaction setSurfacePackage(
+                @Nullable Node node,
+                @NonNull SurfaceControlViewHost.SurfacePackage surfacePackage) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mSurfacePackage = surfacePackage;
+            return this;
+        }
+
+        @Override
+        @NonNull
+        public NodeTransaction setWindowBounds(
+                @NonNull SurfaceControlViewHost.SurfacePackage surfacePackage,
+                int widthPx,
+                int heightPx) {
+            return this;
+        }
+
+        @Override
+        @NonNull
+        public NodeTransaction setAnchorId(@NonNull Node node, @Nullable IBinder anchorId) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mAnchorId = anchorId;
+            return this;
+        }
+
+        @Override
+        @NonNull
+        public NodeTransaction enableReform(@NonNull Node node, @NonNull ReformOptions options) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mReformOptions = options;
+            ((FakeReformOptions) options).mOptionsApplied = true;
+            return this;
+        }
+
+        @Override
+        @NonNull
+        public NodeTransaction setReformSize(@NonNull Node node, @NonNull Vec3 reformSize) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mReformOptions.setCurrentSize(reformSize);
+            return this;
+        }
+
+        @Override
+        @NonNull
+        public NodeTransaction disableReform(@NonNull Node node) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mReformOptions = new FakeReformOptions(null, null);
+            return this;
+        }
+
+        @Override
+        @NonNull
+        public NodeTransaction setCornerRadius(@NonNull Node node, float cornerRadius) {
+            mLastFakeNode = (FakeNode) node;
+            ((FakeNode) node).mCornerRadius = cornerRadius;
+            return this;
+        }
+
+        @Override
+        public void apply() {
+            mApplied = true;
+        }
+
+        @Override
+        public void close() {}
+    }
+
+    /** A fake implementation of the XR extensions NodeTransform. */
+    public static class FakeNodeTransform implements NodeTransform {
+        Mat4f mTransform;
+
+        public FakeNodeTransform(@NonNull Mat4f transform) {
+            mTransform = transform;
+        }
+
+        @Override
+        @NonNull
+        public Mat4f getTransform() {
+            return mTransform;
+        }
+
+        @Override
+        public long getTimestamp() {
+            return 0;
+        }
+    }
+
+    /** A fake implementation of the XR extensions GltfModelToken. */
+    public static class FakeGltfModelToken implements androidx.xr.extensions.asset.GltfModelToken {
+        String mUrl;
+
+        public FakeGltfModelToken(@NonNull String url) {
+            mUrl = url;
+        }
+
+        @NonNull
+        public String getUrl() {
+            return mUrl;
+        }
+    }
+
+    /** A fake implementation of the XR extensions EnvironmentToken. */
+    public static class FakeEnvironmentToken
+            implements androidx.xr.extensions.asset.EnvironmentToken {
+        String mUrl;
+
+        public FakeEnvironmentToken(@NonNull String url) {
+            this.mUrl = url;
+        }
+
+        @NonNull
+        public String getUrl() {
+            return mUrl;
         }
     }
 
@@ -912,6 +1111,396 @@
         }
     }
 
+    /** Fake input event. */
+    public static class FakeInputEvent implements InputEvent {
+        int mSource;
+        int mPointerType;
+        long mTimestamp;
+        Vec3 mOrigin;
+        Vec3 mDirection;
+        FakeHitInfo mHitInfo;
+        FakeHitInfo mSecondaryHitInfo;
+        int mDispatchFlags;
+        int mAction;
+
+        @Override
+        public int getSource() {
+            return mSource;
+        }
+
+        @Override
+        public int getPointerType() {
+            return mPointerType;
+        }
+
+        @Override
+        public long getTimestamp() {
+            return mTimestamp;
+        }
+
+        @Override
+        @NonNull
+        public Vec3 getOrigin() {
+            return mOrigin;
+        }
+
+        @Override
+        @NonNull
+        public Vec3 getDirection() {
+            return mDirection;
+        }
+
+        @Override
+        @Nullable
+        public HitInfo getHitInfo() {
+            return mHitInfo;
+        }
+
+        @Override
+        @Nullable
+        public HitInfo getSecondaryHitInfo() {
+            return mSecondaryHitInfo;
+        }
+
+        @Override
+        public int getDispatchFlags() {
+            return mDispatchFlags;
+        }
+
+        @Override
+        public int getAction() {
+            return mAction;
+        }
+
+        public void setDispatchFlags(int dispatchFlags) {
+            mDispatchFlags = dispatchFlags;
+        }
+
+        public void setOrigin(@NonNull Vec3 origin) {
+            mOrigin = origin;
+        }
+
+        public void setDirection(@NonNull Vec3 direction) {
+            mDirection = direction;
+        }
+
+        public void setFakeHitInfo(@NonNull FakeHitInfo hitInfo) {
+            mHitInfo = hitInfo;
+        }
+
+        public void setTimestamp(long timestamp) {
+            mTimestamp = timestamp;
+        }
+
+        /** Fake hit info. */
+        public static class FakeHitInfo implements InputEvent.HitInfo {
+            int mSubspaceImpressNodeId;
+            Node mInputNode;
+            Vec3 mHitPosition;
+            Mat4f mTransform;
+
+            @Override
+            public int getSubspaceImpressNodeId() {
+                return mSubspaceImpressNodeId;
+            }
+
+            @Override
+            @NonNull
+            public Node getInputNode() {
+                return mInputNode;
+            }
+
+            @Override
+            @Nullable
+            public Vec3 getHitPosition() {
+                return mHitPosition;
+            }
+
+            @Override
+            @NonNull
+            public Mat4f getTransform() {
+                return mTransform;
+            }
+
+            public void setSubspaceImpressNodeId(int subspaceImpressNodeId) {
+                mSubspaceImpressNodeId = subspaceImpressNodeId;
+            }
+
+            public void setInputNode(@NonNull Node inputNode) {
+                mInputNode = inputNode;
+            }
+
+            public void setHitPosition(@Nullable Vec3 hitPosition) {
+                mHitPosition = hitPosition;
+            }
+
+            public void setTransform(@NonNull Mat4f transform) {
+                mTransform = transform;
+            }
+        }
+    }
+
+    /** Fake ReformOptions. */
+    public static class FakeReformOptions implements ReformOptions {
+
+        int mEnabledReforms;
+        int mReformFlags;
+        int mScaleWithDistanceMode = SCALE_WITH_DISTANCE_MODE_DEFAULT;
+        Vec3 mCurrentSize;
+        Vec3 mMinimumSize;
+        Vec3 mMaximumSize;
+        float mFixedAspectRatio;
+        boolean mForceShowResizeOverlay;
+        Consumer<ReformEvent> mConsumer;
+        Executor mExecutor;
+
+        boolean mOptionsApplied = true;
+
+        FakeReformOptions(Consumer<ReformEvent> consumer, Executor executor) {
+            this.mConsumer = consumer;
+            this.mExecutor = executor;
+        }
+
+        @Override
+        public int getEnabledReform() {
+            return mEnabledReforms;
+        }
+
+        @Override
+        @NonNull
+        public ReformOptions setEnabledReform(int i) {
+            mEnabledReforms = i;
+            return this;
+        }
+
+        @Override
+        public int getFlags() {
+            return mReformFlags;
+        }
+
+        @Override
+        @NonNull
+        public ReformOptions setFlags(int i) {
+            mOptionsApplied = false;
+            mReformFlags = i;
+            return this;
+        }
+
+        @NonNull
+        @Override
+        public Vec3 getCurrentSize() {
+            return mCurrentSize;
+        }
+
+        @Override
+        @NonNull
+        public ReformOptions setCurrentSize(@NonNull Vec3 vec3) {
+            mOptionsApplied = false;
+            mCurrentSize = vec3;
+            return this;
+        }
+
+        @NonNull
+        @Override
+        public Vec3 getMinimumSize() {
+            return mMinimumSize;
+        }
+
+        @Override
+        @NonNull
+        public ReformOptions setMinimumSize(@NonNull Vec3 vec3) {
+            mOptionsApplied = false;
+            mMinimumSize = vec3;
+            return this;
+        }
+
+        @NonNull
+        @Override
+        public Vec3 getMaximumSize() {
+            return mMaximumSize;
+        }
+
+        @Override
+        @NonNull
+        public ReformOptions setMaximumSize(@NonNull Vec3 vec3) {
+            mOptionsApplied = false;
+            mMaximumSize = vec3;
+            return this;
+        }
+
+        @Override
+        public float getFixedAspectRatio() {
+            return mFixedAspectRatio;
+        }
+
+        @Override
+        @NonNull
+        public ReformOptions setFixedAspectRatio(float fixedAspectRatio) {
+            mFixedAspectRatio = fixedAspectRatio;
+            return this;
+        }
+
+        @Override
+        @SuppressWarnings("GetterSetterNames")
+        public boolean getForceShowResizeOverlay() {
+            return mForceShowResizeOverlay;
+        }
+
+        @Override
+        @NonNull
+        public ReformOptions setForceShowResizeOverlay(boolean show) {
+            mForceShowResizeOverlay = show;
+            return this;
+        }
+
+        @NonNull
+        @Override
+        public Consumer<ReformEvent> getEventCallback() {
+            return mConsumer;
+        }
+
+        @Override
+        @NonNull
+        @SuppressLint("InvalidNullabilityOverride")
+        public ReformOptions setEventCallback(@NonNull Consumer<ReformEvent> consumer) {
+            mConsumer = consumer;
+            return this;
+        }
+
+        @NonNull
+        @Override
+        public Executor getEventExecutor() {
+            return mExecutor;
+        }
+
+        @Override
+        @NonNull
+        public ReformOptions setEventExecutor(@NonNull Executor executor) {
+            mExecutor = executor;
+            return this;
+        }
+
+        @Override
+        public int getScaleWithDistanceMode() {
+            return mScaleWithDistanceMode;
+        }
+
+        @Override
+        @NonNull
+        public ReformOptions setScaleWithDistanceMode(int scaleWithDistanceMode) {
+            mScaleWithDistanceMode = scaleWithDistanceMode;
+            return this;
+        }
+    }
+
+    /** Fake ReformEvent. */
+    public static class FakeReformEvent implements ReformEvent {
+
+        int mType;
+        int mState;
+        int mId;
+        Vec3 mOrigin = new Vec3(0f, 0f, 0f);
+        Vec3 mInitialRayOrigin = mOrigin;
+        Vec3 mProposedPosition = mOrigin;
+        Vec3 mOnes = new Vec3(1f, 1f, 1f);
+        Vec3 mInitialRayDirection = mOnes;
+        Vec3 mProposedScale = mOnes;
+        Vec3 mProposedSize = mOnes;
+        Vec3 mTwos = new Vec3(2f, 2f, 2f);
+        Vec3 mCurrentRayOrigin = mTwos;
+        Vec3 mThrees = new Vec3(3f, 3f, 3f);
+        Vec3 mCurrentRayDirection = mThrees;
+        Quatf mIdentity = new Quatf(0f, 0f, 0f, 1f);
+        Quatf mProposedOrientation = mIdentity;
+
+        public void setType(int type) {
+            mType = type;
+        }
+
+        public void setState(int state) {
+            mState = state;
+        }
+
+        public void setProposedPosition(@NonNull Vec3 proposedPosition) {
+            mProposedPosition = proposedPosition;
+        }
+
+        public void setProposedScale(@NonNull Vec3 proposedScale) {
+            mProposedScale = proposedScale;
+        }
+
+        public void setProposedOrientation(@NonNull Quatf proposedOrientation) {
+            mProposedOrientation = proposedOrientation;
+        }
+
+        public void setProposedSize(@NonNull Vec3 proposedSize) {
+            mProposedSize = proposedSize;
+        }
+
+        @Override
+        public int getType() {
+            return mType;
+        }
+
+        @Override
+        public int getState() {
+            return mState;
+        }
+
+        @Override
+        public int getId() {
+            return mId;
+        }
+
+        @NonNull
+        @Override
+        public Vec3 getInitialRayOrigin() {
+            return mInitialRayOrigin;
+        }
+
+        @NonNull
+        @Override
+        public Vec3 getInitialRayDirection() {
+            return mInitialRayDirection;
+        }
+
+        @NonNull
+        @Override
+        public Vec3 getCurrentRayOrigin() {
+            return mCurrentRayOrigin;
+        }
+
+        @NonNull
+        @Override
+        public Vec3 getCurrentRayDirection() {
+            return mCurrentRayDirection;
+        }
+
+        @NonNull
+        @Override
+        public Vec3 getProposedPosition() {
+            return mProposedPosition;
+        }
+
+        @NonNull
+        @Override
+        public Quatf getProposedOrientation() {
+            return mProposedOrientation;
+        }
+
+        @NonNull
+        @Override
+        public Vec3 getProposedScale() {
+            return mProposedScale;
+        }
+
+        @NonNull
+        @Override
+        public Vec3 getProposedSize() {
+            return mProposedSize;
+        }
+    }
+
     /** A fake implementation of the XR extensions SpatialState. */
     public static class FakeSpatialState implements SpatialState {
         Bounds mBounds;
diff --git a/xr/scenecore/scenecore/api/restricted_current.txt b/xr/scenecore/scenecore/api/restricted_current.txt
index efe659b..68c19fe 100644
--- a/xr/scenecore/scenecore/api/restricted_current.txt
+++ b/xr/scenecore/scenecore/api/restricted_current.txt
@@ -618,44 +618,42 @@
     method public androidx.xr.scenecore.AnchorPlacement createForPlanes(optional java.util.Set<java.lang.Integer> planeTypeFilter, optional java.util.Set<java.lang.Integer> planeSemanticFilter);
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class BaseActivityPose<RtActivityPoseType extends androidx.xr.scenecore.JxrPlatformAdapter.ActivityPose> implements androidx.xr.scenecore.ActivityPose {
-    ctor public BaseActivityPose(RtActivityPoseType rtActivityPose);
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract sealed class BaseActivityPose<RtActivityPoseType extends androidx.xr.scenecore.JxrPlatformAdapter.ActivityPose> implements androidx.xr.scenecore.ActivityPose {
     method public androidx.xr.runtime.math.Pose getActivitySpacePose();
     method public androidx.xr.runtime.math.Pose transformPoseTo(androidx.xr.runtime.math.Pose pose, androidx.xr.scenecore.ActivityPose destination);
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class BaseEntity<RtEntityType extends androidx.xr.scenecore.JxrPlatformAdapter.Entity> extends androidx.xr.scenecore.BaseActivityPose<androidx.xr.scenecore.JxrPlatformAdapter.ActivityPose> implements androidx.xr.scenecore.Entity {
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract sealed class BaseEntity<RtEntityType extends androidx.xr.scenecore.JxrPlatformAdapter.Entity> extends androidx.xr.scenecore.BaseActivityPose<androidx.xr.scenecore.JxrPlatformAdapter.ActivityPose> implements androidx.xr.scenecore.Entity {
     method public void addChild(androidx.xr.scenecore.Entity child);
     method public boolean addComponent(androidx.xr.scenecore.Component component);
     method public void dispose();
-    method public float getAlpha(int relativeTo);
+    method public float getActivitySpaceAlpha();
+    method public float getAlpha();
     method public java.util.List<androidx.xr.scenecore.Component> getComponents();
     method public <T extends androidx.xr.scenecore.Component> java.util.List<T> getComponentsOfType(Class<? extends T> type);
     method public androidx.xr.scenecore.Entity? getParent();
-    method public androidx.xr.runtime.math.Pose getPose(int relativeTo);
-    method public float getScale(int relativeTo);
-    method @Deprecated public float getWorldSpaceScale();
+    method public androidx.xr.runtime.math.Pose getPose();
+    method public float getScale();
+    method public androidx.xr.scenecore.Dimensions getSize();
+    method public float getWorldSpaceScale();
     method public boolean isHidden(boolean includeParents);
     method public void removeAllComponents();
     method public void removeComponent(androidx.xr.scenecore.Component component);
-    method public void setAlpha(float alpha, int relativeTo);
+    method public void setAlpha(float alpha);
     method public void setContentDescription(String text);
     method public void setHidden(boolean hidden);
     method public void setParent(androidx.xr.scenecore.Entity? parent);
-    method public void setPose(androidx.xr.runtime.math.Pose pose, int relativeTo);
-    method public void setScale(float scale, int relativeTo);
+    method public void setPose(androidx.xr.runtime.math.Pose pose);
+    method public void setScale(float scale);
+    method public void setSize(androidx.xr.scenecore.Dimensions dimensions);
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract sealed class BasePanelEntity<RtPanelEntityType extends androidx.xr.scenecore.JxrPlatformAdapter.PanelEntity> extends androidx.xr.scenecore.BaseEntity<androidx.xr.scenecore.JxrPlatformAdapter.PanelEntity> {
     method public final float getCornerRadius();
-    method @Deprecated public final androidx.xr.runtime.math.Vector3 getPixelDensity();
-    method @Deprecated public final androidx.xr.scenecore.PixelDimensions getPixelDimensions();
-    method public final androidx.xr.scenecore.Dimensions getSize();
-    method public final androidx.xr.scenecore.PixelDimensions getSizeInPixels();
+    method public final androidx.xr.runtime.math.Vector3 getPixelDensity();
+    method public final androidx.xr.scenecore.PixelDimensions getPixelDimensions();
     method public final void setCornerRadius(float radius);
-    method @Deprecated public final void setPixelDimensions(androidx.xr.scenecore.PixelDimensions pxDimensions);
-    method public final void setSize(androidx.xr.scenecore.Dimensions dimensions);
-    method public final void setSizeInPixels(androidx.xr.scenecore.PixelDimensions pixelDimensions);
+    method public final void setPixelDimensions(androidx.xr.scenecore.PixelDimensions pxDimensions);
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class CameraView extends androidx.xr.scenecore.BaseActivityPose<androidx.xr.scenecore.JxrPlatformAdapter.CameraViewActivityPose> {
@@ -715,42 +713,36 @@
     method public void addChild(androidx.xr.scenecore.Entity child);
     method public boolean addComponent(androidx.xr.scenecore.Component component);
     method public void dispose();
-    method public default float getAlpha();
-    method public float getAlpha(optional int relativeTo);
+    method public float getActivitySpaceAlpha();
+    method public float getAlpha();
     method public java.util.List<androidx.xr.scenecore.Component> getComponents();
     method public <T extends androidx.xr.scenecore.Component> java.util.List<T> getComponentsOfType(Class<? extends T> type);
     method public androidx.xr.scenecore.Entity? getParent();
-    method public default androidx.xr.runtime.math.Pose getPose();
-    method public androidx.xr.runtime.math.Pose getPose(optional int relativeTo);
-    method public default float getScale();
-    method public float getScale(optional int relativeTo);
-    method @Deprecated public float getWorldSpaceScale();
+    method public androidx.xr.runtime.math.Pose getPose();
+    method public float getScale();
+    method public androidx.xr.scenecore.Dimensions getSize();
+    method public float getWorldSpaceScale();
     method public boolean isHidden(optional boolean includeParents);
     method public void removeAllComponents();
     method public void removeComponent(androidx.xr.scenecore.Component component);
-    method public default void setAlpha(float alpha);
-    method public void setAlpha(float alpha, optional int relativeTo);
+    method public void setAlpha(float alpha);
     method public void setContentDescription(String text);
     method public void setHidden(boolean hidden);
     method public void setParent(androidx.xr.scenecore.Entity? parent);
-    method public default void setPose(androidx.xr.runtime.math.Pose pose);
-    method public void setPose(androidx.xr.runtime.math.Pose pose, optional int relativeTo);
-    method public default void setScale(float scale);
-    method public void setScale(float scale, optional int relativeTo);
+    method public void setPose(androidx.xr.runtime.math.Pose pose);
+    method public void setScale(float scale);
+    method public void setSize(androidx.xr.scenecore.Dimensions dimensions);
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ExrImage implements androidx.xr.scenecore.Image {
     method public static androidx.xr.scenecore.ExrImage create(androidx.xr.scenecore.Session session, String name);
-    method @MainThread public static com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.ExrImage> createFromPackage(androidx.xr.scenecore.Session session, byte[] assetData, String assetKey);
-    method @MainThread public static com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.ExrImage> createFromPackage(androidx.xr.scenecore.Session session, String name);
-    method @MainThread public androidx.xr.scenecore.CubeMapTexture getReflectionTexture();
+    method public androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource getImage();
+    property public androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource image;
     field public static final androidx.xr.scenecore.ExrImage.Companion Companion;
   }
 
   public static final class ExrImage.Companion {
     method public androidx.xr.scenecore.ExrImage create(androidx.xr.scenecore.Session session, String name);
-    method @MainThread public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.ExrImage> createFromPackage(androidx.xr.scenecore.Session session, byte[] assetData, String assetKey);
-    method @MainThread public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.ExrImage> createFromPackage(androidx.xr.scenecore.Session session, String name);
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Fov {
@@ -771,13 +763,13 @@
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class GltfModel implements androidx.xr.scenecore.Model {
-    method @MainThread public static com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.GltfModel> create(androidx.xr.scenecore.Session session, byte[] assetData, String assetKey);
     method @MainThread public static com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.GltfModel> create(androidx.xr.scenecore.Session session, String name);
+    method public androidx.xr.scenecore.JxrPlatformAdapter.GltfModelResource getModel();
+    property public androidx.xr.scenecore.JxrPlatformAdapter.GltfModelResource model;
     field public static final androidx.xr.scenecore.GltfModel.Companion Companion;
   }
 
   public static final class GltfModel.Companion {
-    method @MainThread public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.GltfModel> create(androidx.xr.scenecore.Session session, byte[] assetData, String assetKey);
     method @MainThread public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.GltfModel> create(androidx.xr.scenecore.Session session, String name);
   }
 
@@ -785,7 +777,7 @@
     method @MainThread public static androidx.xr.scenecore.GltfModelEntity create(androidx.xr.scenecore.Session session, androidx.xr.scenecore.GltfModel model);
     method @MainThread public static androidx.xr.scenecore.GltfModelEntity create(androidx.xr.scenecore.Session session, androidx.xr.scenecore.GltfModel model, optional androidx.xr.runtime.math.Pose pose);
     method public int getAnimationState();
-    method @MainThread public void setMaterialOverride(androidx.xr.scenecore.Material material, String meshName);
+    method @MainThread public void setMaterialOverride(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource material, String meshName);
     method @MainThread public void startAnimation(boolean loop);
     method @MainThread public void startAnimation(boolean loop, optional String? animationName);
     method @MainThread public void stopAnimation();
@@ -904,8 +896,7 @@
     method public androidx.xr.scenecore.JxrPlatformAdapter.InteractableComponent createInteractableComponent(java.util.concurrent.Executor, androidx.xr.scenecore.JxrPlatformAdapter.InputEventListener);
     method public androidx.xr.scenecore.JxrPlatformAdapter.LoggingEntity createLoggingEntity(androidx.xr.runtime.math.Pose);
     method public androidx.xr.scenecore.JxrPlatformAdapter.MovableComponent createMovableComponent(boolean, boolean, java.util.Set<androidx.xr.scenecore.JxrPlatformAdapter.AnchorPlacement!>, boolean);
-    method public androidx.xr.scenecore.JxrPlatformAdapter.PanelEntity createPanelEntity(android.content.Context, androidx.xr.runtime.math.Pose, android.view.View, androidx.xr.scenecore.JxrPlatformAdapter.Dimensions, String, androidx.xr.scenecore.JxrPlatformAdapter.Entity);
-    method public androidx.xr.scenecore.JxrPlatformAdapter.PanelEntity createPanelEntity(android.content.Context, androidx.xr.runtime.math.Pose, android.view.View, androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions, String, androidx.xr.scenecore.JxrPlatformAdapter.Entity);
+    method public androidx.xr.scenecore.JxrPlatformAdapter.PanelEntity createPanelEntity(androidx.xr.runtime.math.Pose, android.view.View, androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions, androidx.xr.scenecore.JxrPlatformAdapter.Dimensions, String, android.content.Context, androidx.xr.scenecore.JxrPlatformAdapter.Entity);
     method public androidx.xr.scenecore.JxrPlatformAdapter.AnchorEntity createPersistedAnchorEntity(java.util.UUID, java.time.Duration);
     method public androidx.xr.scenecore.JxrPlatformAdapter.PointerCaptureComponent createPointerCaptureComponent(java.util.concurrent.Executor, androidx.xr.scenecore.JxrPlatformAdapter.PointerCaptureComponent.StateListener, androidx.xr.scenecore.JxrPlatformAdapter.InputEventListener);
     method public androidx.xr.scenecore.JxrPlatformAdapter.ResizableComponent createResizableComponent(androidx.xr.scenecore.JxrPlatformAdapter.Dimensions, androidx.xr.scenecore.JxrPlatformAdapter.Dimensions);
@@ -922,29 +913,24 @@
     method public androidx.xr.scenecore.JxrPlatformAdapter.PanelEntity getMainPanelEntity();
     method public androidx.xr.scenecore.JxrPlatformAdapter.MediaPlayerExtensionsWrapper getMediaPlayerExtensionsWrapper();
     method public androidx.xr.scenecore.JxrPlatformAdapter.PerceptionSpaceActivityPose getPerceptionSpaceActivityPose();
-    method public androidx.xr.scenecore.JxrPlatformAdapter.TextureResource? getReflectionTextureFromIbl(androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource);
     method public androidx.xr.scenecore.JxrPlatformAdapter.SoundPoolExtensionsWrapper getSoundPoolExtensionsWrapper();
     method public androidx.xr.scenecore.JxrPlatformAdapter.SpatialCapabilities getSpatialCapabilities();
     method public androidx.xr.scenecore.JxrPlatformAdapter.SpatialEnvironment getSpatialEnvironment();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource!>? loadExrImageByAssetName(String);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource!>? loadExrImageByAssetNameSplitEngine(String);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource!>? loadExrImageByByteArraySplitEngine(byte[], String);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.JxrPlatformAdapter.GltfModelResource!>? loadGltfByAssetName(String);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.JxrPlatformAdapter.GltfModelResource!>? loadGltfByAssetNameSplitEngine(String);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.JxrPlatformAdapter.GltfModelResource!>? loadGltfByByteArray(byte[], String);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.JxrPlatformAdapter.TextureResource!>? loadTexture(String, androidx.xr.scenecore.JxrPlatformAdapter.TextureSampler);
     method public void removeSpatialCapabilitiesChangedListener(java.util.function.Consumer<androidx.xr.scenecore.JxrPlatformAdapter.SpatialCapabilities!>);
     method public void requestFullSpaceMode();
     method public void requestHomeSpaceMode();
-    method public void setAlphaMap(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, androidx.xr.scenecore.JxrPlatformAdapter.TextureResource);
     method public void setAlphaStepMultiplier(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, float);
+    method public void setAlphaStepU(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, androidx.xr.runtime.math.Vector4);
+    method public void setAlphaStepV(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, androidx.xr.runtime.math.Vector4);
     method public android.os.Bundle setFullSpaceMode(android.os.Bundle);
     method public android.os.Bundle setFullSpaceModeWithEnvironmentInherited(android.os.Bundle);
-    method public void setNormalBoundary(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, float);
     method public void setNormalMap(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, androidx.xr.scenecore.JxrPlatformAdapter.TextureResource);
     method public void setNormalSpeed(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, float);
     method public void setNormalTiling(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, float);
-    method public void setNormalZ(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, float);
     method public void setPreferredAspectRatio(android.app.Activity, float);
     method public void setReflectionCube(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, androidx.xr.scenecore.JxrPlatformAdapter.TextureResource);
     method public void startRenderer();
@@ -1050,27 +1036,23 @@
     method public boolean addComponent(androidx.xr.scenecore.JxrPlatformAdapter.Component);
     method public void addInputEventListener(java.util.concurrent.Executor, androidx.xr.scenecore.JxrPlatformAdapter.InputEventListener);
     method public void dispose();
-    method public default float getAlpha();
-    method public float getAlpha(int);
+    method public float getActivitySpaceAlpha();
+    method public float getAlpha();
     method public java.util.List<androidx.xr.scenecore.JxrPlatformAdapter.Entity!> getChildren();
     method public androidx.xr.scenecore.JxrPlatformAdapter.Entity? getParent();
-    method public default androidx.xr.runtime.math.Pose getPose();
-    method public androidx.xr.runtime.math.Pose getPose(int);
-    method public default androidx.xr.runtime.math.Vector3 getScale();
-    method public androidx.xr.runtime.math.Vector3 getScale(int);
+    method public androidx.xr.runtime.math.Pose getPose();
+    method public androidx.xr.runtime.math.Vector3 getScale();
     method public boolean isHidden(boolean);
     method public void removeAllComponents();
     method public void removeComponent(androidx.xr.scenecore.JxrPlatformAdapter.Component);
     method public void removeInputEventListener(androidx.xr.scenecore.JxrPlatformAdapter.InputEventListener);
-    method public default void setAlpha(float);
-    method public void setAlpha(float, int);
+    method public void setAlpha(float);
     method public void setContentDescription(String);
     method public void setHidden(boolean);
     method public void setParent(androidx.xr.scenecore.JxrPlatformAdapter.Entity?);
-    method public default void setPose(androidx.xr.runtime.math.Pose);
-    method public void setPose(androidx.xr.runtime.math.Pose, int);
-    method public default void setScale(androidx.xr.runtime.math.Vector3);
-    method public void setScale(androidx.xr.runtime.math.Vector3, int);
+    method public void setPose(androidx.xr.runtime.math.Pose);
+    method public void setScale(androidx.xr.runtime.math.Vector3);
+    method public void setSize(androidx.xr.scenecore.JxrPlatformAdapter.Dimensions);
   }
 
   public static interface JxrPlatformAdapter.ExrImageResource extends androidx.xr.scenecore.JxrPlatformAdapter.Resource {
@@ -1173,12 +1155,11 @@
 
   public static interface JxrPlatformAdapter.PanelEntity extends androidx.xr.scenecore.JxrPlatformAdapter.Entity {
     method public float getCornerRadius();
-    method @Deprecated public androidx.xr.runtime.math.Vector3 getPixelDensity();
+    method public androidx.xr.runtime.math.Vector3 getPixelDensity();
+    method public androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions getPixelDimensions();
     method public androidx.xr.scenecore.JxrPlatformAdapter.Dimensions getSize();
-    method public androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions getSizeInPixels();
     method public void setCornerRadius(float);
-    method public void setSize(androidx.xr.scenecore.JxrPlatformAdapter.Dimensions);
-    method public void setSizeInPixels(androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions);
+    method public void setPixelDimensions(androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions);
   }
 
   public static interface JxrPlatformAdapter.PerceptionSpaceActivityPose extends androidx.xr.scenecore.JxrPlatformAdapter.ActivityPose {
@@ -1265,12 +1246,6 @@
     method public int play(android.media.SoundPool, int, androidx.xr.scenecore.JxrPlatformAdapter.SoundFieldAttributes, float, int, int, float);
   }
 
-  public static class JxrPlatformAdapter.Space {
-    field public static final int ACTIVITY = 1; // 0x1
-    field public static final int PARENT = 0; // 0x0
-    field public static final int REAL_WORLD = 2; // 0x2
-  }
-
   public static class JxrPlatformAdapter.SpatialCapabilities {
     ctor public JxrPlatformAdapter.SpatialCapabilities(int);
     method public boolean hasCapability(int);
@@ -1308,11 +1283,7 @@
 
   public static class JxrPlatformAdapter.SpatialEnvironment.SpatialEnvironmentPreference {
     ctor public JxrPlatformAdapter.SpatialEnvironment.SpatialEnvironmentPreference(androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource?, androidx.xr.scenecore.JxrPlatformAdapter.GltfModelResource?);
-    ctor public JxrPlatformAdapter.SpatialEnvironment.SpatialEnvironmentPreference(androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource?, androidx.xr.scenecore.JxrPlatformAdapter.GltfModelResource?, androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource?, String?, String?);
     field public final androidx.xr.scenecore.JxrPlatformAdapter.GltfModelResource? geometry;
-    field public final String? geometryAnimationName;
-    field public final androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource? geometryMaterial;
-    field public final String? geometryMeshName;
     field public final androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource? skybox;
   }
 
@@ -1408,10 +1379,6 @@
     field public int wrapModeT;
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class Material {
-    ctor public Material(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource? material);
-  }
-
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface Model {
   }
 
@@ -1459,24 +1426,16 @@
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class PanelEntity extends androidx.xr.scenecore.BasePanelEntity<androidx.xr.scenecore.JxrPlatformAdapter.PanelEntity> {
-    method @Deprecated public static final androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.Dimensions surfaceDimensionsPx, androidx.xr.scenecore.Dimensions dimensions, String name);
-    method @Deprecated public static final androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.Dimensions surfaceDimensionsPx, androidx.xr.scenecore.Dimensions dimensions, String name, optional androidx.xr.runtime.math.Pose pose);
-    method public static final androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.Dimensions dimensions, String name);
-    method public static final androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.Dimensions dimensions, String name, optional androidx.xr.runtime.math.Pose pose);
-    method public static final androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.PixelDimensions pixelDimensions, String name);
-    method public static final androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.PixelDimensions pixelDimensions, String name, optional androidx.xr.runtime.math.Pose pose);
+    method public static final androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.Dimensions surfaceDimensionsPx, androidx.xr.scenecore.Dimensions dimensions, String name);
+    method public static final androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.Dimensions surfaceDimensionsPx, androidx.xr.scenecore.Dimensions dimensions, String name, optional androidx.xr.runtime.math.Pose pose);
     method public final boolean isMainPanelEntity();
     property public final boolean isMainPanelEntity;
     field public static final androidx.xr.scenecore.PanelEntity.Companion Companion;
   }
 
   public static final class PanelEntity.Companion {
-    method @Deprecated public androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.Dimensions surfaceDimensionsPx, androidx.xr.scenecore.Dimensions dimensions, String name);
-    method @Deprecated public androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.Dimensions surfaceDimensionsPx, androidx.xr.scenecore.Dimensions dimensions, String name, optional androidx.xr.runtime.math.Pose pose);
-    method public androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.Dimensions dimensions, String name);
-    method public androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.Dimensions dimensions, String name, optional androidx.xr.runtime.math.Pose pose);
-    method public androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.PixelDimensions pixelDimensions, String name);
-    method public androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.PixelDimensions pixelDimensions, String name, optional androidx.xr.runtime.math.Pose pose);
+    method public androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.Dimensions surfaceDimensionsPx, androidx.xr.scenecore.Dimensions dimensions, String name);
+    method public androidx.xr.scenecore.PanelEntity create(androidx.xr.scenecore.Session session, android.view.View view, androidx.xr.scenecore.Dimensions surfaceDimensionsPx, androidx.xr.scenecore.Dimensions dimensions, String name, optional androidx.xr.runtime.math.Pose pose);
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class PerceptionSpace extends androidx.xr.scenecore.BaseActivityPose<androidx.xr.scenecore.JxrPlatformAdapter.PerceptionSpaceActivityPose> {
@@ -1648,16 +1607,6 @@
     field public static final String TAG = "SoundFieldAttributes";
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Space {
-    property public static int ACTIVITY;
-    property public static int PARENT;
-    property public static int REAL_WORLD;
-    field public static final int ACTIVITY = 1; // 0x1
-    field public static final androidx.xr.scenecore.Space INSTANCE;
-    field public static final int PARENT = 0; // 0x0
-    field public static final int REAL_WORLD = 2; // 0x2
-  }
-
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class SpatialAudioTrack {
     ctor public SpatialAudioTrack();
     method public static androidx.xr.scenecore.PointSourceAttributes? getPointSourceAttributes(androidx.xr.scenecore.Session session, android.media.AudioTrack track);
@@ -1765,9 +1714,6 @@
 
   public static final class SpatialEnvironment.SpatialEnvironmentPreference {
     ctor public SpatialEnvironment.SpatialEnvironmentPreference(androidx.xr.scenecore.ExrImage? skybox, androidx.xr.scenecore.GltfModel? geometry);
-    ctor public SpatialEnvironment.SpatialEnvironmentPreference(androidx.xr.scenecore.ExrImage? skybox, androidx.xr.scenecore.GltfModel? geometry, optional androidx.xr.scenecore.Material? geometryMaterial);
-    ctor public SpatialEnvironment.SpatialEnvironmentPreference(androidx.xr.scenecore.ExrImage? skybox, androidx.xr.scenecore.GltfModel? geometry, optional androidx.xr.scenecore.Material? geometryMaterial, optional String? geometryMeshName);
-    ctor public SpatialEnvironment.SpatialEnvironmentPreference(androidx.xr.scenecore.ExrImage? skybox, androidx.xr.scenecore.GltfModel? geometry, optional androidx.xr.scenecore.Material? geometryMaterial, optional String? geometryMeshName, optional String? geometryAnimationName);
     method public androidx.xr.scenecore.GltfModel? getGeometry();
     method public androidx.xr.scenecore.ExrImage? getSkybox();
     property public androidx.xr.scenecore.GltfModel? geometry;
@@ -1887,14 +1833,10 @@
 
   public static final class SurfaceEntity.StereoMode {
     property public static int MONO;
-    property public static int MULTIVIEW_LEFT_PRIMARY;
-    property public static int MULTIVIEW_RIGHT_PRIMARY;
     property public static int SIDE_BY_SIDE;
     property public static int TOP_BOTTOM;
     field public static final androidx.xr.scenecore.SurfaceEntity.StereoMode INSTANCE;
     field public static final int MONO = 0; // 0x0
-    field public static final int MULTIVIEW_LEFT_PRIMARY = 4; // 0x4
-    field public static final int MULTIVIEW_RIGHT_PRIMARY = 5; // 0x5
     field public static final int SIDE_BY_SIDE = 2; // 0x2
     field public static final int TOP_BOTTOM = 1; // 0x1
   }
@@ -1902,6 +1844,12 @@
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class Texture {
     method @MainThread public static final com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.Texture> create(androidx.xr.scenecore.Session session, String name, androidx.xr.scenecore.TextureSampler sampler);
     method @MainThread public void dispose();
+    method public final androidx.xr.scenecore.TextureSampler getSampler();
+    method public final java.lang.ref.WeakReference<androidx.xr.scenecore.Session> getSession();
+    method public final androidx.xr.scenecore.JxrPlatformAdapter.TextureResource getTexture();
+    property public final androidx.xr.scenecore.TextureSampler sampler;
+    property public final java.lang.ref.WeakReference<androidx.xr.scenecore.Session> session;
+    property public final androidx.xr.scenecore.JxrPlatformAdapter.TextureResource texture;
     field public static final androidx.xr.scenecore.Texture.Companion Companion;
   }
 
@@ -2012,22 +1960,25 @@
     field public static final int REPEAT = 1; // 0x1
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class WaterMaterial extends androidx.xr.scenecore.Material {
-    method @MainThread public static com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.WaterMaterial> create(androidx.xr.scenecore.Session session, boolean isAlphaMapVersion);
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class WaterMaterial {
+    method @MainThread public static com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.WaterMaterial> create(androidx.xr.scenecore.Session session, boolean transparent);
     method @MainThread public void dispose();
-    method @MainThread public void setAlphaMap(androidx.xr.scenecore.Texture alphaMap);
+    method public androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource getMaterial();
+    method public androidx.xr.scenecore.Session getSession();
     method @MainThread public void setAlphaStepMultiplier(float alphaStepMultiplier);
-    method @MainThread public void setNormalBoundary(float normalBoundary);
+    method @MainThread public void setAlphaStepU(androidx.xr.runtime.math.Vector4 alphaStepU);
+    method @MainThread public void setAlphaStepV(androidx.xr.runtime.math.Vector4 alphaStepV);
     method @MainThread public void setNormalMap(androidx.xr.scenecore.Texture normalMap);
     method @MainThread public void setNormalSpeed(float normalSpeed);
     method @MainThread public void setNormalTiling(float normalTiling);
-    method @MainThread public void setNormalZ(float normalZ);
     method @MainThread public void setReflectionCube(androidx.xr.scenecore.CubeMapTexture reflectionCube);
+    property public androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource material;
+    property public androidx.xr.scenecore.Session session;
     field public static final androidx.xr.scenecore.WaterMaterial.Companion Companion;
   }
 
   public static final class WaterMaterial.Companion {
-    method @MainThread public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.WaterMaterial> create(androidx.xr.scenecore.Session session, boolean isAlphaMapVersion);
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.WaterMaterial> create(androidx.xr.scenecore.Session session, boolean transparent);
   }
 
 }
@@ -2050,21 +2001,22 @@
     method public void addChildren(java.util.List<androidx.xr.scenecore.JxrPlatformAdapter.Entity!>);
     method public boolean addComponent(androidx.xr.scenecore.JxrPlatformAdapter.Component);
     method public void dispose();
-    method public float getAlpha(int);
+    method public float getActivitySpaceAlpha();
+    method public float getAlpha();
     method public java.util.List<androidx.xr.scenecore.JxrPlatformAdapter.Entity!> getChildren();
     method public androidx.xr.scenecore.JxrPlatformAdapter.Entity? getParent();
-    method public androidx.xr.runtime.math.Pose getPose(int);
-    method public androidx.xr.runtime.math.Vector3 getScale(int);
+    method public androidx.xr.runtime.math.Pose getPose();
+    method public androidx.xr.runtime.math.Vector3 getScale();
     method public boolean isHidden(boolean);
     method public void removeAllComponents();
     method protected void removeChildInternal(androidx.xr.scenecore.JxrPlatformAdapter.Entity);
     method public void removeComponent(androidx.xr.scenecore.JxrPlatformAdapter.Component);
-    method public void setAlpha(float, int);
+    method public void setAlpha(float);
     method public void setContentDescription(String);
     method public void setHidden(boolean);
     method public void setParent(androidx.xr.scenecore.JxrPlatformAdapter.Entity?);
-    method public void setPose(androidx.xr.runtime.math.Pose, int);
-    method public void setScale(androidx.xr.runtime.math.Vector3, int);
+    method public void setPose(androidx.xr.runtime.math.Pose);
+    method public void setScale(androidx.xr.runtime.math.Vector3);
     method protected final void setScaleInternal(androidx.xr.runtime.math.Vector3);
   }
 
@@ -2076,10 +2028,9 @@
     method public void addSpatialCapabilitiesChangedListener(java.util.concurrent.Executor, java.util.function.Consumer<androidx.xr.scenecore.JxrPlatformAdapter.SpatialCapabilities!>);
     method public androidx.xr.scenecore.JxrPlatformAdapter.TextureResource? borrowReflectionTexture();
     method public static androidx.xr.scenecore.impl.JxrPlatformAdapterAxr create(android.app.Activity, java.util.concurrent.ScheduledExecutorService);
-    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.xr.scenecore.impl.JxrPlatformAdapterAxr create(android.app.Activity, java.util.concurrent.ScheduledExecutorService, androidx.xr.extensions.node.Node, androidx.xr.extensions.node.Node);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.xr.scenecore.impl.JxrPlatformAdapterAxr create(android.app.Activity, java.util.concurrent.ScheduledExecutorService, androidx.xr.extensions.node.Node, androidx.xr.extensions.node.Node);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.xr.scenecore.impl.JxrPlatformAdapterAxr create(android.app.Activity, java.util.concurrent.ScheduledExecutorService, androidx.xr.extensions.XrExtensions, com.google.ar.imp.apibindings.ImpressApi?, androidx.xr.scenecore.impl.perception.PerceptionLibrary, com.google.androidxr.splitengine.SplitEngineSubspaceManager?, com.google.ar.imp.view.splitengine.ImpSplitEngineRenderer?);
     method public static androidx.xr.scenecore.impl.JxrPlatformAdapterAxr create(android.app.Activity, java.util.concurrent.ScheduledExecutorService, boolean);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.xr.scenecore.impl.JxrPlatformAdapterAxr create(android.app.Activity, java.util.concurrent.ScheduledExecutorService, com.android.extensions.xr.node.Node, com.android.extensions.xr.node.Node);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.xr.scenecore.impl.JxrPlatformAdapterAxr create(android.app.Activity, java.util.concurrent.ScheduledExecutorService, com.android.extensions.xr.XrExtensions, com.google.ar.imp.apibindings.ImpressApi?, androidx.xr.scenecore.impl.perception.PerceptionLibrary, com.google.androidxr.splitengine.SplitEngineSubspaceManager?, com.google.ar.imp.view.splitengine.ImpSplitEngineRenderer?);
     method public androidx.xr.scenecore.JxrPlatformAdapter.ActivityPanelEntity createActivityPanelEntity(androidx.xr.runtime.math.Pose, androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions, String, android.app.Activity, androidx.xr.scenecore.JxrPlatformAdapter.Entity);
     method public androidx.xr.scenecore.JxrPlatformAdapter.AnchorEntity createAnchorEntity(androidx.xr.arcore.Anchor);
     method public androidx.xr.scenecore.JxrPlatformAdapter.AnchorEntity createAnchorEntity(androidx.xr.scenecore.JxrPlatformAdapter.Dimensions, androidx.xr.scenecore.JxrPlatformAdapter.PlaneType, androidx.xr.scenecore.JxrPlatformAdapter.PlaneSemantic, java.time.Duration);
@@ -2089,8 +2040,7 @@
     method public androidx.xr.scenecore.JxrPlatformAdapter.InteractableComponent createInteractableComponent(java.util.concurrent.Executor, androidx.xr.scenecore.JxrPlatformAdapter.InputEventListener);
     method public androidx.xr.scenecore.JxrPlatformAdapter.LoggingEntity createLoggingEntity(androidx.xr.runtime.math.Pose);
     method public androidx.xr.scenecore.JxrPlatformAdapter.MovableComponent createMovableComponent(boolean, boolean, java.util.Set<androidx.xr.scenecore.JxrPlatformAdapter.AnchorPlacement!>, boolean);
-    method public androidx.xr.scenecore.JxrPlatformAdapter.PanelEntity createPanelEntity(android.content.Context, androidx.xr.runtime.math.Pose, android.view.View, androidx.xr.scenecore.JxrPlatformAdapter.Dimensions, String, androidx.xr.scenecore.JxrPlatformAdapter.Entity);
-    method public androidx.xr.scenecore.JxrPlatformAdapter.PanelEntity createPanelEntity(android.content.Context, androidx.xr.runtime.math.Pose, android.view.View, androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions, String, androidx.xr.scenecore.JxrPlatformAdapter.Entity);
+    method public androidx.xr.scenecore.JxrPlatformAdapter.PanelEntity createPanelEntity(androidx.xr.runtime.math.Pose, android.view.View, androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions, androidx.xr.scenecore.JxrPlatformAdapter.Dimensions, String, android.content.Context, androidx.xr.scenecore.JxrPlatformAdapter.Entity);
     method public androidx.xr.scenecore.JxrPlatformAdapter.AnchorEntity createPersistedAnchorEntity(java.util.UUID, java.time.Duration);
     method public androidx.xr.scenecore.JxrPlatformAdapter.PointerCaptureComponent createPointerCaptureComponent(java.util.concurrent.Executor, androidx.xr.scenecore.JxrPlatformAdapter.PointerCaptureComponent.StateListener, androidx.xr.scenecore.JxrPlatformAdapter.InputEventListener);
     method public androidx.xr.scenecore.JxrPlatformAdapter.ResizableComponent createResizableComponent(androidx.xr.scenecore.JxrPlatformAdapter.Dimensions, androidx.xr.scenecore.JxrPlatformAdapter.Dimensions);
@@ -2110,30 +2060,25 @@
     method public long getNativeInstance();
     method public long getNativeSession();
     method public androidx.xr.scenecore.JxrPlatformAdapter.PerceptionSpaceActivityPose getPerceptionSpaceActivityPose();
-    method public androidx.xr.scenecore.JxrPlatformAdapter.TextureResource? getReflectionTextureFromIbl(androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource);
     method public androidx.xr.scenecore.JxrPlatformAdapter.SoundPoolExtensionsWrapper getSoundPoolExtensionsWrapper();
     method public androidx.xr.scenecore.JxrPlatformAdapter.SpatialCapabilities getSpatialCapabilities();
     method public androidx.xr.scenecore.JxrPlatformAdapter.SpatialEnvironment getSpatialEnvironment();
     method public androidx.xr.scenecore.impl.perception.ViewProjections? getStereoViewsInOpenXrUnboundedSpace();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource!>? loadExrImageByAssetName(String);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource!>? loadExrImageByAssetNameSplitEngine(String);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource!>? loadExrImageByByteArraySplitEngine(byte[], String);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.JxrPlatformAdapter.GltfModelResource!>? loadGltfByAssetName(String);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.JxrPlatformAdapter.GltfModelResource!>? loadGltfByAssetNameSplitEngine(String);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.JxrPlatformAdapter.GltfModelResource!>? loadGltfByByteArray(byte[], String);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.xr.scenecore.JxrPlatformAdapter.TextureResource!>? loadTexture(String, androidx.xr.scenecore.JxrPlatformAdapter.TextureSampler);
     method public void removeSpatialCapabilitiesChangedListener(java.util.function.Consumer<androidx.xr.scenecore.JxrPlatformAdapter.SpatialCapabilities!>);
     method public void requestFullSpaceMode();
     method public void requestHomeSpaceMode();
-    method public void setAlphaMap(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, androidx.xr.scenecore.JxrPlatformAdapter.TextureResource);
     method public void setAlphaStepMultiplier(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, float);
+    method public void setAlphaStepU(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, androidx.xr.runtime.math.Vector4);
+    method public void setAlphaStepV(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, androidx.xr.runtime.math.Vector4);
     method public android.os.Bundle setFullSpaceMode(android.os.Bundle);
     method public android.os.Bundle setFullSpaceModeWithEnvironmentInherited(android.os.Bundle);
-    method public void setNormalBoundary(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, float);
     method public void setNormalMap(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, androidx.xr.scenecore.JxrPlatformAdapter.TextureResource);
     method public void setNormalSpeed(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, float);
     method public void setNormalTiling(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, float);
-    method public void setNormalZ(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, float);
     method public void setPreferredAspectRatio(android.app.Activity, float);
     method public void setReflectionCube(androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource, androidx.xr.scenecore.JxrPlatformAdapter.TextureResource);
     method public void setSplitEngineSubspaceManager(com.google.androidxr.splitengine.SplitEngineSubspaceManager?);
@@ -2151,14 +2096,6 @@
 
 }
 
-package androidx.xr.scenecore.impl.extensions {
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class XrExtensionsProvider {
-    method public static com.android.extensions.xr.XrExtensions? getXrExtensions();
-  }
-
-}
-
 package androidx.xr.scenecore.impl.perception {
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class Anchor {
diff --git a/xr/scenecore/scenecore/build.gradle b/xr/scenecore/scenecore/build.gradle
index da7d72c..106ecab 100644
--- a/xr/scenecore/scenecore/build.gradle
+++ b/xr/scenecore/scenecore/build.gradle
@@ -70,10 +70,9 @@
     androidTestImplementation("androidx.appcompat:appcompat:1.2.0")
     androidTestImplementation(project(":xr:scenecore:scenecore-testing"))
 
-    // For com.android.xr.extensions.
-    compileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
-    testCompileOnly(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.jar")))
-    testImplementation(files(new File(AndroidXConfig.getPrebuiltsRoot(project), "androidx/xr/extensions/com.android.extensions.xr.host.test.jar")))
+    // For androidx.xr.extensions.
+    compileOnly(project(':xr:xr-stubs'))
+    testImplementation(project(':xr:xr-stubs'))
 }
 
 android {
diff --git a/xr/scenecore/scenecore/src/androidTest/java/androidx/xr/scenecore/impl/perception/PerceptionLibraryTest.java b/xr/scenecore/scenecore/src/androidTest/java/androidx/xr/scenecore/impl/perception/PerceptionLibraryTest.java
index 80f5ed3..a048196 100644
--- a/xr/scenecore/scenecore/src/androidTest/java/androidx/xr/scenecore/impl/perception/PerceptionLibraryTest.java
+++ b/xr/scenecore/scenecore/src/androidTest/java/androidx/xr/scenecore/impl/perception/PerceptionLibraryTest.java
@@ -26,7 +26,6 @@
 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.xr.scenecore.impl.perception.exceptions.FailedToInitializeException;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
 
@@ -44,7 +43,6 @@
 import java.util.concurrent.ExecutionException;
 
 /** This tests the Java/JNI interface of the perception library, with a fake native library. */
-@SdkSuppress(minSdkVersion = 29)
 @LargeTest
 @RunWith(AndroidJUnit4.class)
 public final class PerceptionLibraryTest {
diff --git a/xr/scenecore/scenecore/src/androidTest/java/androidx/xr/scenecore/impl/perception/PlaneTest.java b/xr/scenecore/scenecore/src/androidTest/java/androidx/xr/scenecore/impl/perception/PlaneTest.java
index b6d3954..0e0027a 100644
--- a/xr/scenecore/scenecore/src/androidTest/java/androidx/xr/scenecore/impl/perception/PlaneTest.java
+++ b/xr/scenecore/scenecore/src/androidTest/java/androidx/xr/scenecore/impl/perception/PlaneTest.java
@@ -22,7 +22,6 @@
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
-import androidx.test.filters.SdkSuppress;
 
 import org.junit.After;
 import org.junit.BeforeClass;
@@ -30,7 +29,6 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mockito;
 
-@SdkSuppress(minSdkVersion = 29)
 @LargeTest
 @RunWith(AndroidJUnit4.class)
 public final class PlaneTest {
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ActivityPanelEntity.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ActivityPanelEntity.kt
deleted file mode 100644
index 0b7db8f..0000000
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ActivityPanelEntity.kt
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.scenecore
-
-import android.app.Activity
-import android.content.Intent
-import android.graphics.Rect
-import android.os.Bundle
-import androidx.annotation.RestrictTo
-import androidx.xr.runtime.math.Pose
-
-/**
- * ActivityPanelEntity creates a spatial panel for embedding an Activity in Android XR. Users can
- * either use an intent to launch an activity in the given panel or provide an instance of activity
- * to move into this panel. Calling dispose() on this entity will destroy the underlying activity.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public class ActivityPanelEntity
-private constructor(
-    private val rtActivityPanelEntity: JxrPlatformAdapter.ActivityPanelEntity,
-    entityManager: EntityManager,
-) : PanelEntity(rtActivityPanelEntity, entityManager) {
-
-    /**
-     * Launches an activity in the given panel. Subsequent calls to this method will replace the
-     * already existing activity in the panel with the new one. If the intent fails to launch the
-     * activity, the panel will not be visible. Note this will not update the dimensions of the
-     * surface underlying the panel. The Activity will be letterboxed as required to fit the size of
-     * the panel. The underlying surface can be resized by calling setPixelDimensions().
-     *
-     * @param intent Intent to launch the activity.
-     * @param bundle Bundle to pass to the activity, can be null.
-     */
-    @JvmOverloads
-    public fun launchActivity(intent: Intent, bundle: Bundle? = null) {
-        rtActivityPanelEntity.launchActivity(intent, bundle)
-    }
-
-    /**
-     * Moves the given activity into this panel. Note this will not update the dimensions of the
-     * surface underlying the panel. The Activity will be letterboxed as required to fit the size of
-     * the panel. The underlying surface can be resized by calling setPixelDimensions().
-     *
-     * @param activity Activity to move into this panel.
-     */
-    public fun moveActivity(activity: Activity) {
-        rtActivityPanelEntity.moveActivity(activity)
-    }
-
-    public companion object {
-        /**
-         * Factory method for ActivityPanelEntity.
-         *
-         * @param adapter JxrPlatformAdapter to use.
-         * @param windowBoundsPx Bounds for the underlying surface for the given view.
-         * @param name Name of this panel.
-         * @param hostActivity Activity which created this panel.
-         * @param pose Pose for this panel, relative to its parent.
-         */
-        internal fun create(
-            adapter: JxrPlatformAdapter,
-            entityManager: EntityManager,
-            windowBoundsPx: PixelDimensions,
-            name: String,
-            hostActivity: Activity,
-            pose: Pose = Pose.Identity,
-        ): ActivityPanelEntity =
-            ActivityPanelEntity(
-                adapter.createActivityPanelEntity(
-                    pose,
-                    windowBoundsPx.toRtPixelDimensions(),
-                    name,
-                    hostActivity,
-                    adapter.activitySpaceRootImpl,
-                ),
-                entityManager,
-            )
-
-        // TODO(b/352629832): Update windowBoundsPx to be a PixelDimensions
-        /**
-         * Public factory function for a spatial ActivityPanelEntity.
-         *
-         * @param session Session to create the ActivityPanelEntity in.
-         * @param windowBoundsPx Bounds for the panel window in pixels.
-         * @param name Name of the panel.
-         * @param pose Pose of this entity relative to its parent, default value is Identity.
-         * @return an ActivityPanelEntity instance.
-         */
-        @JvmOverloads
-        @JvmStatic
-        public fun create(
-            session: Session,
-            windowBoundsPx: Rect,
-            name: String,
-            pose: Pose = Pose.Identity,
-        ): ActivityPanelEntity =
-            ActivityPanelEntity.create(
-                session.platformAdapter,
-                session.entityManager,
-                PixelDimensions(windowBoundsPx.width(), windowBoundsPx.height()),
-                name,
-                session.activity,
-                pose,
-            )
-    }
-}
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ActivityPose.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ActivityPose.kt
index 29ee36c..2c3b3a21 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ActivityPose.kt
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ActivityPose.kt
@@ -52,7 +52,7 @@
  * ActivityPose.
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public abstract class BaseActivityPose<out RtActivityPoseType : JxrPlatformAdapter.ActivityPose>(
+public sealed class BaseActivityPose<out RtActivityPoseType : JxrPlatformAdapter.ActivityPose>(
     internal val rtActivityPose: RtActivityPoseType
 ) : ActivityPose {
     private companion object {
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ActivitySpace.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ActivitySpace.kt
deleted file mode 100644
index b44ff12..0000000
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ActivitySpace.kt
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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("BanConcurrentHashMap")
-
-package androidx.xr.scenecore
-
-import androidx.annotation.RestrictTo
-import java.util.concurrent.ConcurrentHashMap
-import java.util.concurrent.ConcurrentMap
-import java.util.concurrent.Executor
-import java.util.function.Consumer
-
-/**
- * ActivitySpace is an Entity used to track the system-managed pose and boundary of the volume
- * associated with this Spatialized Activity. The Application cannot directly control this volume,
- * but the system might update it in response to the User moving it or entering or exiting FullSpace
- * mode.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public class ActivitySpace
-private constructor(
-    rtActivitySpace: JxrPlatformAdapter.ActivitySpace,
-    entityManager: EntityManager,
-) : BaseEntity<JxrPlatformAdapter.ActivitySpace>(rtActivitySpace, entityManager) {
-
-    internal companion object {
-        internal fun create(
-            adapter: JxrPlatformAdapter,
-            entityManager: EntityManager
-        ): ActivitySpace = ActivitySpace(adapter.activitySpace, entityManager)
-    }
-
-    private val boundsListeners:
-        ConcurrentMap<
-            Consumer<Dimensions>,
-            JxrPlatformAdapter.ActivitySpace.OnBoundsChangedListener
-        > =
-        ConcurrentHashMap()
-
-    /**
-     * The listener registered when using the deprecated registerOnBoundsChangedListener method. We
-     * keep this reference so it can be removed using the corresponding unregister method.
-     */
-    // TODO: b/370538244 - remove with deprecated spatial state callbacks
-    private var registeredBoundsListener: Consumer<Dimensions>? = null
-
-    /**
-     * Retrieves a copy of the current bounds of this ActivitySpace.
-     *
-     * @return [Dimensions] representing the current bounds of this ActivitySpace.
-     */
-    // TODO b/370618648: remove suppression after API review is complete.
-    public fun getBounds(): Dimensions = rtEntity.bounds.toDimensions()
-
-    /**
-     * Adds the given [Consumer] as a listener to be invoked when this ActivitySpace's current
-     * boundary changes. [Consumer#accept(Dimensions)] will be invoked on the main thread.
-     *
-     * @param listener The Consumer to be invoked when this ActivitySpace's current boundary
-     *   changes.
-     */
-    // TODO b/370618648: remove suppression after API review is complete.
-    public fun addBoundsChangedListener(listener: Consumer<Dimensions>): Unit =
-        addBoundsChangedListener(HandlerExecutor.mainThreadExecutor, listener)
-
-    /**
-     * Adds the given [Consumer] as a listener to be invoked when this ActivitySpace's current
-     * boundary changes. [Consumer#accept(Dimensions)] will be invoked on the given executor.
-     *
-     * @param callbackExecutor The executor on which to invoke the listener on.
-     * @param listener The Consumer to be invoked when this ActivitySpace's current boundary
-     *   changes.
-     */
-    // TODO b/370618648: remove suppression after API review is complete.
-    public fun addBoundsChangedListener(
-        callbackExecutor: Executor,
-        listener: Consumer<Dimensions>
-    ) {
-        val rtListener: JxrPlatformAdapter.ActivitySpace.OnBoundsChangedListener =
-            JxrPlatformAdapter.ActivitySpace.OnBoundsChangedListener { rtDimensions ->
-                callbackExecutor.execute { listener.accept(rtDimensions.toDimensions()) }
-            }
-        boundsListeners.compute(
-            listener,
-            { _, _ ->
-                rtEntity.addOnBoundsChangedListener(rtListener)
-                rtListener
-            },
-        )
-    }
-
-    /**
-     * Releases the given [Consumer] from receiving updates when the ActivitySpace's boundary
-     * changes.
-     *
-     * @param listener The Consumer to be removed from receiving updates.
-     */
-    // TODO b/370618648: remove suppression after API review is complete.
-    public fun removeBoundsChangedListener(listener: Consumer<Dimensions>): Unit {
-        boundsListeners.computeIfPresent(
-            listener,
-            { _, rtListener ->
-                rtEntity.removeOnBoundsChangedListener(rtListener)
-                null // returning null from computeIfPresent removes this entry from the Map
-            },
-        )
-    }
-
-    /**
-     * Sets a callback to be invoked when the bounds of the ActivitySpace change. The callback will
-     * be dispatched on the UI thread.
-     *
-     * @param listener A ((Dimensions) -> Unit) callback, where Dimensions are in meters.
-     */
-    // TODO: b/370538244 - remove with deprecated spatial state callbacks
-    @Suppress("Deprecation")
-    @Deprecated(message = "use addBoundsChangedListener(Consumer<Dimensions>)")
-    public fun registerOnBoundsChangedListener(listener: OnBoundsChangeListener) {
-        if (registeredBoundsListener != null) unregisterOnBoundsChangedListener()
-        registeredBoundsListener =
-            Consumer<Dimensions> { bounds -> listener.onBoundsChanged(bounds) }
-        addBoundsChangedListener(registeredBoundsListener!!)
-    }
-
-    /** Clears the listener set by [registerOnBoundsChangedListener]. */
-    // TODO: b/370538244 - remove with deprecated spatial state callbacks
-    @Deprecated(message = "use removeBoundsChangedListener(Consumer<Dimensions>)")
-    public fun unregisterOnBoundsChangedListener() {
-        if (registeredBoundsListener != null) {
-            removeBoundsChangedListener(registeredBoundsListener!!)
-            registeredBoundsListener = null
-        }
-    }
-
-    /**
-     * Registers a listener to be called when the underlying space has moved or changed.
-     *
-     * @param listener The listener to register if non-null, else stops listening if null.
-     * @param executor The executor to run the listener on. Defaults to SceneCore executor if null.
-     */
-    @JvmOverloads
-    @Suppress("ExecutorRegistration")
-    public fun setOnSpaceUpdatedListener(
-        listener: OnSpaceUpdatedListener?,
-        executor: Executor? = null,
-    ) {
-        rtEntity.setOnSpaceUpdatedListener(listener?.let { { it.onSpaceUpdated() } }, executor)
-    }
-}
-
-// TODO: b/370538244 - remove with deprecated spatial state callbacks
-@Deprecated(message = "Use addBoundsChangedListener(Consumer<Dimensions>)")
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public fun interface OnBoundsChangeListener {
-    public fun onBoundsChanged(bounds: Dimensions) // Dimensions are in meters.
-}
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/AnchorEntity.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/AnchorEntity.kt
deleted file mode 100644
index 2558164..0000000
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/AnchorEntity.kt
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.scenecore
-
-import android.util.Log
-import androidx.annotation.IntDef
-import androidx.annotation.RestrictTo
-import androidx.xr.arcore.Anchor
-import androidx.xr.runtime.Session as PerceptionSession
-import java.time.Duration
-import java.util.UUID
-import java.util.concurrent.Executor
-import java.util.concurrent.atomic.AtomicReference
-
-/**
- * An AnchorEntity is created to track a Pose relative to some position or surface in the "Real
- * World." Children of this Entity will remain positioned relative to that location in the real
- * world, for the purposes of creating Augmented Reality experiences.
- *
- * Note that Anchors are only relative to the "real world", and not virtual environments. Also,
- * calling setParent() on an AnchorEntity has no effect, as the parenting of an Anchor is controlled
- * by the system.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public class AnchorEntity
-private constructor(rtEntity: JxrPlatformAdapter.AnchorEntity, entityManager: EntityManager) :
-    BaseEntity<JxrPlatformAdapter.AnchorEntity>(rtEntity, entityManager) {
-    private val state = AtomicReference(rtEntity.state.fromRtState())
-    private val persistState = AtomicReference(rtEntity.persistState.fromRtPersistState())
-
-    private var onStateChangedListener: OnStateChangedListener? = null
-
-    /** Specifies the current tracking state of the Anchor. */
-    @Target(AnnotationTarget.TYPE)
-    @IntDef(State.ANCHORED, State.UNANCHORED, State.TIMEDOUT, State.ERROR)
-    @Retention(AnnotationRetention.SOURCE)
-    internal annotation class StateValue
-
-    public object State {
-        /**
-         * The ANCHORED state means that this Anchor is being actively tracked and updated by the
-         * perception stack. The application should expect children to maintain their relative
-         * positioning to the system's best understanding of a pose in the real world.
-         */
-        public const val ANCHORED: Int = 0
-        /**
-         * An UNANCHORED state could mean that the perception stack hasn't found an anchor for this
-         * Space, that it has lost tracking.
-         */
-        public const val UNANCHORED: Int = 1
-        /**
-         * The AnchorEntity timed out while searching for an underlying anchor. This it is not
-         * possible to recover the AnchorEntity.
-         */
-        public const val TIMEDOUT: Int = 2
-        /**
-         * The ERROR state means that something has gone wrong and this AnchorEntity is invalid
-         * without the possibility of recovery.
-         */
-        public const val ERROR: Int = 3
-        /**
-         * The PERMISSIONS_NOT_GRANTED state means that the user has not granted the necessary
-         * permissions i.e. SCENE_UNDERSTANDING to create this AnchorEntity.
-         */
-        public const val PERMISSIONS_NOT_GRANTED: Int = 4
-    }
-
-    /** Specifies the current persist state of the Anchor. */
-    public enum class PersistState {
-        /** The anchor hasn't been requested to persist. */
-        PERSIST_NOT_REQUESTED,
-        /** The anchor is requested to persist but hasn't been persisted yet. */
-        PERSIST_PENDING,
-        /** The anchor is persisted successfully. */
-        PERSISTED,
-    }
-
-    /** Returns the current tracking state for this AnchorEntity. */
-    public fun getState(): @StateValue Int = state.get()
-
-    /** Registers a listener callback to be issued when an anchor's state changes. */
-    @Suppress("ExecutorRegistration")
-    public fun setOnStateChangedListener(onStateChangedListener: OnStateChangedListener?) {
-        this.onStateChangedListener = onStateChangedListener
-        if (state.get() == State.PERMISSIONS_NOT_GRANTED) {
-            onStateChangedListener?.onStateChanged(State.PERMISSIONS_NOT_GRANTED)
-        }
-    }
-
-    /** Updates the current state. */
-    private fun setState(newState: @StateValue Int) {
-        state.set(newState)
-        onStateChangedListener?.onStateChanged(newState)
-    }
-
-    /** Gets the current PersistState. */
-    public fun getPersistState(): PersistState = persistState.get()
-
-    /**
-     * Requests to persist the anchor. If the anchor's State is not ANCHORED, no request will be
-     * sent and null is returned. If the request is sent successfully, returns an UUID of the anchor
-     * immediately; otherwise returns null. After this call, client should use getPersistState() to
-     * check the PersistState of the anchor. If the anchor's PersistState becomes PERSISTED before
-     * the app is closed the anchor can be recreated in a new session by calling
-     * Session.createPersistedAnchorEntity(uuid). If the PersistState doesn't become PERSISTED
-     * before the app is closed, the recreation will fail.
-     */
-    public fun persist(): UUID? {
-        if (state.get() != State.ANCHORED) {
-            Log.e(TAG, "Cannot persist an anchor that is not in the ANCHORED state.")
-            return null
-        }
-        val uuid = rtEntity.persist()
-        if (uuid == null) {
-            Log.e(TAG, "Failed to get a UUID for the anchor.")
-            return null
-        }
-
-        rtEntity.registerPersistStateChangeListener { newRtPersistState ->
-            persistState.set(newRtPersistState.fromRtPersistState())
-        }
-        return uuid
-    }
-
-    /**
-     * Loads the ARCore for XR Anchor using a Jetpack XR Runtime session.
-     *
-     * @param session the Jetpack XR Runtime session to load the Anchor from.
-     * @return the ARCore for XR Anchor corresponding to the native pointer.
-     */
-    // TODO(b/373711152) : Remove this method once the ARCore for XR API migration is done.
-    public fun getAnchor(session: PerceptionSession): Anchor {
-        return Anchor.loadFromNativePointer(session, rtEntity.nativePointer())
-    }
-
-    public companion object {
-        private const val TAG = "AnchorEntity"
-
-        /**
-         * Factory method for AnchorEntity.
-         *
-         * @param adapter JxrPlatformAdapter to use.
-         * @param bounds Bounds for this Anchor Entity.
-         * @param planeType Orientation for the plane to which this Anchor should attach.
-         * @param planeSemantic Semantics for the plane to which this Anchor should attach.
-         * @param timeout Maximum time to search for the anchor, if a suitable plane is not found
-         *   within the timeout time the AnchorEntity state will be set to TIMED_OUT.
-         */
-        internal fun create(
-            adapter: JxrPlatformAdapter,
-            entityManager: EntityManager,
-            bounds: Dimensions,
-            planeType: @PlaneTypeValue Int,
-            planeSemantic: @PlaneSemanticValue Int,
-            timeout: Duration = Duration.ZERO,
-        ): AnchorEntity {
-            val rtAnchorEntity =
-                adapter.createAnchorEntity(
-                    bounds.toRtDimensions(),
-                    planeType.toRtPlaneType(),
-                    planeSemantic.toRtPlaneSemantic(),
-                    timeout,
-                )
-            return create(rtAnchorEntity, entityManager)
-        }
-
-        /**
-         * Factory method for AnchorEntity.
-         *
-         * @param anchor Anchor to create an AnchorEntity for.
-         */
-        internal fun create(
-            adapter: JxrPlatformAdapter,
-            entityManager: EntityManager,
-            anchor: Anchor,
-        ): AnchorEntity {
-            val rtAnchorEntity = adapter.createAnchorEntity(anchor)
-            return create(rtAnchorEntity, entityManager)
-        }
-
-        /**
-         * Factory method for AnchorEntity.
-         *
-         * @param rtAnchorEntity Runtime AnchorEntity instance.
-         */
-        internal fun create(
-            rtAnchorEntity: JxrPlatformAdapter.AnchorEntity,
-            entityManager: EntityManager,
-        ): AnchorEntity {
-            val anchorEntity = AnchorEntity(rtAnchorEntity, entityManager)
-            rtAnchorEntity.setOnStateChangedListener { newRtState ->
-                when (newRtState) {
-                    JxrPlatformAdapter.AnchorEntity.State.UNANCHORED ->
-                        anchorEntity.setState(State.UNANCHORED)
-                    JxrPlatformAdapter.AnchorEntity.State.ANCHORED ->
-                        anchorEntity.setState(State.ANCHORED)
-                    JxrPlatformAdapter.AnchorEntity.State.TIMED_OUT ->
-                        anchorEntity.setState(State.TIMEDOUT)
-                    JxrPlatformAdapter.AnchorEntity.State.ERROR ->
-                        anchorEntity.setState(State.ERROR)
-                    JxrPlatformAdapter.AnchorEntity.State.PERMISSIONS_NOT_GRANTED ->
-                        anchorEntity.setState(State.PERMISSIONS_NOT_GRANTED)
-                }
-            }
-            return anchorEntity
-        }
-
-        /**
-         * Factory method for AnchorEntity.
-         *
-         * @param adapter JxrPlatformAdapter to use.
-         * @param uuid UUID of the persisted Anchor Entity to create.
-         * @param timeout Maximum time to search for the anchor, if a persisted anchor isn't located
-         *   within the timeout time the AnchorEntity state will be set to TIMED_OUT.
-         */
-        internal fun create(
-            adapter: JxrPlatformAdapter,
-            entityManager: EntityManager,
-            uuid: UUID,
-            timeout: Duration = Duration.ZERO,
-        ): AnchorEntity {
-            val rtAnchorEntity = adapter.createPersistedAnchorEntity(uuid, timeout)
-            val anchorEntity = AnchorEntity(rtAnchorEntity, entityManager)
-            rtAnchorEntity.setOnStateChangedListener { newRtState ->
-                when (newRtState) {
-                    JxrPlatformAdapter.AnchorEntity.State.UNANCHORED ->
-                        anchorEntity.setState(State.UNANCHORED)
-                    JxrPlatformAdapter.AnchorEntity.State.ANCHORED ->
-                        anchorEntity.setState(State.ANCHORED)
-                    JxrPlatformAdapter.AnchorEntity.State.TIMED_OUT ->
-                        anchorEntity.setState(State.TIMEDOUT)
-                    JxrPlatformAdapter.AnchorEntity.State.ERROR ->
-                        anchorEntity.setState(State.ERROR)
-                    JxrPlatformAdapter.AnchorEntity.State.PERMISSIONS_NOT_GRANTED ->
-                        anchorEntity.setState(State.PERMISSIONS_NOT_GRANTED)
-                }
-            }
-            return anchorEntity
-        }
-
-        /**
-         * Public factory function for an AnchorEntity which searches for a location to create an
-         * Anchor among the tracked planes available to the perception system.
-         *
-         * Note that this function will fail if the application has not been granted the
-         * "android.permission.SCENE_UNDERSTANDING" permission. Consider using PermissionHelper to
-         * help request permission from the User.
-         *
-         * @param session Session to create the AnchorEntity in.
-         * @param bounds Bounds for this AnchorEntity.
-         * @param planeType Orientation of plane to which this Anchor should attach.
-         * @param planeSemantic Semantics of the plane to which this Anchor should attach.
-         * @param timeout The amount of time as a [Duration] to search for the a suitable plane to
-         *   attach to. If a plane is not found within the timeout, the returned AnchorEntity state
-         *   will be set to AnchorEntity.State.TIMEDOUT. It may take longer than the timeout period
-         *   before the anchor state is updated. If the timeout duration is zero it will search for
-         *   the anchor indefinitely.
-         */
-        @JvmStatic
-        @JvmOverloads
-        public fun create(
-            session: Session,
-            bounds: Dimensions,
-            planeType: @PlaneTypeValue Int,
-            planeSemantic: @PlaneSemanticValue Int,
-            timeout: Duration = Duration.ZERO,
-        ): AnchorEntity {
-            return AnchorEntity.create(
-                session.platformAdapter,
-                session.entityManager,
-                bounds,
-                planeType,
-                planeSemantic,
-                timeout,
-            )
-        }
-
-        /**
-         * Public factory function for an AnchorEntity which uses an Anchor from ARCore for XR.
-         *
-         * @param session Session to create the AnchorEntity in.
-         * @param anchor The PerceptionAnchor to use for this AnchorEntity.
-         */
-        @JvmStatic
-        public fun create(session: Session, anchor: Anchor): AnchorEntity {
-            return AnchorEntity.create(session.platformAdapter, session.entityManager, anchor)
-        }
-    }
-
-    /**
-     * Extension function that converts [JxrPlatformAdapter.AnchorEntity.State] to
-     * [AnchorEntity.State].
-     */
-    private fun JxrPlatformAdapter.AnchorEntity.State.fromRtState() =
-        when (this) {
-            JxrPlatformAdapter.AnchorEntity.State.UNANCHORED -> State.UNANCHORED
-            JxrPlatformAdapter.AnchorEntity.State.ANCHORED -> State.ANCHORED
-            JxrPlatformAdapter.AnchorEntity.State.TIMED_OUT -> State.TIMEDOUT
-            JxrPlatformAdapter.AnchorEntity.State.ERROR -> State.ERROR
-            JxrPlatformAdapter.AnchorEntity.State.PERMISSIONS_NOT_GRANTED ->
-                State.PERMISSIONS_NOT_GRANTED
-        }
-
-    /**
-     * Extension function that converts [JxrPlatformAdapter.AnchorEntity.PersistState] to
-     * [AnchorEntity.PersistState].
-     */
-    private fun JxrPlatformAdapter.AnchorEntity.PersistState.fromRtPersistState() =
-        when (this) {
-            JxrPlatformAdapter.AnchorEntity.PersistState.PERSIST_NOT_REQUESTED ->
-                PersistState.PERSIST_NOT_REQUESTED
-            JxrPlatformAdapter.AnchorEntity.PersistState.PERSIST_PENDING ->
-                PersistState.PERSIST_PENDING
-            JxrPlatformAdapter.AnchorEntity.PersistState.PERSISTED -> PersistState.PERSISTED
-        }
-
-    /**
-     * Registers a listener to be called when the Anchor moves relative to its underlying space.
-     *
-     * <p> The callback is triggered by any anchor movements such as those made by the underlying
-     * perception stack to maintain the anchor's position relative to the real world. Any cached
-     * data relative to the activity space or any other "space" should be updated when this callback
-     * is triggered.
-     *
-     * @param listener The listener to register if non-null, else stops listening if null.
-     * @param executor The executor to run the listener on. Defaults to SceneCore executor if null.
-     */
-    @JvmOverloads
-    @Suppress("ExecutorRegistration")
-    public fun setOnSpaceUpdatedListener(
-        listener: OnSpaceUpdatedListener?,
-        executor: Executor? = null,
-    ) {
-        rtEntity.setOnSpaceUpdatedListener(listener?.let { { it.onSpaceUpdated() } }, executor)
-    }
-}
-
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public fun interface OnStateChangedListener {
-    public fun onStateChanged(newState: @AnchorEntity.StateValue Int)
-}
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ContentlessEntity.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ContentlessEntity.kt
deleted file mode 100644
index ab23133..0000000
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ContentlessEntity.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.scenecore
-
-import androidx.annotation.RestrictTo
-import androidx.xr.runtime.math.Pose
-
-/**
- * An Entity that itself has no content. ContentlessEntity is useful for organizing the placement,
- * movement of a group of SceneCore Entities.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public class ContentlessEntity
-private constructor(rtEntity: JxrPlatformAdapter.Entity, entityManager: EntityManager) :
-    BaseEntity<JxrPlatformAdapter.Entity>(rtEntity, entityManager) {
-    public companion object {
-        /** Factory method to create ContentlessEntity entities. */
-        internal fun create(
-            adapter: JxrPlatformAdapter,
-            entityManager: EntityManager,
-            name: String,
-            pose: Pose = Pose.Identity,
-        ): Entity =
-            ContentlessEntity(
-                adapter.createEntity(pose, name, adapter.activitySpaceRootImpl),
-                entityManager,
-            )
-
-        /**
-         * Public factory function for creating a content-less entity. This entity is used as a
-         * connection point for attaching children entities and managing them (i.e. setPose()) as a
-         * group.
-         *
-         * @param session Session to create the ContentlessEntity in.
-         * @param name Name of the entity.
-         * @param pose Initial pose of the entity.
-         */
-        @JvmOverloads
-        @JvmStatic
-        public fun create(session: Session, name: String, pose: Pose = Pose.Identity): Entity =
-            ContentlessEntity.create(session.platformAdapter, session.entityManager, name, pose)
-    }
-}
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/CubeMapTexture.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/CubeMapTexture.kt
index c530bd2..f3af628 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/CubeMapTexture.kt
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/CubeMapTexture.kt
@@ -19,16 +19,18 @@
 import androidx.annotation.MainThread
 import androidx.annotation.RestrictTo
 import androidx.xr.scenecore.JxrPlatformAdapter.TextureResource as RtTextureResource
+import java.lang.ref.WeakReference
 
 /** [CubeMapTexture] represents a cube map texture that can be used with materials. */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public class CubeMapTexture internal constructor(texture: RtTextureResource, session: Session) :
+public class CubeMapTexture
+internal constructor(texture: RtTextureResource, session: WeakReference<Session>) :
     Texture(texture, TextureSampler.create(), session) {
 
     public companion object {
         internal fun borrowReflectionTexture(
             platformAdapter: JxrPlatformAdapter,
-            session: Session,
+            session: WeakReference<Session>,
         ): CubeMapTexture {
             // TODO(b/396116100): Handle null return from borrow reflection texture.
             return CubeMapTexture(platformAdapter.borrowReflectionTexture()!!, session)
@@ -49,7 +51,9 @@
         @MainThread
         @JvmStatic
         public fun borrowReflectionTexture(session: Session): CubeMapTexture {
-            return borrowReflectionTexture(session.platformAdapter, session)
+            // The WeakReference prevents the Session (and its Activity) from being held in memory
+            // indefinitely.
+            return borrowReflectionTexture(session.platformAdapter, WeakReference(session))
         }
     }
 }
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Entity.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Entity.kt
index f3fa27e..cedf4d0 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Entity.kt
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Entity.kt
@@ -14,15 +14,35 @@
  * limitations under the License.
  */
 
-@file:Suppress("BanConcurrentHashMap")
+@file:Suppress("BanConcurrentHashMap", "Deprecation")
 
 package androidx.xr.scenecore
 
+import android.app.Activity
+import android.content.Context
+import android.content.Intent
+import android.graphics.Rect
+import android.os.Bundle
 import android.util.Log
+import android.view.Surface
+import android.view.View
+import androidx.annotation.IntDef
+import androidx.annotation.MainThread
 import androidx.annotation.RestrictTo
+import androidx.xr.arcore.Anchor
+import androidx.xr.runtime.Session as PerceptionSession
 import androidx.xr.runtime.math.Pose
 import androidx.xr.runtime.math.Vector3
 import androidx.xr.scenecore.JxrPlatformAdapter.Entity as RtEntity
+import androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource
+import androidx.xr.scenecore.JxrPlatformAdapter.PanelEntity as RtPanelEntity
+import java.time.Duration
+import java.util.UUID
+import java.util.concurrent.ConcurrentHashMap
+import java.util.concurrent.ConcurrentMap
+import java.util.concurrent.Executor
+import java.util.concurrent.atomic.AtomicReference
+import java.util.function.Consumer
 
 /**
  * Interface for a spatial Entity. An Entity's [Pose]s are represented as being relative to their
@@ -59,44 +79,18 @@
     /* TODO b/362296608: Add a getChildren() method. */
 
     /**
-     * Sets the pose for this Entity. The pose given is set relative to the space provided.
-     *
-     * @param pose The [Pose] offset from the parent.
-     * @param relativeTo Set the pose relative to given Space. Default value is the parent space.
-     */
-    public fun setPose(pose: Pose, @SpaceValue relativeTo: Int = Space.PARENT)
-
-    /**
      * Sets the pose for this Entity, relative to its parent.
      *
      * @param pose The [Pose] offset from the parent.
      */
-    public fun setPose(pose: Pose): Unit = setPose(pose, Space.PARENT)
-
-    /**
-     * Returns the pose for this entity, relative to the provided space.
-     *
-     * @param relativeTo Get the pose relative to given Space. Default value is the parent space.
-     * @return Current [Pose] of the entity relative to the given space.
-     */
-    public fun getPose(@SpaceValue relativeTo: Int = Space.PARENT): Pose
+    public fun setPose(pose: Pose)
 
     /**
      * Returns the pose for this entity, relative to its parent.
      *
      * @return Current [Pose] offset from the parent.
      */
-    public fun getPose(): Pose = getPose(Space.PARENT)
-
-    /**
-     * Sets the scale of this entity relative to given space. This value will affect the rendering
-     * of this Entity's children. As the scale increases, this will uniformly stretch the content of
-     * the Entity.
-     *
-     * @param scale The uniform scale factor.
-     * @param relativeTo Set the scale relative to given Space. Default value is the parent space.
-     */
-    public fun setScale(scale: Float, @SpaceValue relativeTo: Int = Space.PARENT)
+    public fun getPose(): Pose
 
     /**
      * Sets the scale of this entity relative to its parent. This value will affect the rendering of
@@ -105,22 +99,14 @@
      *
      * @param scale The uniform scale factor from the parent.
      */
-    public fun setScale(scale: Float): Unit = setScale(scale, Space.PARENT)
-
-    /**
-     * Returns the scale of this entity, relative to given space.
-     *
-     * @param relativeTo Get the scale relative to given Space. Default value is the parent space.
-     * @return Current uniform scale applied to self and children.
-     */
-    public fun getScale(@SpaceValue relativeTo: Int = Space.PARENT): Float
+    public fun setScale(scale: Float)
 
     /**
      * Returns the local scale of this entity, not inclusive of the parent's scale.
      *
      * @return Current uniform scale applied to self and children.
      */
-    public fun getScale(): Float = getScale(Space.PARENT)
+    public fun getScale(): Float
 
     /**
      * Returns the accumulated scale of this Entity. This value includes the parent's world space
@@ -128,18 +114,19 @@
      *
      * @return Total uniform scale applied to self and children.
      */
-    @Deprecated("Use getScale(Space.REAL_WORLD) instead.") public fun getWorldSpaceScale(): Float
+    public fun getWorldSpaceScale(): Float
 
     /**
-     * Sets the alpha transparency of the Entity relative to given space. Values are in the range
-     * [0, 1] with 0 being fully transparent and 1 being fully opaque.
+     * Sets the dimensions in pixels for the Entity.
      *
-     * This value will affect the rendering of this Entity's children. Children of this node will
-     * have their alpha levels multiplied by this value and any alpha of this entity's ancestors.
-     *
-     * @param relativeTo Sets alpha relative to given Space. Default value is the parent space.
+     * @param dimensions Dimensions in pixels. (Z will be ignored)
+     * @deprecated ("This method is deprecated. Use BasePanelEntity<*>.setPixelDimensions()
+     *   instead.")
      */
-    public fun setAlpha(alpha: Float, @SpaceValue relativeTo: Int = Space.PARENT)
+    public fun setSize(dimensions: Dimensions)
+
+    /** Returns the dimensions (in meters) for this Entity. */
+    public fun getSize(): Dimensions
 
     /**
      * Sets the alpha transparency of the Entity and its children. Values are in the range [0, 1]
@@ -148,14 +135,7 @@
      * This value will affect the rendering of this Entity's children. Children of this node will
      * have their alpha levels multiplied by this value and any alpha of this entity's ancestors.
      */
-    public fun setAlpha(alpha: Float): Unit = setAlpha(alpha, Space.PARENT)
-
-    /**
-     * Returns the alpha transparency set for this Entity, relative to given space.
-     *
-     * @param relativeTo Gets alpha relative to given Space. Default value is the parent space.
-     */
-    public fun getAlpha(@SpaceValue relativeTo: Int = Space.PARENT): Float
+    public fun setAlpha(alpha: Float)
 
     /**
      * Returns the alpha transparency set for this Entity.
@@ -163,7 +143,18 @@
      * This does not necessarily equal the perceived alpha of the entity as the entity may have some
      * alpha difference applied from its parent or the system.
      */
-    public fun getAlpha(): Float = getAlpha(Space.PARENT)
+    public fun getAlpha(): Float
+
+    /**
+     * Returns the global alpha of this entity computed by multiplying the parent's global alpha to
+     * this entity's local alpha.
+     *
+     * This does not necessarily equal the perceived alpha of the entity as the entity may have some
+     * alpha difference applied from the system.
+     *
+     * @return Total [Float] alpha applied to this entity.
+     */
+    public fun getActivitySpaceAlpha(): Float
 
     /**
      * Sets the local hidden state of this Entity. When true, this Entity and all descendants will
@@ -232,12 +223,148 @@
     public fun removeAllComponents()
 }
 
+/**
+ * ActivitySpace is an Entity used to track the system-managed pose and boundary of the volume
+ * associated with this Spatialized Activity. The Application cannot directly control this volume,
+ * but the system might update it in response to the User moving it or entering or exiting FullSpace
+ * mode.
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public class ActivitySpace
+private constructor(
+    rtActivitySpace: JxrPlatformAdapter.ActivitySpace,
+    entityManager: EntityManager,
+) : BaseEntity<JxrPlatformAdapter.ActivitySpace>(rtActivitySpace, entityManager) {
+
+    internal companion object {
+        internal fun create(
+            adapter: JxrPlatformAdapter,
+            entityManager: EntityManager
+        ): ActivitySpace = ActivitySpace(adapter.activitySpace, entityManager)
+    }
+
+    private val boundsListeners:
+        ConcurrentMap<
+            Consumer<Dimensions>,
+            JxrPlatformAdapter.ActivitySpace.OnBoundsChangedListener
+        > =
+        ConcurrentHashMap()
+
+    /**
+     * The listener registered when using the deprecated registerOnBoundsChangedListener method. We
+     * keep this reference so it can be removed using the corresponding unregister method.
+     */
+    // TODO: b/370538244 - remove with deprecated spatial state callbacks
+    private var registeredBoundsListener: Consumer<Dimensions>? = null
+
+    /**
+     * Retrieves a copy of the current bounds of this ActivitySpace.
+     *
+     * @return [Dimensions] representing the current bounds of this ActivitySpace.
+     */
+    // TODO b/370618648: remove suppression after API review is complete.
+    public fun getBounds(): Dimensions = rtEntity.bounds.toDimensions()
+
+    /**
+     * Adds the given [Consumer] as a listener to be invoked when this ActivitySpace's current
+     * boundary changes. [Consumer#accept(Dimensions)] will be invoked on the main thread.
+     *
+     * @param listener The Consumer to be invoked when this ActivitySpace's current boundary
+     *   changes.
+     */
+    // TODO b/370618648: remove suppression after API review is complete.
+    public fun addBoundsChangedListener(listener: Consumer<Dimensions>): Unit =
+        addBoundsChangedListener(HandlerExecutor.mainThreadExecutor, listener)
+
+    /**
+     * Adds the given [Consumer] as a listener to be invoked when this ActivitySpace's current
+     * boundary changes. [Consumer#accept(Dimensions)] will be invoked on the given executor.
+     *
+     * @param callbackExecutor The executor on which to invoke the listener on.
+     * @param listener The Consumer to be invoked when this ActivitySpace's current boundary
+     *   changes.
+     */
+    // TODO b/370618648: remove suppression after API review is complete.
+    public fun addBoundsChangedListener(
+        callbackExecutor: Executor,
+        listener: Consumer<Dimensions>
+    ) {
+        val rtListener: JxrPlatformAdapter.ActivitySpace.OnBoundsChangedListener =
+            JxrPlatformAdapter.ActivitySpace.OnBoundsChangedListener { rtDimensions ->
+                callbackExecutor.execute { listener.accept(rtDimensions.toDimensions()) }
+            }
+        boundsListeners.compute(
+            listener,
+            { _, _ ->
+                rtEntity.addOnBoundsChangedListener(rtListener)
+                rtListener
+            },
+        )
+    }
+
+    /**
+     * Releases the given [Consumer] from receiving updates when the ActivitySpace's boundary
+     * changes.
+     *
+     * @param listener The Consumer to be removed from receiving updates.
+     */
+    // TODO b/370618648: remove suppression after API review is complete.
+    public fun removeBoundsChangedListener(listener: Consumer<Dimensions>): Unit {
+        boundsListeners.computeIfPresent(
+            listener,
+            { _, rtListener ->
+                rtEntity.removeOnBoundsChangedListener(rtListener)
+                null // returning null from computeIfPresent removes this entry from the Map
+            },
+        )
+    }
+
+    /**
+     * Sets a callback to be invoked when the bounds of the ActivitySpace change. The callback will
+     * be dispatched on the UI thread.
+     *
+     * @param listener A ((Dimensions) -> Unit) callback, where Dimensions are in meters.
+     */
+    // TODO: b/370538244 - remove with deprecated spatial state callbacks
+    @Deprecated(message = "use addBoundsChangedListener(Consumer<Dimensions>)")
+    public fun registerOnBoundsChangedListener(listener: OnBoundsChangeListener) {
+        if (registeredBoundsListener != null) unregisterOnBoundsChangedListener()
+        registeredBoundsListener =
+            Consumer<Dimensions> { bounds -> listener.onBoundsChanged(bounds) }
+        addBoundsChangedListener(registeredBoundsListener!!)
+    }
+
+    /** Clears the listener set by [registerOnBoundsChangedListener]. */
+    // TODO: b/370538244 - remove with deprecated spatial state callbacks
+    @Deprecated(message = "use removeBoundsChangedListener(Consumer<Dimensions>)")
+    public fun unregisterOnBoundsChangedListener() {
+        if (registeredBoundsListener != null) {
+            removeBoundsChangedListener(registeredBoundsListener!!)
+            registeredBoundsListener = null
+        }
+    }
+
+    /**
+     * Registers a listener to be called when the underlying space has moved or changed.
+     *
+     * @param listener The listener to register if non-null, else stops listening if null.
+     * @param executor The executor to run the listener on. Defaults to SceneCore executor if null.
+     */
+    @JvmOverloads
+    @Suppress("ExecutorRegistration")
+    public fun setOnSpaceUpdatedListener(
+        listener: OnSpaceUpdatedListener?,
+        executor: Executor? = null,
+    ) {
+        rtEntity.setOnSpaceUpdatedListener(listener?.let { { it.onSpaceUpdated() } }, executor)
+    }
+}
+
 /** The BaseEntity is an implementation of Entity interface that wraps a platform entity. */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public abstract class BaseEntity<out RtEntityType : RtEntity>
-internal constructor(
+public sealed class BaseEntity<out RtEntityType : RtEntity>(
     internal val rtEntity: RtEntityType,
-    private val entityManager: EntityManager,
+    internal val entityManager: EntityManager,
 ) : Entity, BaseActivityPose<JxrPlatformAdapter.ActivityPose>(rtEntity) {
 
     init {
@@ -248,6 +375,7 @@
         private const val TAG = "BaseEntity"
     }
 
+    private var dimensions: Dimensions = Dimensions()
     private val componentList = mutableListOf<Component>()
 
     override fun setParent(parent: Entity?) {
@@ -275,33 +403,42 @@
         rtEntity.addChild(child.rtEntity)
     }
 
-    override fun setPose(pose: Pose, @SpaceValue relativeTo: Int) {
-        rtEntity.setPose(pose, relativeTo.toRtSpace())
+    override fun setPose(pose: Pose) {
+        rtEntity.setPose(pose)
     }
 
-    override fun getPose(@SpaceValue relativeTo: Int): Pose {
-        return rtEntity.getPose(relativeTo.toRtSpace())
+    override fun getPose(): Pose {
+        return rtEntity.pose
     }
 
-    override fun setScale(scale: Float, relativeTo: Int) {
-        rtEntity.setScale(Vector3(scale, scale, scale), relativeTo.toRtSpace())
+    override fun setScale(scale: Float) {
+        rtEntity.setScale(Vector3(scale, scale, scale))
     }
 
-    override fun getScale(@SpaceValue relativeTo: Int): Float {
-        return rtEntity.getScale(relativeTo.toRtSpace()).x
+    override fun getScale(): Float {
+        return rtEntity.scale.x
     }
 
-    @Deprecated("Use getScale(relativeTo) instead.", ReplaceWith("getScale(Space.REAL_WORLD)"))
     override fun getWorldSpaceScale(): Float {
         return rtEntity.worldSpaceScale.x
     }
 
-    override fun setAlpha(alpha: Float, @SpaceValue relativeTo: Int) {
-        rtEntity.setAlpha(alpha, relativeTo.toRtSpace())
+    // TODO: b/356874139 - remove this method
+    override fun setSize(dimensions: Dimensions) {
+        rtEntity.setSize(dimensions.toRtDimensions())
+        this.dimensions = dimensions
     }
 
-    override fun getAlpha(@SpaceValue relativeTo: Int): Float =
-        rtEntity.getAlpha(relativeTo.toRtSpace())
+    // TODO: b/328620113 - Get the dimensions from EntityImpl.
+    override fun getSize(): Dimensions = dimensions
+
+    override fun setAlpha(alpha: Float) {
+        rtEntity.alpha = alpha
+    }
+
+    override fun getAlpha(): Float = rtEntity.alpha
+
+    override fun getActivitySpaceAlpha(): Float = rtEntity.activitySpaceAlpha
 
     override fun setHidden(hidden: Boolean): Unit = rtEntity.setHidden(hidden)
 
@@ -344,6 +481,969 @@
     override fun setContentDescription(text: String) {}
 }
 
+/**
+ * An Entity that itself has no content. ContentlessEntity is useful for organizing the placement,
+ * movement of a group of SceneCore Entities.
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public class ContentlessEntity
+private constructor(rtEntity: RtEntity, entityManager: EntityManager) :
+    BaseEntity<RtEntity>(rtEntity, entityManager) {
+    public companion object {
+        /** Factory method to create ContentlessEntity entities. */
+        internal fun create(
+            adapter: JxrPlatformAdapter,
+            entityManager: EntityManager,
+            name: String,
+            pose: Pose = Pose.Identity,
+        ): Entity =
+            ContentlessEntity(
+                adapter.createEntity(pose, name, adapter.activitySpaceRootImpl),
+                entityManager,
+            )
+
+        /**
+         * Public factory function for creating a content-less entity. This entity is used as a
+         * connection point for attaching children entities and managing them (i.e. setPose()) as a
+         * group.
+         *
+         * @param session Session to create the ContentlessEntity in.
+         * @param name Name of the entity.
+         * @param pose Initial pose of the entity.
+         */
+        @JvmOverloads
+        @JvmStatic
+        public fun create(session: Session, name: String, pose: Pose = Pose.Identity): Entity =
+            ContentlessEntity.create(session.platformAdapter, session.entityManager, name, pose)
+    }
+}
+
+/** Provides implementations for common Panel functionality. */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public sealed class BasePanelEntity<out RtPanelEntityType : RtPanelEntity>(
+    private val rtPanelEntity: RtPanelEntityType,
+    entityManager: EntityManager,
+) : BaseEntity<RtPanelEntity>(rtPanelEntity, entityManager) {
+
+    /**
+     * Sets the corner radius of the PanelEntity.
+     *
+     * @param radius The radius of the corners, in meters.
+     * @throws IllegalArgumentException if radius is <= 0.0f.
+     */
+    public fun setCornerRadius(radius: Float) {
+        rtPanelEntity.setCornerRadius(radius)
+    }
+
+    /** Gets the corner radius of this PanelEntity in meters. Has a default value of 0. */
+    public fun getCornerRadius(): Float {
+        return rtPanelEntity.cornerRadius
+    }
+
+    /**
+     * Returns the dimensions of the view underlying this PanelEntity.
+     *
+     * @return The current (width, height) of the underlying surface in pixels.
+     */
+    public fun getPixelDimensions(): PixelDimensions {
+        return rtPanelEntity.getPixelDimensions().toPixelDimensions()
+    }
+
+    /**
+     * Sets the pixel (not Dp) dimensions of the view underlying this PanelEntity. Calling this
+     * might cause the layout of the Panel contents to change. Updating this will not cause the
+     * scale or pixel density to change.
+     *
+     * @param pxDimensions The [PixelDimensions] of the underlying surface to set.
+     */
+    public fun setPixelDimensions(pxDimensions: PixelDimensions) {
+        rtPanelEntity.setPixelDimensions(pxDimensions.toRtPixelDimensions())
+    }
+
+    /**
+     * Gets the number of pixels per meter for this panel. This value reflects changes to scale,
+     * including parent scale.
+     *
+     * @return Vector3 scale applied to pixels within the Panel. (Z will be 0)
+     */
+    public fun getPixelDensity(): Vector3 {
+        return rtPanelEntity.pixelDensity
+    }
+
+    /**
+     * Returns the spatial size of this Panel in meters. This includes any scaling applied to this
+     * panel by itself or its parents, which might be set via changes to setScale.
+     *
+     * @return [Dimensions] size of this panel in meters. (Z will be 0)
+     */
+    override fun getSize(): Dimensions {
+        return rtPanelEntity.getSize().toDimensions()
+    }
+}
+
+/**
+ * GltfModelEntity is a concrete implementation of Entity that hosts a glTF model.
+ *
+ * Note: The size property of this Entity is always reported as {0, 0, 0}, regardless of the actual
+ * size of the model.
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public class GltfModelEntity
+private constructor(rtEntity: JxrPlatformAdapter.GltfEntity, entityManager: EntityManager) :
+    BaseEntity<JxrPlatformAdapter.GltfEntity>(rtEntity, entityManager) {
+    // TODO: b/362368652 - Add an OnAnimationEvent() Listener interface
+
+    /** Specifies the current animation state of the GltfModelEntity. */
+    @IntDef(AnimationState.PLAYING, AnimationState.STOPPED)
+    @Retention(AnnotationRetention.SOURCE)
+    internal annotation class AnimationStateValue
+
+    public object AnimationState {
+        public const val PLAYING: Int = 0
+        public const val STOPPED: Int = 1
+    }
+
+    public companion object {
+        /**
+         * Factory method for GltfModelEntity.
+         *
+         * @param adapter Jetpack XR platform adapter.
+         * @param model [GltfModel] which this entity will display.
+         * @param pose Pose for this [GltfModelEntity], relative to its parent.
+         */
+        internal fun create(
+            adapter: JxrPlatformAdapter,
+            entityManager: EntityManager,
+            model: GltfModel,
+            pose: Pose = Pose.Identity,
+        ): GltfModelEntity =
+            GltfModelEntity(
+                adapter.createGltfEntity(pose, model.model, adapter.activitySpaceRootImpl),
+                entityManager,
+            )
+
+        /**
+         * Public factory function for a [GltfModelEntity].
+         *
+         * This method must be called from the main thread.
+         * https://developer.android.com/guide/components/processes-and-threads
+         *
+         * @param session Session to create the [GltfModel] in.
+         * @param model The [GltfModel] this Entity is referencing.
+         * @param pose The initial pose of the entity.
+         * @return a GltfModelEntity instance
+         */
+        @MainThread
+        @JvmStatic
+        @JvmOverloads
+        public fun create(
+            session: Session,
+            model: GltfModel,
+            pose: Pose = Pose.Identity,
+        ): GltfModelEntity =
+            GltfModelEntity.create(session.platformAdapter, session.entityManager, model, pose)
+    }
+
+    /** Returns the current animation state of this glTF entity. */
+    @AnimationStateValue
+    public fun getAnimationState(): Int {
+        return when (rtEntity.animationState) {
+            JxrPlatformAdapter.GltfEntity.AnimationState.PLAYING -> return AnimationState.PLAYING
+            JxrPlatformAdapter.GltfEntity.AnimationState.STOPPED -> return AnimationState.STOPPED
+            else -> AnimationState.STOPPED
+        }
+    }
+
+    /**
+     * Starts the animation with the given name.
+     *
+     * This method must be called from the main thread.
+     * https://developer.android.com/guide/components/processes-and-threads
+     *
+     * @param animationName The name of the animation to start. If null, the first animation found
+     *   in the glTF will be played.
+     * @param loop Whether the animation should loop.
+     */
+    @MainThread
+    @JvmOverloads
+    public fun startAnimation(loop: Boolean, animationName: String? = null) {
+        rtEntity.startAnimation(loop, animationName)
+    }
+
+    /**
+     * Stops the animation of the glTF entity.
+     *
+     * This method must be called from the main thread.
+     * https://developer.android.com/guide/components/processes-and-threads
+     */
+    @MainThread
+    public fun stopAnimation() {
+        rtEntity.stopAnimation()
+    }
+
+    /**
+     * Sets a material override for a mesh in the glTF model.
+     *
+     * This method must be called from the main thread.
+     * https://developer.android.com/guide/components/processes-and-threads
+     *
+     * If the material is not created or the mesh name is not found in the glTF model, this method
+     * will throw an IllegalStateException.
+     *
+     * @param material The material to use for the mesh.
+     * @param meshName The name of the mesh to use the material for.
+     */
+    @MainThread
+    public fun setMaterialOverride(material: MaterialResource, meshName: String) {
+        rtEntity.setMaterialOverride(material, meshName)
+    }
+}
+
+/**
+ * SurfaceEntity is a concrete implementation of Entity that hosts a StereoSurface Canvas. The
+ * entity creates and owns an Android Surface into which the application can render stereo image
+ * content. This Surface is then texture mapped to the canvas, and if a stereoscopic StereoMode is
+ * specified, then the User will see left and right eye content mapped to the appropriate display.
+ *
+ * Note that it is not currently possible to synchronize CanvasShape and StereoMode changes with
+ * application rendering or video decoding. Applications are advised to carefully hide this entity
+ * around transitions to manage glitchiness.
+ *
+ * @property canvasShape The [CanvasShape] which describes the mesh to which the Surface is mapped.
+ * @property stereoMode The [StereoMode] which describes how parts of the surface are displayed to
+ *   the user's eyes.
+ * @property dimensions The dimensions of the canvas in the local spatial coordinate system of the
+ *   entity.
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public class SurfaceEntity
+private constructor(
+    rtEntity: JxrPlatformAdapter.SurfaceEntity,
+    entityManager: EntityManager,
+    canvasShape: CanvasShape,
+) : BaseEntity<JxrPlatformAdapter.SurfaceEntity>(rtEntity, entityManager) {
+
+    /** Represents the shape of the Canvas that backs a SurfaceEntity. */
+    public abstract class CanvasShape private constructor() {
+        public open val dimensions: Dimensions = Dimensions(0.0f, 0.0f, 0.0f)
+
+        // A Quad-shaped canvas. Width and height are represented in the local spatial coordinate
+        // system of the entity. (0,0,0) is the center of the canvas.
+        public class Quad(public val width: Float, public val height: Float) : CanvasShape() {
+            override val dimensions: Dimensions
+                get() = Dimensions(width, height, 0.0f)
+        }
+
+        // An inwards-facing sphere-shaped canvas, centered at (0,0,0) in the local coordinate
+        // space.
+        // This is intended to be used by setting the entity's pose to the user's head pose.
+        // Radius is represented in the local spatial coordinate system of the entity.
+        // The center of the Surface will be mapped to (0, 0, -radius) in the local coordinate
+        // space,
+        // and UV's are applied from positive X to negative X in an equirectangular projection.
+        public class Vr360Sphere(public val radius: Float) : CanvasShape() {
+            override val dimensions: Dimensions
+                get() = Dimensions(radius * 2, radius * 2, radius * 2)
+        }
+
+        // An inwards-facing hemisphere-shaped canvas, where (0,0,0) is the center of the base of
+        // the
+        // hemisphere. Radius is represented in the local spatial coordinate system of the entity.
+        // This is intended to be used by setting the entity's pose to the user's head pose.
+        // The center of the Surface will be mapped to (0, 0, -radius) in the local coordinate
+        // space,
+        // and UV's are applied from positive X to negative X in an equirectangular projection.
+        public class Vr180Hemisphere(public val radius: Float) : CanvasShape() {
+            override val dimensions: Dimensions
+                get() = Dimensions(radius * 2, radius * 2, radius)
+        }
+    }
+
+    /**
+     * Specifies how the surface content will be routed for stereo viewing. Applications must render
+     * into the surface in accordance with what is specified here in order for the compositor to
+     * correctly produce a stereoscopic view to the user.
+     *
+     * Values here match values from androidx.media3.common.C.StereoMode in
+     * //third_party/java/android_libs/media:common
+     */
+    @IntDef(StereoMode.MONO, StereoMode.TOP_BOTTOM, StereoMode.SIDE_BY_SIDE)
+    @Retention(AnnotationRetention.SOURCE)
+    internal annotation class StereoModeValue
+
+    public object StereoMode {
+        // Each eye will see the entire surface (no separation)
+        public const val MONO: Int = 0
+        // The [bottom, top] halves of the surface will map to [left, right] eyes
+        public const val TOP_BOTTOM: Int = 1
+        // The [left, right] halves of the surface will map to [left, right] eyes
+        public const val SIDE_BY_SIDE: Int = 2
+    }
+
+    public companion object {
+        private fun getRtStereoMode(stereoMode: Int): Int {
+            return when (stereoMode) {
+                StereoMode.MONO -> JxrPlatformAdapter.SurfaceEntity.StereoMode.MONO
+                StereoMode.TOP_BOTTOM -> JxrPlatformAdapter.SurfaceEntity.StereoMode.TOP_BOTTOM
+                else -> JxrPlatformAdapter.SurfaceEntity.StereoMode.SIDE_BY_SIDE
+            }
+        }
+
+        /**
+         * Factory method for SurfaceEntity.
+         *
+         * @param adapter JxrPlatformAdapter to use.
+         * @param entityManager A SceneCore EntityManager
+         * @param stereoMode An [Int] which defines how surface subregions map to eyes
+         * @param pose Pose for this StereoSurface entity, relative to its parent.
+         * @param canvasShape The [CanvasShape] which describes the spatialized shape of the canvas.
+         */
+        internal fun create(
+            adapter: JxrPlatformAdapter,
+            entityManager: EntityManager,
+            stereoMode: Int = StereoMode.SIDE_BY_SIDE,
+            pose: Pose = Pose.Identity,
+            canvasShape: CanvasShape = CanvasShape.Quad(1.0f, 1.0f),
+        ): SurfaceEntity {
+            val rtCanvasShape =
+                when (canvasShape) {
+                    is CanvasShape.Quad ->
+                        JxrPlatformAdapter.SurfaceEntity.CanvasShape.Quad(
+                            canvasShape.width,
+                            canvasShape.height
+                        )
+                    is CanvasShape.Vr360Sphere ->
+                        JxrPlatformAdapter.SurfaceEntity.CanvasShape.Vr360Sphere(canvasShape.radius)
+                    is CanvasShape.Vr180Hemisphere ->
+                        JxrPlatformAdapter.SurfaceEntity.CanvasShape.Vr180Hemisphere(
+                            canvasShape.radius
+                        )
+                    else -> throw IllegalArgumentException("Unsupported canvas shape: $canvasShape")
+                }
+            return SurfaceEntity(
+                adapter.createSurfaceEntity(
+                    getRtStereoMode(stereoMode),
+                    rtCanvasShape,
+                    pose,
+                    adapter.activitySpaceRootImpl,
+                ),
+                entityManager,
+                canvasShape,
+            )
+        }
+
+        /**
+         * Public factory function for a SurfaceEntity.
+         *
+         * This method must be called from the main thread.
+         * https://developer.android.com/guide/components/processes-and-threads
+         *
+         * @param session Session to create the SurfaceEntity in.
+         * @param stereoMode Stereo mode for the surface.
+         * @param pose Pose of this entity relative to its parent, default value is Identity.
+         * @param canvasShape The [CanvasShape] which describes the spatialized shape of the canvas.
+         * @return a SurfaceEntity instance
+         */
+        @MainThread
+        @JvmOverloads
+        @JvmStatic
+        public fun create(
+            session: Session,
+            stereoMode: Int = SurfaceEntity.StereoMode.SIDE_BY_SIDE,
+            pose: Pose = Pose.Identity,
+            canvasShape: CanvasShape = CanvasShape.Quad(1.0f, 1.0f),
+        ): SurfaceEntity =
+            SurfaceEntity.create(
+                session.platformAdapter,
+                session.entityManager,
+                stereoMode,
+                pose,
+                canvasShape,
+            )
+    }
+
+    /**
+     * Controls how the surface content will be routed for stereo viewing. Applications must render
+     * into the surface in accordance with what is specified here in order for the compositor to
+     * correctly produce a stereoscopic view to the user.
+     *
+     * Values must be one of the values from [StereoMode].
+     */
+    public var stereoMode: Int
+        get() = rtEntity.stereoMode
+        @MainThread
+        set(value) {
+            rtEntity.stereoMode = getRtStereoMode(value)
+        }
+
+    /**
+     * Returns the dimensions of the Entity.
+     *
+     * This is the size of the canvas in the local spatial coordinate system of the entity. This
+     * field cannot be directly set - to update the dimensions of the canvas, update the value of
+     * [canvasShape].
+     */
+    public val dimensions: Dimensions
+        get() = rtEntity.dimensions.toDimensions()
+
+    /**
+     * The shape of the canvas that backs the Entity.
+     *
+     * Updating this value will alter the dimensions of the Entity.
+     */
+    public var canvasShape: CanvasShape = canvasShape
+        @MainThread
+        set(value) {
+            val rtCanvasShape =
+                when (value) {
+                    is CanvasShape.Quad ->
+                        JxrPlatformAdapter.SurfaceEntity.CanvasShape.Quad(value.width, value.height)
+                    is CanvasShape.Vr360Sphere ->
+                        JxrPlatformAdapter.SurfaceEntity.CanvasShape.Vr360Sphere(value.radius)
+                    is CanvasShape.Vr180Hemisphere ->
+                        JxrPlatformAdapter.SurfaceEntity.CanvasShape.Vr180Hemisphere(value.radius)
+                    else -> throw IllegalArgumentException("Unsupported canvas shape: $value")
+                }
+            rtEntity.setCanvasShape(rtCanvasShape)
+            field = value
+        }
+
+    /**
+     * Returns a surface into which the application can render stereo image content.
+     *
+     * This method must be called from the main thread.
+     * https://developer.android.com/guide/components/processes-and-threads
+     */
+    @MainThread
+    public fun getSurface(): Surface {
+        return rtEntity.surface
+    }
+}
+
+/** PanelEntity creates a spatial panel in Android XR. */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public open class PanelEntity
+internal constructor(
+    rtEntity: JxrPlatformAdapter.PanelEntity,
+    entityManager: EntityManager,
+    // TODO(ricknels): move isMainPanelEntity check to JxrPlatformAdapter.
+    public val isMainPanelEntity: Boolean = false,
+) : BasePanelEntity<JxrPlatformAdapter.PanelEntity>(rtEntity, entityManager) {
+
+    public companion object {
+        /**
+         * Factory method for PanelEntity.
+         *
+         * @param adapter JxrPlatformAdapter to use.
+         * @param view View to insert in this panel.
+         * @param surfaceDimensionsPx Dimensions for the underlying surface for the given view.
+         * @param dimensions The size of this spatial Panel Entity in Meters.
+         * @param name Name of this panel.
+         * @param context Activity which created this panel.
+         * @param pose Pose for this panel, relative to its parent.
+         */
+        internal fun create(
+            adapter: JxrPlatformAdapter,
+            entityManager: EntityManager,
+            view: View,
+            surfaceDimensionsPx: Dimensions,
+            dimensions: Dimensions,
+            name: String,
+            context: Context,
+            pose: Pose = Pose.Identity,
+        ): PanelEntity =
+            PanelEntity(
+                adapter.createPanelEntity(
+                    pose,
+                    view,
+                    PixelDimensions(
+                            surfaceDimensionsPx.width.toInt(),
+                            surfaceDimensionsPx.height.toInt()
+                        )
+                        .toRtPixelDimensions(),
+                    dimensions.toRtDimensions(),
+                    name,
+                    context,
+                    adapter.activitySpaceRootImpl,
+                ),
+                entityManager,
+            )
+
+        // TODO(b/352629832): Update surfaceDimensionsPx to be a PixelDimensions
+        /**
+         * Public factory function for a spatialized PanelEntity.
+         *
+         * @param session Session to create the PanelEntity in.
+         * @param view View to embed in this panel entity.
+         * @param surfaceDimensionsPx Dimensions for the underlying surface for the given view.
+         * @param dimensions Dimensions for the panel in meters.
+         * @param name Name of the panel.
+         * @param pose Pose of this entity relative to its parent, default value is Identity.
+         * @return a PanelEntity instance.
+         */
+        @JvmOverloads
+        @JvmStatic
+        public fun create(
+            session: Session,
+            view: View,
+            surfaceDimensionsPx: Dimensions,
+            dimensions: Dimensions,
+            name: String,
+            pose: Pose = Pose.Identity,
+        ): PanelEntity =
+            PanelEntity.create(
+                session.platformAdapter,
+                session.entityManager,
+                view,
+                surfaceDimensionsPx,
+                dimensions,
+                name,
+                session.activity,
+                pose,
+            )
+
+        /** Returns the PanelEntity backed by the main window for the Activity. */
+        internal fun createMainPanelEntity(
+            adapter: JxrPlatformAdapter,
+            entityManager: EntityManager,
+        ): PanelEntity =
+            PanelEntity(adapter.mainPanelEntity, entityManager, isMainPanelEntity = true)
+    }
+}
+
+/**
+ * ActivityPanelEntity creates a spatial panel for embedding an Activity in Android XR. Users can
+ * either use an intent to launch an activity in the given panel or provide an instance of activity
+ * to move into this panel. Calling dispose() on this entity will destroy the underlying activity.
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public class ActivityPanelEntity
+private constructor(
+    private val rtActivityPanelEntity: JxrPlatformAdapter.ActivityPanelEntity,
+    entityManager: EntityManager,
+) : PanelEntity(rtActivityPanelEntity, entityManager) {
+
+    /**
+     * Launches an activity in the given panel. Subsequent calls to this method will replace the
+     * already existing activity in the panel with the new one. If the intent fails to launch the
+     * activity, the panel will not be visible. Note this will not update the dimensions of the
+     * surface underlying the panel. The Activity will be letterboxed as required to fit the size of
+     * the panel. The underlying surface can be resized by calling setPixelDimensions().
+     *
+     * @param intent Intent to launch the activity.
+     * @param bundle Bundle to pass to the activity, can be null.
+     */
+    @JvmOverloads
+    public fun launchActivity(intent: Intent, bundle: Bundle? = null) {
+        rtActivityPanelEntity.launchActivity(intent, bundle)
+    }
+
+    /**
+     * Moves the given activity into this panel. Note this will not update the dimensions of the
+     * surface underlying the panel. The Activity will be letterboxed as required to fit the size of
+     * the panel. The underlying surface can be resized by calling setPixelDimensions().
+     *
+     * @param activity Activity to move into this panel.
+     */
+    public fun moveActivity(activity: Activity) {
+        rtActivityPanelEntity.moveActivity(activity)
+    }
+
+    public companion object {
+        /**
+         * Factory method for ActivityPanelEntity.
+         *
+         * @param adapter JxrPlatformAdapter to use.
+         * @param windowBoundsPx Bounds for the underlying surface for the given view.
+         * @param name Name of this panel.
+         * @param hostActivity Activity which created this panel.
+         * @param pose Pose for this panel, relative to its parent.
+         */
+        internal fun create(
+            adapter: JxrPlatformAdapter,
+            entityManager: EntityManager,
+            windowBoundsPx: PixelDimensions,
+            name: String,
+            hostActivity: Activity,
+            pose: Pose = Pose.Identity,
+        ): ActivityPanelEntity =
+            ActivityPanelEntity(
+                adapter.createActivityPanelEntity(
+                    pose,
+                    windowBoundsPx.toRtPixelDimensions(),
+                    name,
+                    hostActivity,
+                    adapter.activitySpaceRootImpl,
+                ),
+                entityManager,
+            )
+
+        // TODO(b/352629832): Update windowBoundsPx to be a PixelDimensions
+        /**
+         * Public factory function for a spatial ActivityPanelEntity.
+         *
+         * @param session Session to create the ActivityPanelEntity in.
+         * @param windowBoundsPx Bounds for the panel window in pixels.
+         * @param name Name of the panel.
+         * @param pose Pose of this entity relative to its parent, default value is Identity.
+         * @return an ActivityPanelEntity instance.
+         */
+        @JvmOverloads
+        @JvmStatic
+        public fun create(
+            session: Session,
+            windowBoundsPx: Rect,
+            name: String,
+            pose: Pose = Pose.Identity,
+        ): ActivityPanelEntity =
+            ActivityPanelEntity.create(
+                session.platformAdapter,
+                session.entityManager,
+                PixelDimensions(windowBoundsPx.width(), windowBoundsPx.height()),
+                name,
+                session.activity,
+                pose,
+            )
+    }
+}
+
+/** TODO - Convert AnchorEntity into a Space (This will remove setParent) */
+
+/**
+ * An AnchorEntity is created to track a Pose relative to some position or surface in the "Real
+ * World." Children of this Entity will remain positioned relative to that location in the real
+ * world, for the purposes of creating Augmented Reality experiences.
+ *
+ * Note that Anchors are only relative to the "real world", and not virtual environments. Also,
+ * calling setParent() on an AnchorEntity has no effect, as the parenting of an Anchor is controlled
+ * by the system.
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public class AnchorEntity
+private constructor(rtEntity: JxrPlatformAdapter.AnchorEntity, entityManager: EntityManager) :
+    BaseEntity<JxrPlatformAdapter.AnchorEntity>(rtEntity, entityManager) {
+    private val state = AtomicReference(rtEntity.state.fromRtState())
+    private val persistState = AtomicReference(rtEntity.persistState.fromRtPersistState())
+
+    private var onStateChangedListener: OnStateChangedListener? = null
+
+    /** Specifies the current tracking state of the Anchor. */
+    @Target(AnnotationTarget.TYPE)
+    @IntDef(State.ANCHORED, State.UNANCHORED, State.TIMEDOUT, State.ERROR)
+    @Retention(AnnotationRetention.SOURCE)
+    internal annotation class StateValue
+
+    public object State {
+        /**
+         * The ANCHORED state means that this Anchor is being actively tracked and updated by the
+         * perception stack. The application should expect children to maintain their relative
+         * positioning to the system's best understanding of a pose in the real world.
+         */
+        public const val ANCHORED: Int = 0
+        /**
+         * An UNANCHORED state could mean that the perception stack hasn't found an anchor for this
+         * Space, that it has lost tracking.
+         */
+        public const val UNANCHORED: Int = 1
+        /**
+         * The AnchorEntity timed out while searching for an underlying anchor. This it is not
+         * possible to recover the AnchorEntity.
+         */
+        public const val TIMEDOUT: Int = 2
+        /**
+         * The ERROR state means that something has gone wrong and this AnchorEntity is invalid
+         * without the possibility of recovery.
+         */
+        public const val ERROR: Int = 3
+        /**
+         * The PERMISSIONS_NOT_GRANTED state means that the user has not granted the necessary
+         * permissions i.e. SCENE_UNDERSTANDING to create this AnchorEntity.
+         */
+        public const val PERMISSIONS_NOT_GRANTED: Int = 4
+    }
+
+    /** Specifies the current persist state of the Anchor. */
+    public enum class PersistState {
+        /** The anchor hasn't been requested to persist. */
+        PERSIST_NOT_REQUESTED,
+        /** The anchor is requested to persist but hasn't been persisted yet. */
+        PERSIST_PENDING,
+        /** The anchor is persisted successfully. */
+        PERSISTED,
+    }
+
+    /** Returns the current tracking state for this AnchorEntity. */
+    public fun getState(): @StateValue Int = state.get()
+
+    /** Registers a listener callback to be issued when an anchor's state changes. */
+    @Suppress("ExecutorRegistration")
+    public fun setOnStateChangedListener(onStateChangedListener: OnStateChangedListener?) {
+        this.onStateChangedListener = onStateChangedListener
+        if (state.get() == State.PERMISSIONS_NOT_GRANTED) {
+            onStateChangedListener?.onStateChanged(State.PERMISSIONS_NOT_GRANTED)
+        }
+    }
+
+    /** Updates the current state. */
+    private fun setState(newState: @StateValue Int) {
+        state.set(newState)
+        onStateChangedListener?.onStateChanged(newState)
+    }
+
+    /** Gets the current PersistState. */
+    public fun getPersistState(): PersistState = persistState.get()
+
+    /**
+     * Requests to persist the anchor. If the anchor's State is not ANCHORED, no request will be
+     * sent and null is returned. If the request is sent successfully, returns an UUID of the anchor
+     * immediately; otherwise returns null. After this call, client should use getPersistState() to
+     * check the PersistState of the anchor. If the anchor's PersistState becomes PERSISTED before
+     * the app is closed the anchor can be recreated in a new session by calling
+     * Session.createPersistedAnchorEntity(uuid). If the PersistState doesn't become PERSISTED
+     * before the app is closed, the recreation will fail.
+     */
+    public fun persist(): UUID? {
+        if (state.get() != State.ANCHORED) {
+            Log.e(TAG, "Cannot persist an anchor that is not in the ANCHORED state.")
+            return null
+        }
+        val uuid = rtEntity.persist()
+        if (uuid == null) {
+            Log.e(TAG, "Failed to get a UUID for the anchor.")
+            return null
+        }
+
+        rtEntity.registerPersistStateChangeListener { newRtPersistState ->
+            persistState.set(newRtPersistState.fromRtPersistState())
+        }
+        return uuid
+    }
+
+    /**
+     * Loads the ARCore for XR Anchor using a Jetpack XR Runtime session.
+     *
+     * @param session the Jetpack XR Runtime session to load the Anchor from.
+     * @return the ARCore for XR Anchor corresponding to the native pointer.
+     */
+    // TODO(b/373711152) : Remove this method once the ARCore for XR API migration is done.
+    public fun getAnchor(session: PerceptionSession): Anchor {
+        return Anchor.loadFromNativePointer(session, rtEntity.nativePointer())
+    }
+
+    public companion object {
+        private const val TAG = "AnchorEntity"
+
+        /**
+         * Factory method for AnchorEntity.
+         *
+         * @param adapter JxrPlatformAdapter to use.
+         * @param bounds Bounds for this Anchor Entity.
+         * @param planeType Orientation for the plane to which this Anchor should attach.
+         * @param planeSemantic Semantics for the plane to which this Anchor should attach.
+         * @param timeout Maximum time to search for the anchor, if a suitable plane is not found
+         *   within the timeout time the AnchorEntity state will be set to TIMED_OUT.
+         */
+        internal fun create(
+            adapter: JxrPlatformAdapter,
+            entityManager: EntityManager,
+            bounds: Dimensions,
+            planeType: @PlaneTypeValue Int,
+            planeSemantic: @PlaneSemanticValue Int,
+            timeout: Duration = Duration.ZERO,
+        ): AnchorEntity {
+            val rtAnchorEntity =
+                adapter.createAnchorEntity(
+                    bounds.toRtDimensions(),
+                    planeType.toRtPlaneType(),
+                    planeSemantic.toRtPlaneSemantic(),
+                    timeout,
+                )
+            return create(rtAnchorEntity, entityManager)
+        }
+
+        /**
+         * Factory method for AnchorEntity.
+         *
+         * @param anchor Anchor to create an AnchorEntity for.
+         */
+        internal fun create(
+            adapter: JxrPlatformAdapter,
+            entityManager: EntityManager,
+            anchor: Anchor,
+        ): AnchorEntity {
+            val rtAnchorEntity = adapter.createAnchorEntity(anchor)
+            return create(rtAnchorEntity, entityManager)
+        }
+
+        /**
+         * Factory method for AnchorEntity.
+         *
+         * @param rtAnchorEntity Runtime AnchorEntity instance.
+         */
+        internal fun create(
+            rtAnchorEntity: JxrPlatformAdapter.AnchorEntity,
+            entityManager: EntityManager,
+        ): AnchorEntity {
+            val anchorEntity = AnchorEntity(rtAnchorEntity, entityManager)
+            rtAnchorEntity.setOnStateChangedListener { newRtState ->
+                when (newRtState) {
+                    JxrPlatformAdapter.AnchorEntity.State.UNANCHORED ->
+                        anchorEntity.setState(State.UNANCHORED)
+                    JxrPlatformAdapter.AnchorEntity.State.ANCHORED ->
+                        anchorEntity.setState(State.ANCHORED)
+                    JxrPlatformAdapter.AnchorEntity.State.TIMED_OUT ->
+                        anchorEntity.setState(State.TIMEDOUT)
+                    JxrPlatformAdapter.AnchorEntity.State.ERROR ->
+                        anchorEntity.setState(State.ERROR)
+                    JxrPlatformAdapter.AnchorEntity.State.PERMISSIONS_NOT_GRANTED ->
+                        anchorEntity.setState(State.PERMISSIONS_NOT_GRANTED)
+                }
+            }
+            return anchorEntity
+        }
+
+        /**
+         * Factory method for AnchorEntity.
+         *
+         * @param adapter JxrPlatformAdapter to use.
+         * @param uuid UUID of the persisted Anchor Entity to create.
+         * @param timeout Maximum time to search for the anchor, if a persisted anchor isn't located
+         *   within the timeout time the AnchorEntity state will be set to TIMED_OUT.
+         */
+        internal fun create(
+            adapter: JxrPlatformAdapter,
+            entityManager: EntityManager,
+            uuid: UUID,
+            timeout: Duration = Duration.ZERO,
+        ): AnchorEntity {
+            val rtAnchorEntity = adapter.createPersistedAnchorEntity(uuid, timeout)
+            val anchorEntity = AnchorEntity(rtAnchorEntity, entityManager)
+            rtAnchorEntity.setOnStateChangedListener { newRtState ->
+                when (newRtState) {
+                    JxrPlatformAdapter.AnchorEntity.State.UNANCHORED ->
+                        anchorEntity.setState(State.UNANCHORED)
+                    JxrPlatformAdapter.AnchorEntity.State.ANCHORED ->
+                        anchorEntity.setState(State.ANCHORED)
+                    JxrPlatformAdapter.AnchorEntity.State.TIMED_OUT ->
+                        anchorEntity.setState(State.TIMEDOUT)
+                    JxrPlatformAdapter.AnchorEntity.State.ERROR ->
+                        anchorEntity.setState(State.ERROR)
+                    JxrPlatformAdapter.AnchorEntity.State.PERMISSIONS_NOT_GRANTED ->
+                        anchorEntity.setState(State.PERMISSIONS_NOT_GRANTED)
+                }
+            }
+            return anchorEntity
+        }
+
+        /**
+         * Public factory function for an AnchorEntity which searches for a location to create an
+         * Anchor among the tracked planes available to the perception system.
+         *
+         * Note that this function will fail if the application has not been granted the
+         * "android.permission.SCENE_UNDERSTANDING" permission. Consider using PermissionHelper to
+         * help request permission from the User.
+         *
+         * @param session Session to create the AnchorEntity in.
+         * @param bounds Bounds for this AnchorEntity.
+         * @param planeType Orientation of plane to which this Anchor should attach.
+         * @param planeSemantic Semantics of the plane to which this Anchor should attach.
+         * @param timeout The amount of time as a [Duration] to search for the a suitable plane to
+         *   attach to. If a plane is not found within the timeout, the returned AnchorEntity state
+         *   will be set to AnchorEntity.State.TIMEDOUT. It may take longer than the timeout period
+         *   before the anchor state is updated. If the timeout duration is zero it will search for
+         *   the anchor indefinitely.
+         */
+        @JvmStatic
+        @JvmOverloads
+        public fun create(
+            session: Session,
+            bounds: Dimensions,
+            planeType: @PlaneTypeValue Int,
+            planeSemantic: @PlaneSemanticValue Int,
+            timeout: Duration = Duration.ZERO,
+        ): AnchorEntity {
+            return AnchorEntity.create(
+                session.platformAdapter,
+                session.entityManager,
+                bounds,
+                planeType,
+                planeSemantic,
+                timeout,
+            )
+        }
+
+        /**
+         * Public factory function for an AnchorEntity which uses an Anchor from ARCore for XR.
+         *
+         * @param session Session to create the AnchorEntity in.
+         * @param anchor The PerceptionAnchor to use for this AnchorEntity.
+         */
+        @JvmStatic
+        public fun create(session: Session, anchor: Anchor): AnchorEntity {
+            return AnchorEntity.create(session.platformAdapter, session.entityManager, anchor)
+        }
+    }
+
+    /**
+     * Extension function that converts [JxrPlatformAdapter.AnchorEntity.State] to
+     * [AnchorEntity.State].
+     */
+    private fun JxrPlatformAdapter.AnchorEntity.State.fromRtState() =
+        when (this) {
+            JxrPlatformAdapter.AnchorEntity.State.UNANCHORED -> State.UNANCHORED
+            JxrPlatformAdapter.AnchorEntity.State.ANCHORED -> State.ANCHORED
+            JxrPlatformAdapter.AnchorEntity.State.TIMED_OUT -> State.TIMEDOUT
+            JxrPlatformAdapter.AnchorEntity.State.ERROR -> State.ERROR
+            JxrPlatformAdapter.AnchorEntity.State.PERMISSIONS_NOT_GRANTED ->
+                State.PERMISSIONS_NOT_GRANTED
+        }
+
+    /**
+     * Extension function that converts [JxrPlatformAdapter.AnchorEntity.PersistState] to
+     * [AnchorEntity.PersistState].
+     */
+    private fun JxrPlatformAdapter.AnchorEntity.PersistState.fromRtPersistState() =
+        when (this) {
+            JxrPlatformAdapter.AnchorEntity.PersistState.PERSIST_NOT_REQUESTED ->
+                PersistState.PERSIST_NOT_REQUESTED
+            JxrPlatformAdapter.AnchorEntity.PersistState.PERSIST_PENDING ->
+                PersistState.PERSIST_PENDING
+            JxrPlatformAdapter.AnchorEntity.PersistState.PERSISTED -> PersistState.PERSISTED
+        }
+
+    /**
+     * Registers a listener to be called when the Anchor moves relative to its underlying space.
+     *
+     * <p> The callback is triggered by any anchor movements such as those made by the underlying
+     * perception stack to maintain the anchor's position relative to the real world. Any cached
+     * data relative to the activity space or any other "space" should be updated when this callback
+     * is triggered.
+     *
+     * @param listener The listener to register if non-null, else stops listening if null.
+     * @param executor The executor to run the listener on. Defaults to SceneCore executor if null.
+     */
+    @JvmOverloads
+    @Suppress("ExecutorRegistration")
+    public fun setOnSpaceUpdatedListener(
+        listener: OnSpaceUpdatedListener?,
+        executor: Executor? = null,
+    ) {
+        rtEntity.setOnSpaceUpdatedListener(listener?.let { { it.onSpaceUpdated() } }, executor)
+    }
+}
+
+// TODO: b/370538244 - remove with deprecated spatial state callbacks
+@Deprecated(message = "Use addBoundsChangedListener(Consumer<Dimensions>)")
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public fun interface OnBoundsChangeListener {
+    public fun onBoundsChanged(bounds: Dimensions) // Dimensions are in meters.
+}
+
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public fun interface OnStateChangedListener {
+    public fun onStateChanged(newState: @AnchorEntity.StateValue Int)
+}
+
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public fun interface OnSpaceUpdatedListener {
     public fun onSpaceUpdated()
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ExrImage.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ExrImage.kt
index d04e91e..26c975b 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ExrImage.kt
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/ExrImage.kt
@@ -16,11 +16,8 @@
 
 package androidx.xr.scenecore
 
-import androidx.annotation.MainThread
 import androidx.annotation.RestrictTo
-import androidx.concurrent.futures.ResolvableFuture
 import androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource as RtExrImage
-import com.google.common.util.concurrent.ListenableFuture
 
 /** Interface for image formats in SceneCore. */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface Image
@@ -32,35 +29,7 @@
 // TODO(b/319269278): Make this and GltfModel derive from a common Resource base class which has
 //                    async helpers.
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public class ExrImage
-internal constructor(internal val image: RtExrImage, internal val session: Session? = null) :
-    Image {
-
-    /**
-     * Returns the reflection texture from a preprocessed EXR image.
-     *
-     * This method must be called from the main thread.
-     * https://developer.android.com/guide/components/processes-and-threads
-     *
-     * @return a CubeMapTexture.
-     * @throws IllegalStateException if the reflection texture couldn't be retrieved or if the EXR
-     *   image was not preprocessed.
-     */
-    @MainThread
-    public fun getReflectionTexture(): CubeMapTexture {
-        if (session == null) {
-            throw IllegalStateException(
-                "Can only retrieve reflection texture from preprocessed EXR images."
-            )
-        }
-        val reflectionTexture = session.platformAdapter.getReflectionTextureFromIbl(image)
-        if (reflectionTexture == null) {
-            throw IllegalStateException(
-                "Failed to retrieve reflection texture from the preprocessed EXR image."
-            )
-        }
-        return CubeMapTexture(reflectionTexture, session)
-    }
+public class ExrImage internal constructor(public val image: RtExrImage) : Image {
 
     public companion object {
         internal fun create(runtime: JxrPlatformAdapter, name: String): ExrImage {
@@ -69,35 +38,6 @@
             return ExrImage(exrImageFuture!!.get())
         }
 
-        // ResolvableFuture is marked as RestrictTo(LIBRARY_GROUP_PREFIX), which is intended for
-        // classes
-        // within AndroidX. We're in the process of migrating to AndroidX. Without suppressing this
-        // warning, however, we get a build error - go/bugpattern/RestrictTo.
-        @SuppressWarnings("RestrictTo")
-        internal fun createAsync(
-            platformAdapter: JxrPlatformAdapter,
-            name: String,
-            session: Session,
-        ): ListenableFuture<ExrImage> {
-            return createExrImageFuture(
-                platformAdapter.loadExrImageByAssetNameSplitEngine(name)!!,
-                session,
-            )
-        }
-
-        @SuppressWarnings("RestrictTo")
-        internal fun createAsync(
-            platformAdapter: JxrPlatformAdapter,
-            byteArray: ByteArray,
-            assetKey: String,
-            session: Session,
-        ): ListenableFuture<ExrImage> {
-            return createExrImageFuture(
-                platformAdapter.loadExrImageByByteArraySplitEngine(byteArray, assetKey)!!,
-                session,
-            )
-        }
-
         /**
          * Public factory function for an EXRImage, where the EXR is loaded from a local file.
          *
@@ -108,69 +48,6 @@
         @JvmStatic
         public fun create(session: Session, name: String): ExrImage =
             ExrImage.create(session.platformAdapter, name)
-
-        /**
-         * Public factory function for a preprocessed EXRImage, where the preprocessed EXRImage is
-         * asynchronously loaded.
-         *
-         * This method must be called from the main thread.
-         * https://developer.android.com/guide/components/processes-and-threads
-         *
-         * @param session The [Session] to use for loading the asset.
-         * @param name The URL or asset-relative path of a the preprocessed EXR image to be loaded
-         * @return a ListenableFuture<ExrImage>. Listeners will be called on the main thread if
-         *   Runnable::run is supplied.
-         */
-        @MainThread
-        @JvmStatic
-        public fun createFromPackage(session: Session, name: String): ListenableFuture<ExrImage> {
-            return ExrImage.createAsync(session.platformAdapter, name, session)
-        }
-
-        /**
-         * Public factory function for a preprocessed EXRImage, where the preprocessed EXRImage is
-         * asynchronously loaded.
-         *
-         * This method must be called from the main thread.
-         * https://developer.android.com/guide/components/processes-and-threads
-         *
-         * @param session The [Session] to use for loading the asset.
-         * @param assetData The byte array of the preprocessed EXR image to be loaded.
-         * @param assetKey The key of the preprocessed EXR image to be loaded. This is used to
-         *   identify the asset in the [SceneCore] cache.
-         * @return a ListenableFuture<ExrImage>. Listeners will be called on the main thread if
-         *   Runnable::run is supplied.
-         */
-        @MainThread
-        @JvmStatic
-        public fun createFromPackage(
-            session: Session,
-            assetData: ByteArray,
-            assetKey: String,
-        ): ListenableFuture<ExrImage> {
-            return ExrImage.createAsync(session.platformAdapter, assetData, assetKey, session)
-        }
-
-        private fun createExrImageFuture(
-            exrImageResourceFuture: ListenableFuture<RtExrImage>,
-            session: Session,
-        ): ListenableFuture<ExrImage> {
-            val exrImageFuture = ResolvableFuture.create<ExrImage>()
-
-            exrImageResourceFuture.addListener(
-                {
-                    try {
-                        exrImageFuture.set(ExrImage(exrImageResourceFuture.get(), session))
-                    } catch (e: Exception) {
-                        if (e is InterruptedException) Thread.currentThread().interrupt()
-                        exrImageFuture.setException(e)
-                    }
-                },
-                Runnable::run,
-            )
-
-            return exrImageFuture
-        }
     }
 
     override fun equals(other: Any?): Boolean {
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/GltfModelEntity.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/GltfModelEntity.kt
deleted file mode 100644
index 515562a..0000000
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/GltfModelEntity.kt
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.scenecore
-
-import androidx.annotation.IntDef
-import androidx.annotation.MainThread
-import androidx.annotation.RestrictTo
-import androidx.xr.runtime.math.Pose
-
-/**
- * GltfModelEntity is a concrete implementation of Entity that hosts a glTF model.
- *
- * Note: The size property of this Entity is always reported as {0, 0, 0}, regardless of the actual
- * size of the model.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public class GltfModelEntity
-private constructor(rtEntity: JxrPlatformAdapter.GltfEntity, entityManager: EntityManager) :
-    BaseEntity<JxrPlatformAdapter.GltfEntity>(rtEntity, entityManager) {
-    // TODO: b/362368652 - Add an OnAnimationEvent() Listener interface
-
-    /** Specifies the current animation state of the GltfModelEntity. */
-    @IntDef(AnimationState.PLAYING, AnimationState.STOPPED)
-    @Retention(AnnotationRetention.SOURCE)
-    internal annotation class AnimationStateValue
-
-    public object AnimationState {
-        public const val PLAYING: Int = 0
-        public const val STOPPED: Int = 1
-    }
-
-    public companion object {
-        /**
-         * Factory method for GltfModelEntity.
-         *
-         * @param adapter Jetpack XR platform adapter.
-         * @param model [GltfModel] which this entity will display.
-         * @param pose Pose for this [GltfModelEntity], relative to its parent.
-         */
-        internal fun create(
-            adapter: JxrPlatformAdapter,
-            entityManager: EntityManager,
-            model: GltfModel,
-            pose: Pose = Pose.Identity,
-        ): GltfModelEntity =
-            GltfModelEntity(
-                adapter.createGltfEntity(pose, model.model, adapter.activitySpaceRootImpl),
-                entityManager,
-            )
-
-        /**
-         * Public factory function for a [GltfModelEntity].
-         *
-         * This method must be called from the main thread.
-         * https://developer.android.com/guide/components/processes-and-threads
-         *
-         * @param session Session to create the [GltfModel] in.
-         * @param model The [GltfModel] this Entity is referencing.
-         * @param pose The initial pose of the entity.
-         * @return a GltfModelEntity instance
-         */
-        @MainThread
-        @JvmStatic
-        @JvmOverloads
-        public fun create(
-            session: Session,
-            model: GltfModel,
-            pose: Pose = Pose.Identity,
-        ): GltfModelEntity =
-            GltfModelEntity.create(session.platformAdapter, session.entityManager, model, pose)
-    }
-
-    /** Returns the current animation state of this glTF entity. */
-    @AnimationStateValue
-    public fun getAnimationState(): Int {
-        return when (rtEntity.animationState) {
-            JxrPlatformAdapter.GltfEntity.AnimationState.PLAYING -> return AnimationState.PLAYING
-            JxrPlatformAdapter.GltfEntity.AnimationState.STOPPED -> return AnimationState.STOPPED
-            else -> AnimationState.STOPPED
-        }
-    }
-
-    /**
-     * Starts the animation with the given name.
-     *
-     * This method must be called from the main thread.
-     * https://developer.android.com/guide/components/processes-and-threads
-     *
-     * @param animationName The name of the animation to start. If null, the first animation found
-     *   in the glTF will be played.
-     * @param loop Whether the animation should loop.
-     */
-    @MainThread
-    @JvmOverloads
-    public fun startAnimation(loop: Boolean, animationName: String? = null) {
-        rtEntity.startAnimation(loop, animationName)
-    }
-
-    /**
-     * Stops the animation of the glTF entity.
-     *
-     * This method must be called from the main thread.
-     * https://developer.android.com/guide/components/processes-and-threads
-     */
-    @MainThread
-    public fun stopAnimation() {
-        rtEntity.stopAnimation()
-    }
-
-    /**
-     * Sets a material override for a mesh in the glTF model.
-     *
-     * This method must be called from the main thread.
-     * https://developer.android.com/guide/components/processes-and-threads
-     *
-     * If the material is not created or the mesh name is not found in the glTF model, this method
-     * will throw an IllegalStateException.
-     *
-     * @param material The material to use for the mesh.
-     * @param meshName The name of the mesh to use the material for.
-     */
-    @MainThread
-    public fun setMaterialOverride(material: Material, meshName: String) {
-        rtEntity.setMaterialOverride(material.material!!, meshName)
-    }
-}
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/JxrPlatformAdapter.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/JxrPlatformAdapter.java
index 920958d..0906650 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/JxrPlatformAdapter.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/JxrPlatformAdapter.java
@@ -35,6 +35,7 @@
 import androidx.xr.runtime.math.Matrix4;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Vector3;
+import androidx.xr.runtime.math.Vector4;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -108,17 +109,6 @@
     @Nullable
     ListenableFuture<GltfModelResource> loadGltfByAssetNameSplitEngine(@NonNull String assetName);
 
-    /**
-     * Loads glTF Asset from a provided byte array. The future returned by this method will fire
-     * listeners on the UI thread if Runnable::run is supplied.
-     */
-    // TODO(b/397746548): Add InputStream support for loading glTFs.
-    // Suppressed to allow CompletableFuture.
-    @SuppressWarnings({"AndroidJdkLibsChecker", "AsyncSuffixFuture"})
-    @Nullable
-    ListenableFuture<GltfModelResource> loadGltfByByteArray(
-            @NonNull byte[] assetData, @NonNull String assetKey);
-
     /** Loads an ExrImage for the given asset name from the assets folder. */
     // Suppressed to allow CompletableFuture.
     @SuppressWarnings({"AndroidJdkLibsChecker", "AsyncSuffixFuture"})
@@ -126,22 +116,6 @@
     ListenableFuture<ExrImageResource> loadExrImageByAssetName(@NonNull String assetName);
 
     /**
-     * Loads an ExrImage for the given asset name from the assets folder using the Split Engine
-     * route.
-     */
-    @SuppressWarnings("AsyncSuffixFuture")
-    @Nullable
-    ListenableFuture<ExrImageResource> loadExrImageByAssetNameSplitEngine(
-            @NonNull String assetName);
-
-    /** Loads an ExrImage from a provided byte array using the Split Engine route. */
-    // Suppressed to allow CompletableFuture.
-    @SuppressWarnings({"AndroidJdkLibsChecker", "AsyncSuffixFuture"})
-    @Nullable
-    ListenableFuture<ExrImageResource> loadExrImageByByteArraySplitEngine(
-            @NonNull byte[] assetData, @NonNull String assetKey);
-
-    /**
      * Loads a texture resource for the given asset name or URL. The future returned by this method
      * will fire listeners on the UI thread if Runnable::run is supplied.
      */
@@ -157,17 +131,13 @@
     /** Destroys the given texture resource. */
     void destroyTexture(@NonNull TextureResource texture);
 
-    /** Returns the reflection texture from the given IBL. */
-    @Nullable
-    TextureResource getReflectionTextureFromIbl(@NonNull ExrImageResource iblToken);
-
     /**
      * Creates a water material by querying it from the system's built-in materials. The future
      * returned by this method will fire listeners on the UI thread if Runnable::run is supplied.
      */
     @SuppressWarnings({"AndroidJdkLibsChecker", "AsyncSuffixFuture"})
     @Nullable
-    ListenableFuture<MaterialResource> createWaterMaterial(boolean isAlphaMapVersion);
+    ListenableFuture<MaterialResource> createWaterMaterial(boolean transparent);
 
     /** Destroys the given water material resource. */
     void destroyWaterMaterial(@NonNull MaterialResource material);
@@ -185,18 +155,15 @@
     /** Sets the normal speed for the water material. */
     void setNormalSpeed(@NonNull MaterialResource material, float normalSpeed);
 
+    /** Sets the alpha step of the U coordinate for the water material. */
+    void setAlphaStepU(@NonNull MaterialResource material, @NonNull Vector4 alphaStepU);
+
+    /** Sets the alpha step of the V coordinate for the water material. */
+    void setAlphaStepV(@NonNull MaterialResource material, @NonNull Vector4 alphaStepV);
+
     /** Sets the alpha step multiplier for the water material. */
     void setAlphaStepMultiplier(@NonNull MaterialResource material, float alphaStepMultiplier);
 
-    /** Sets the alpha map for the water material. */
-    void setAlphaMap(@NonNull MaterialResource material, @NonNull TextureResource alphaMap);
-
-    /** Sets the normal z for the water material. */
-    void setNormalZ(@NonNull MaterialResource material, float normalZ);
-
-    /** Sets the normal boundary for the water material. */
-    void setNormalBoundary(@NonNull MaterialResource material, float normalBoundary);
-
     /**
      * A factory function to create a SceneCore GltfEntity. The parent may be the activity space or
      * GltfEntity in the scene.
@@ -249,39 +216,22 @@
     /**
      * A factory function to create a platform PanelEntity. The parent can be any entity.
      *
-     * @param context Application Context.
      * @param pose Initial pose of the panel.
      * @param view View inflating this panel.
+     * @param surfaceDimensionsPx Dimensions for the underlying surface for the given view.
      * @param dimensions Size of the panel in meters.
      * @param name Name of the panel.
+     * @param context Application Context.
      * @param parent Parent entity.
      */
     @NonNull
     PanelEntity createPanelEntity(
-            @NonNull Context context,
             @NonNull Pose pose,
             @NonNull View view,
+            @NonNull PixelDimensions surfaceDimensionsPx,
             @NonNull Dimensions dimensions,
             @NonNull String name,
-            @NonNull Entity parent);
-
-    /**
-     * A factory function to create a platform PanelEntity. The parent can be any entity.
-     *
-     * @param context Application Context.
-     * @param pose Initial pose of the panel.
-     * @param view View inflating this panel.
-     * @param pixelDimensions Dimensions for the underlying surface for the given view in pixels.
-     * @param name Name of the panel.
-     * @param parent Parent entity.
-     */
-    @NonNull
-    PanelEntity createPanelEntity(
-            @NonNull Context context,
-            @NonNull Pose pose,
-            @NonNull View view,
-            @NonNull PixelDimensions pixelDimensions,
-            @NonNull String name,
+            @SuppressWarnings("ContextFirst") @NonNull Context context,
             @NonNull Entity parent);
 
     /** Get the PanelEntity associated with the main window for the Activity. */
@@ -916,50 +866,21 @@
     /** Interface for a SceneCore Entity */
     interface Entity extends ActivityPose {
 
-        /** Returns the pose for this entity, relative to the given space. */
-        @NonNull
-        Pose getPose(@SpaceValue int relativeTo);
-
         /** Returns the pose for this entity, relative to its parent. */
         @NonNull
-        default Pose getPose() {
-            return getPose(Space.PARENT);
-        }
-
-        /** Updates the pose (position and rotation) of the Entity relative to the given space. */
-        void setPose(@NonNull Pose pose, @SpaceValue int relativeTo);
+        Pose getPose();
 
         /** Updates the pose (position and rotation) of the Entity relative to its parent. */
-        default void setPose(@NonNull Pose pose) {
-            setPose(pose, Space.PARENT);
-        }
+        void setPose(@NonNull Pose pose);
 
         /**
-         * Returns the scale of this entity, relative to the given space.
+         * Returns the scale of this entity, relative to its parent. Note that this doesn't include
+         * the parent's scale.
          *
-         * @return Current [Vector3] scale relative to the given space.
+         * @return Current [Vector3] scale applied to self and children.
          */
         @NonNull
-        Vector3 getScale(@SpaceValue int relativeTo);
-
-        /**
-         * Returns the scale of this entity, relative to its parent.
-         *
-         * @return Current [Vector3] scale relative to the parent.
-         */
-        @NonNull
-        default Vector3 getScale() {
-            return getScale(Space.PARENT);
-        }
-
-        /**
-         * Sets the scale of this entity relative to the given space. This value will affect the
-         * rendering of this Entity's children. As the scale increases, this will stretch the
-         * content of the Entity.
-         *
-         * @param scale The [Vector3] scale factor relative to the given space.
-         */
-        void setScale(@NonNull Vector3 scale, @SpaceValue int relativeTo);
+        Vector3 getScale();
 
         /**
          * Sets the scale of this entity relative to its parent. This value will affect the
@@ -968,9 +889,7 @@
          *
          * @param scale The [Vector3] scale factor from the parent.
          */
-        default void setScale(@NonNull Vector3 scale) {
-            setScale(scale, Space.PARENT);
-        }
+        void setScale(@NonNull Vector3 scale);
 
         /**
          * Add given Entity as child. The child Entity's pose will be relative to the pose of its
@@ -1003,33 +922,24 @@
         List<Entity> getChildren();
 
         /**
-         * Returns the effective alpha transparency level of the entity, relative to the given
-         * space.
+         * Sets the size for the given Entity.
          *
-         * @param relativeTo The space in which to evaluate the alpha.
+         * @param dimensions Dimensions for the Entity in meters.
          */
-        float getAlpha(@SpaceValue int relativeTo);
+        void setSize(@NonNull Dimensions dimensions);
 
         /** Returns the set alpha transparency level for this Entity. */
-        default float getAlpha() {
-            return getAlpha(Space.PARENT);
-        }
-
-        /**
-         * Sets the alpha transparency for the given Entity, relative to the given space.
-         *
-         * @param alpha Alpha transparency level for the Entity.
-         */
-        void setAlpha(float alpha, @SpaceValue int relativeTo);
+        float getAlpha();
 
         /**
          * Sets the alpha transparency for the given Entity.
          *
          * @param alpha Alpha transparency level for the Entity.
          */
-        default void setAlpha(float alpha) {
-            setAlpha(alpha, Space.PARENT);
-        }
+        void setAlpha(float alpha);
+
+        /** Returns the total alpha transparency level for this Entity. */
+        float getActivitySpaceAlpha();
 
         /**
          * Sets the local hidden state of this Entity. When true, this Entity and all descendants
@@ -1113,44 +1023,10 @@
              */
             @Nullable public final ExrImageResource skybox;
 
-            /**
-             * The material to override a given mesh in the geometry. If null, the material will not
-             * override any mesh.
-             */
-            @Nullable public final MaterialResource geometryMaterial;
-
-            /**
-             * The name of the mesh to override with the material. If null, the material will not
-             * override any mesh.
-             */
-            @Nullable public final String geometryMeshName;
-
-            /**
-             * The name of the animation to play on the geometry. If null, the geometry will not
-             * play any animation. Note that the animation will be played in loop.
-             */
-            @Nullable public final String geometryAnimationName;
-
             public SpatialEnvironmentPreference(
                     @Nullable ExrImageResource skybox, @Nullable GltfModelResource geometry) {
                 this.skybox = skybox;
                 this.geometry = geometry;
-                this.geometryMaterial = null;
-                this.geometryMeshName = null;
-                this.geometryAnimationName = null;
-            }
-
-            public SpatialEnvironmentPreference(
-                    @Nullable ExrImageResource skybox,
-                    @Nullable GltfModelResource geometry,
-                    @Nullable MaterialResource geometryMaterial,
-                    @Nullable String geometryMeshName,
-                    @Nullable String geometryAnimationName) {
-                this.skybox = skybox;
-                this.geometry = geometry;
-                this.geometryMaterial = geometryMaterial;
-                this.geometryMeshName = geometryMeshName;
-                this.geometryAnimationName = geometryAnimationName;
             }
 
             @Override
@@ -1161,10 +1037,7 @@
                 if (o instanceof SpatialEnvironmentPreference) {
                     SpatialEnvironmentPreference other = (SpatialEnvironmentPreference) o;
                     return Objects.equals(other.skybox, skybox)
-                            && Objects.equals(other.geometry, geometry)
-                            && Objects.equals(other.geometryMaterial, geometryMaterial)
-                            && Objects.equals(other.geometryMeshName, geometryMeshName)
-                            && Objects.equals(other.geometryAnimationName, geometryAnimationName);
+                            && Objects.equals(other.geometry, geometry);
                 }
                 return false;
             }
@@ -1452,7 +1325,7 @@
          * @return The current [PixelDimensions] of the underlying surface.
          */
         @NonNull
-        PixelDimensions getSizeInPixels();
+        PixelDimensions getPixelDimensions();
 
         /**
          * Sets the pixel (not Dp) dimensions of the view underlying this PanelEntity. Calling this
@@ -1461,7 +1334,7 @@
          *
          * @param dimensions The [PixelDimensions] of the underlying surface to set.
          */
-        void setSizeInPixels(@NonNull PixelDimensions dimensions);
+        void setPixelDimensions(@NonNull PixelDimensions dimensions);
 
         /**
          * Sets a corner radius on all four corners of this PanelEntity.
@@ -1479,10 +1352,8 @@
          * including parent scale.
          *
          * @return Vector3 scale applied to pixels within the Panel. (Z will be 0)
-         * @deprecated This method will be removed in a future release.
          */
         @NonNull
-        @Deprecated
         Vector3 getPixelDensity();
 
         /**
@@ -1493,13 +1364,6 @@
          */
         @NonNull
         Dimensions getSize();
-
-        /**
-         * Sets the spatial size of this Panel in meters.
-         *
-         * @param dimensions [Dimensions] size of this panel in meters. (Z will be 0)
-         */
-        void setSize(@NonNull Dimensions dimensions);
     }
 
     /** Interface for a SceneCore ActivityPanel entity. */
@@ -1602,10 +1466,6 @@
             int TOP_BOTTOM = 1;
             // The [left, right] halves of the surface will map to [left, right] eyes
             int SIDE_BY_SIDE = 2;
-            // Multiview video, [primary, auxiliary] views will map to [left, right] eyes
-            int MULTIVIEW_LEFT_PRIMARY = 4;
-            // Multiview video, [primary, auxiliary] views will map to [right, left] eyes
-            int MULTIVIEW_RIGHT_PRIMARY = 5;
         }
 
         /**
@@ -2701,26 +2561,4 @@
     /** Returns a [MediaPlayerExtensionsWrapper] instance. */
     @NonNull
     MediaPlayerExtensionsWrapper getMediaPlayerExtensionsWrapper();
-
-    /** Specifies the coordinate space for pose and scale transformations. */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({Space.PARENT, Space.ACTIVITY, Space.REAL_WORLD})
-    public @interface SpaceValue {}
-
-    /** Coordinate spaces in which to apply the transformation values. */
-    public class Space {
-        /** The local coordinate space of an [Entity], relative to its parent. */
-        public static final int PARENT = 0;
-
-        /** The global coordinate space, at the root of the scene graph for the activity. */
-        public static final int ACTIVITY = 1;
-
-        /**
-         * The global coordinate space, unscaled, at the root of the scene graph of the activity.
-         */
-        public static final int REAL_WORLD = 2;
-
-        private Space() {}
-    }
 }
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Model.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Model.kt
index 714b5ce8..b185995 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Model.kt
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Model.kt
@@ -36,7 +36,7 @@
 //                     playback animation from the integer index.
 // TODO: b/362368652 - Add an interface which returns a list of available animation names
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public class GltfModel internal constructor(internal val model: RtGltfModel) : Model {
+public class GltfModel internal constructor(public val model: RtGltfModel) : Model {
 
     public companion object {
         @Deprecated(
@@ -58,16 +58,25 @@
             platformAdapter: JxrPlatformAdapter,
             name: String,
         ): ListenableFuture<GltfModel> {
-            return createModelFuture(platformAdapter.loadGltfByAssetNameSplitEngine(name)!!)
-        }
+            val gltfResourceFuture = platformAdapter.loadGltfByAssetNameSplitEngine(name)
+            val modelFuture = ResolvableFuture.create<GltfModel>()
 
-        @SuppressWarnings("RestrictTo")
-        internal fun createAsync(
-            platformAdapter: JxrPlatformAdapter,
-            assetData: ByteArray,
-            assetKey: String,
-        ): ListenableFuture<GltfModel> {
-            return createModelFuture(platformAdapter.loadGltfByByteArray(assetData, assetKey)!!)
+            // TODO: b/375070346 - remove this `!!` when we're sure the future is non-null.
+            gltfResourceFuture!!.addListener(
+                {
+                    try {
+                        val gltfResource = gltfResourceFuture.get()
+                        modelFuture.set(GltfModel(gltfResource))
+                    } catch (e: Exception) {
+                        if (e is InterruptedException) {
+                            Thread.currentThread().interrupt()
+                        }
+                        modelFuture.setException(e)
+                    }
+                },
+                Runnable::run,
+            )
+            return modelFuture
         }
 
         /**
@@ -90,51 +99,6 @@
         public fun create(session: Session, name: String): ListenableFuture<GltfModel> {
             return GltfModel.createAsync(session.platformAdapter, name)
         }
-
-        /**
-         * Public factory function for a [GltfModel], where the glTF is asynchronously loaded.
-         *
-         * This method must be called from the main thread.
-         * https://developer.android.com/guide/components/processes-and-threads
-         *
-         * Currently, only binary glTF (.glb) files are supported.
-         *
-         * @param session The [Session] to use for loading the model.
-         * @param assetData The byte array data of a binary glTF (.glb) model to be loaded.
-         * @param assetKey The key to use for the model. This is used to identify the model in the
-         *   [SceneCore] cache.
-         * @return a ListenableFuture<GltfModel>. Listeners will be called on the main thread if
-         *   Runnable::run is supplied.
-         */
-        @MainThread
-        @JvmStatic
-        public fun create(
-            session: Session,
-            assetData: ByteArray,
-            assetKey: String,
-        ): ListenableFuture<GltfModel> {
-            return GltfModel.createAsync(session.platformAdapter, assetData, assetKey)
-        }
-
-        private fun createModelFuture(
-            gltfResourceFuture: ListenableFuture<RtGltfModel>
-        ): ListenableFuture<GltfModel> {
-            val modelFuture = ResolvableFuture.create<GltfModel>()
-
-            gltfResourceFuture.addListener(
-                {
-                    try {
-                        modelFuture.set(GltfModel(gltfResourceFuture.get()))
-                    } catch (e: Exception) {
-                        if (e is InterruptedException) Thread.currentThread().interrupt()
-                        modelFuture.setException(e)
-                    }
-                },
-                Runnable::run,
-            )
-
-            return modelFuture
-        }
     }
 
     override fun equals(other: Any?): Boolean {
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/PanelEntity.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/PanelEntity.kt
deleted file mode 100644
index e8cec8f..0000000
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/PanelEntity.kt
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.scenecore
-
-import android.content.Context
-import android.view.View
-import androidx.annotation.RestrictTo
-import androidx.xr.runtime.math.Pose
-import androidx.xr.runtime.math.Vector3
-
-/** Provides implementations for common Panel functionality. */
-@Suppress("DEPRECATION")
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public sealed class BasePanelEntity<out RtPanelEntityType : JxrPlatformAdapter.PanelEntity>(
-    private val rtPanelEntity: RtPanelEntityType,
-    entityManager: EntityManager,
-) : BaseEntity<JxrPlatformAdapter.PanelEntity>(rtPanelEntity, entityManager) {
-
-    /**
-     * Sets the corner radius of the PanelEntity.
-     *
-     * @param radius The radius of the corners, in meters.
-     * @throws IllegalArgumentException if radius is <= 0.0f.
-     */
-    public fun setCornerRadius(radius: Float) {
-        rtPanelEntity.setCornerRadius(radius)
-    }
-
-    /** Gets the corner radius of this PanelEntity in meters. Has a default value of 0. */
-    public fun getCornerRadius(): Float {
-        return rtPanelEntity.cornerRadius
-    }
-
-    /**
-     * Returns the dimensions in local space, in unscaled meters for this panel entity.
-     *
-     * <p>
-     * Users of this api can convert this entity's local space dimensions to real world meters by
-     * multiplying the local space dimensions with relative scale of this entity in unscaled world
-     * space i.e. real meters = local space dimensions getScale(Space.REAL_WORLD) and vice versa.
-     * For example a panel entity 1x1 dimensions in local space will look 2x2 meters in real world
-     * if the relative scale applied to this entity in the world space is 2.
-     */
-    public fun getSize(): Dimensions {
-        return rtPanelEntity.size.toDimensions()
-    }
-
-    /** Returns the dimensions in Pixels for this panel entity. */
-    public fun getSizeInPixels(): PixelDimensions {
-        return rtPanelEntity.sizeInPixels.toPixelDimensions()
-    }
-
-    /**
-     * Returns the dimensions of the view underlying this PanelEntity.
-     *
-     * @return The current (width, height) of the underlying surface in pixels.
-     */
-    @Deprecated("Use getSizeInPixels() instead.", ReplaceWith("getSizeInPixels()"))
-    public fun getPixelDimensions(): PixelDimensions {
-        return getSizeInPixels()
-    }
-
-    /**
-     * Sets the pixel (not Dp) dimensions of the view underlying this PanelEntity. Calling this
-     * might cause the layout of the Panel contents to change. Updating this will not cause the
-     * scale or pixel density to change.
-     *
-     * @param pxDimensions The [PixelDimensions] of the underlying surface to set.
-     */
-    @Deprecated("Use setSizeInPixels instead.", ReplaceWith("setSizeInPixels(pxDimensions)"))
-    public fun setPixelDimensions(pxDimensions: PixelDimensions) {
-        setSizeInPixels(pxDimensions)
-    }
-
-    /**
-     * Gets the number of pixels per meter for this panel. This value reflects changes to scale,
-     * including parent scale.
-     *
-     * @return Vector3 scale applied to pixels within the Panel. (Z will be 0)
-     */
-    @Deprecated("This api will be removed in a future release.")
-    public fun getPixelDensity(): Vector3 {
-        return rtPanelEntity.pixelDensity
-    }
-
-    /**
-     * Sets the size in meters for the surface on which the View is laid out. The dimensions
-     * provided are unscaled meters in the local space.
-     *
-     * <p>
-     * Users of this api can convert this entity's local space dimensions to real world meters by
-     * multiplying the local space dimensions with relative scale of this entity in unscaled world
-     * space i.e. real meters = local space dimensions * getScale(Space.REAL_WORLD) and vice versa.
-     * For example a panel entity 1x1 dimensions in local space will look 2x2 meters in real world
-     * if the relative scale applied to this entity in the world space is 2.
-     *
-     * @param dimensions Dimensions in meters in local space.
-     */
-    public fun setSize(dimensions: Dimensions) {
-        rtPanelEntity.setSize(dimensions.toRtDimensions())
-    }
-
-    /**
-     * Sets the size in pixels for the surface on which the view is laid out. This essentially sets
-     * the resolution of underlying surface. The dimensions provided are in pixels.
-     *
-     * <p>
-     * This API doesn't do any scale compensation to pixel dimensions provided.
-     *
-     * @param pixelDimensions Dimensions in pixels.
-     */
-    public fun setSizeInPixels(pixelDimensions: PixelDimensions) {
-        rtPanelEntity.setSizeInPixels(pixelDimensions.toRtPixelDimensions())
-    }
-}
-
-/** PanelEntity creates a spatial panel in Android XR. */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public open class PanelEntity
-internal constructor(
-    rtEntity: JxrPlatformAdapter.PanelEntity,
-    entityManager: EntityManager,
-    // TODO(ricknels): move isMainPanelEntity check to JxrPlatformAdapter.
-    public val isMainPanelEntity: Boolean = false,
-) : BasePanelEntity<JxrPlatformAdapter.PanelEntity>(rtEntity, entityManager) {
-
-    public companion object {
-        internal fun create(
-            context: Context,
-            adapter: JxrPlatformAdapter,
-            entityManager: EntityManager,
-            view: View,
-            dimensions: Dimensions,
-            name: String,
-            pose: Pose = Pose.Identity,
-        ): PanelEntity =
-            PanelEntity(
-                adapter.createPanelEntity(
-                    context,
-                    pose,
-                    view,
-                    dimensions.toRtDimensions(),
-                    name,
-                    adapter.activitySpaceRootImpl,
-                ),
-                entityManager,
-            )
-
-        internal fun create(
-            context: Context,
-            adapter: JxrPlatformAdapter,
-            entityManager: EntityManager,
-            view: View,
-            pixelDimensions: PixelDimensions,
-            name: String,
-            pose: Pose = Pose.Identity,
-        ): PanelEntity =
-            PanelEntity(
-                adapter.createPanelEntity(
-                    context,
-                    pose,
-                    view,
-                    pixelDimensions.toRtPixelDimensions(),
-                    name,
-                    adapter.activitySpaceRootImpl,
-                ),
-                entityManager,
-            )
-
-        /**
-         * Public factory function for a spatialized PanelEntity.
-         *
-         * @param session Session to create the PanelEntity in.
-         * @param view View to embed in this panel entity.
-         * @param dimensions Dimensions for the underlying surface for the given view in meters.
-         * @param name Name of the panel.
-         * @param pose Pose of this entity relative to its parent, default value is Identity.
-         * @return a PanelEntity instance.
-         */
-        @JvmOverloads
-        @JvmStatic
-        public fun create(
-            session: Session,
-            view: View,
-            dimensions: Dimensions,
-            name: String,
-            pose: Pose = Pose.Identity,
-        ): PanelEntity =
-            PanelEntity.create(
-                session.activity,
-                session.platformAdapter,
-                session.entityManager,
-                view,
-                dimensions,
-                name,
-                pose,
-            )
-
-        /**
-         * Public factory function for a spatialized PanelEntity.
-         *
-         * @param session Session to create the PanelEntity in.
-         * @param view View to embed in this panel entity.
-         * @param pixelDimensions Dimensions for the underlying surface for the given view in
-         *   pixels.
-         * @param name Name of the panel.
-         * @param pose Pose of this entity relative to its parent, default value is Identity.
-         * @return a PanelEntity instance.
-         */
-        @JvmOverloads
-        @JvmStatic
-        public fun create(
-            session: Session,
-            view: View,
-            pixelDimensions: PixelDimensions,
-            name: String,
-            pose: Pose = Pose.Identity,
-        ): PanelEntity =
-            PanelEntity.create(
-                session.activity,
-                session.platformAdapter,
-                session.entityManager,
-                view,
-                pixelDimensions,
-                name,
-                pose,
-            )
-
-        /**
-         * Public factory function for a spatialized PanelEntity.
-         *
-         * @param session Session to create the PanelEntity in.
-         * @param view View to embed in this panel entity.
-         * @param surfaceDimensionsPx Dimensions for the underlying surface for the given view.
-         * @param dimensions Dimensions for the panel in meters.
-         * @param name Name of the panel.
-         * @param pose Pose of this entity relative to its parent, default value is Identity.
-         * @return a PanelEntity instance.
-         * @deprecated Use create(session, view, pixelDimensions, name, pose) instead.
-         */
-        @JvmOverloads
-        @JvmStatic
-        @Deprecated(
-            "Use create(session, view, pixelDimensions, name, pose) instead.",
-            ReplaceWith("create(session, view, pixelDimensions, name, pose)"),
-        )
-        public fun create(
-            session: Session,
-            view: View,
-            surfaceDimensionsPx: Dimensions,
-            @Suppress("UNUSED_PARAMETER") dimensions: Dimensions,
-            name: String,
-            pose: Pose = Pose.Identity,
-        ): PanelEntity =
-            PanelEntity.create(
-                session.activity,
-                session.platformAdapter,
-                session.entityManager,
-                view,
-                PixelDimensions(
-                    surfaceDimensionsPx.width.toInt(),
-                    surfaceDimensionsPx.height.toInt()
-                ),
-                name,
-                pose,
-            )
-
-        /** Returns the PanelEntity backed by the main window for the Activity. */
-        internal fun createMainPanelEntity(
-            adapter: JxrPlatformAdapter,
-            entityManager: EntityManager,
-        ): PanelEntity =
-            PanelEntity(adapter.mainPanelEntity, entityManager, isMainPanelEntity = true)
-    }
-}
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Space.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Space.kt
deleted file mode 100644
index 9221ef2..0000000
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Space.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.scenecore
-
-import androidx.annotation.IntDef
-import androidx.annotation.RestrictTo
-
-@IntDef(Space.PARENT, Space.ACTIVITY, Space.REAL_WORLD)
-@Retention(AnnotationRetention.SOURCE)
-internal annotation class SpaceValue
-
-/** Coordinate spaces in which to apply the transformation values. */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public object Space {
-    /** The local coordinate space of an [Entity], relative to its parent. */
-    public const val PARENT: Int = 0
-    /** The global coordinate space, at the root of the scene graph for the activity. */
-    public const val ACTIVITY: Int = 1
-    /** The global coordinate space, unscaled, at the root of the scene graph of the activity. */
-    public const val REAL_WORLD: Int = 2
-}
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/SpatialEnvironment.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/SpatialEnvironment.kt
index 3a2ab1d..d1b42b7 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/SpatialEnvironment.kt
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/SpatialEnvironment.kt
@@ -85,23 +85,10 @@
      *   null, it will be all black.
      * @param geometry The preferred geometry for the environment based on a pre-loaded [GltfModel].
      *   If null, there will be no geometry.
-     * @param geometryMaterial The material to override a given mesh in the geometry. If null, the
-     *   material will not override any mesh.
-     * @param geometryMeshName The name of the mesh to override with the material. If null, the
-     *   material will not override any mesh.
-     * @param geometryAnimationName The name of the animation to play on the geometry. If null, the
-     *   geometry will not play any animation. Note that the animation will be played in loop.
-     * @throws IllegalStateException if the material is not properly set up and if the geometry glTF
-     *   model does not contain the mesh or the animation name.
      */
-    public class SpatialEnvironmentPreference
-    @JvmOverloads
-    constructor(
+    public class SpatialEnvironmentPreference(
         public val skybox: ExrImage?,
         public val geometry: GltfModel?,
-        internal val geometryMaterial: Material? = null,
-        internal val geometryMeshName: String? = null,
-        internal val geometryAnimationName: String? = null,
     ) {
 
         override fun equals(other: Any?): Boolean {
@@ -343,7 +330,8 @@
      * application, meaning the default system environment will be displayed instead.
      *
      * If the given [SpatialEnvironmentPreference] is not null, but all of its properties are null,
-     * then the spatial environment will consist of a black skybox and no geometry.
+     * then the spatial environment will consist of a black skybox and no geometry
+     * [isSpatialEnvironmentPreferenceActive] is true.
      *
      * Changes to the Environment state will be notified via listeners added with
      * [addOnSpatialEnvironmentChangedListener].
@@ -446,13 +434,7 @@
 
 internal fun SpatialEnvironment.SpatialEnvironmentPreference.toRtSpatialEnvironmentPreference():
     RtSpatialEnvironmentPreference {
-    return RtSpatialEnvironmentPreference(
-        skybox?.image,
-        geometry?.model,
-        geometryMaterial?.material,
-        geometryMeshName,
-        geometryAnimationName,
-    )
+    return RtSpatialEnvironmentPreference(skybox?.image, geometry?.model)
 }
 
 internal fun RtSpatialEnvironmentPreference.toSpatialEnvironmentPreference():
@@ -460,9 +442,6 @@
     return SpatialEnvironment.SpatialEnvironmentPreference(
         skybox?.let { ExrImage(it) },
         geometry?.let { GltfModel(it) },
-        geometryMaterial?.let { Material(it) },
-        geometryMeshName,
-        geometryAnimationName,
     )
 }
 
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/SurfaceEntity.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/SurfaceEntity.kt
deleted file mode 100644
index 482c685..0000000
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/SurfaceEntity.kt
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.scenecore
-
-import android.view.Surface
-import androidx.annotation.IntDef
-import androidx.annotation.MainThread
-import androidx.annotation.RestrictTo
-import androidx.xr.runtime.math.Pose
-
-/**
- * SurfaceEntity is a concrete implementation of Entity that hosts a StereoSurface Canvas. The
- * entity creates and owns an Android Surface into which the application can render stereo image
- * content. This Surface is then texture mapped to the canvas, and if a stereoscopic StereoMode is
- * specified, then the User will see left and right eye content mapped to the appropriate display.
- *
- * Note that it is not currently possible to synchronize CanvasShape and StereoMode changes with
- * application rendering or video decoding. Applications are advised to carefully hide this entity
- * around transitions to manage glitchiness.
- *
- * @property canvasShape The [CanvasShape] which describes the mesh to which the Surface is mapped.
- * @property stereoMode The [StereoMode] which describes how parts of the surface are displayed to
- *   the user's eyes.
- * @property dimensions The dimensions of the canvas in the local spatial coordinate system of the
- *   entity.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public class SurfaceEntity
-private constructor(
-    rtEntity: JxrPlatformAdapter.SurfaceEntity,
-    entityManager: EntityManager,
-    canvasShape: CanvasShape,
-) : BaseEntity<JxrPlatformAdapter.SurfaceEntity>(rtEntity, entityManager) {
-
-    /** Represents the shape of the Canvas that backs a SurfaceEntity. */
-    public abstract class CanvasShape private constructor() {
-        public open val dimensions: Dimensions = Dimensions(0.0f, 0.0f, 0.0f)
-
-        // A Quad-shaped canvas. Width and height are represented in the local spatial coordinate
-        // system of the entity. (0,0,0) is the center of the canvas.
-        public class Quad(public val width: Float, public val height: Float) : CanvasShape() {
-            override val dimensions: Dimensions
-                get() = Dimensions(width, height, 0.0f)
-        }
-
-        // An inwards-facing sphere-shaped canvas, centered at (0,0,0) in the local coordinate
-        // space.
-        // This is intended to be used by setting the entity's pose to the user's head pose.
-        // Radius is represented in the local spatial coordinate system of the entity.
-        // The center of the Surface will be mapped to (0, 0, -radius) in the local coordinate
-        // space,
-        // and UV's are applied from positive X to negative X in an equirectangular projection.
-        public class Vr360Sphere(public val radius: Float) : CanvasShape() {
-            override val dimensions: Dimensions
-                get() = Dimensions(radius * 2, radius * 2, radius * 2)
-        }
-
-        // An inwards-facing hemisphere-shaped canvas, where (0,0,0) is the center of the base of
-        // the
-        // hemisphere. Radius is represented in the local spatial coordinate system of the entity.
-        // This is intended to be used by setting the entity's pose to the user's head pose.
-        // The center of the Surface will be mapped to (0, 0, -radius) in the local coordinate
-        // space,
-        // and UV's are applied from positive X to negative X in an equirectangular projection.
-        public class Vr180Hemisphere(public val radius: Float) : CanvasShape() {
-            override val dimensions: Dimensions
-                get() = Dimensions(radius * 2, radius * 2, radius)
-        }
-    }
-
-    /**
-     * Specifies how the surface content will be routed for stereo viewing. Applications must render
-     * into the surface in accordance with what is specified here in order for the compositor to
-     * correctly produce a stereoscopic view to the user.
-     *
-     * Values here match values from androidx.media3.common.C.StereoMode in
-     * //third_party/java/android_libs/media:common
-     */
-    @IntDef(StereoMode.MONO, StereoMode.TOP_BOTTOM, StereoMode.SIDE_BY_SIDE)
-    @Retention(AnnotationRetention.SOURCE)
-    internal annotation class StereoModeValue
-
-    public object StereoMode {
-        // Each eye will see the entire surface (no separation)
-        public const val MONO: Int = 0
-        // The [bottom, top] halves of the surface will map to [left, right] eyes
-        public const val TOP_BOTTOM: Int = 1
-        // The [left, right] halves of the surface will map to [left, right] eyes
-        public const val SIDE_BY_SIDE: Int = 2
-        // Multiview video, [primary, auxiliary] views will map to [left, right] eyes
-        public const val MULTIVIEW_LEFT_PRIMARY: Int = 4
-        // Multiview video, [primary, auxiliary] views will map to [right, left] eyes
-        public const val MULTIVIEW_RIGHT_PRIMARY: Int = 5
-    }
-
-    public companion object {
-        private fun getRtStereoMode(stereoMode: Int): Int {
-            return when (stereoMode) {
-                StereoMode.MONO -> JxrPlatformAdapter.SurfaceEntity.StereoMode.MONO
-                StereoMode.TOP_BOTTOM -> JxrPlatformAdapter.SurfaceEntity.StereoMode.TOP_BOTTOM
-                StereoMode.MULTIVIEW_LEFT_PRIMARY ->
-                    JxrPlatformAdapter.SurfaceEntity.StereoMode.MULTIVIEW_LEFT_PRIMARY
-                StereoMode.MULTIVIEW_RIGHT_PRIMARY ->
-                    JxrPlatformAdapter.SurfaceEntity.StereoMode.MULTIVIEW_RIGHT_PRIMARY
-                else -> JxrPlatformAdapter.SurfaceEntity.StereoMode.SIDE_BY_SIDE
-            }
-        }
-
-        /**
-         * Factory method for SurfaceEntity.
-         *
-         * @param adapter JxrPlatformAdapter to use.
-         * @param entityManager A SceneCore EntityManager
-         * @param stereoMode An [Int] which defines how surface subregions map to eyes
-         * @param pose Pose for this StereoSurface entity, relative to its parent.
-         * @param canvasShape The [CanvasShape] which describes the spatialized shape of the canvas.
-         */
-        internal fun create(
-            adapter: JxrPlatformAdapter,
-            entityManager: EntityManager,
-            stereoMode: Int = StereoMode.SIDE_BY_SIDE,
-            pose: Pose = Pose.Identity,
-            canvasShape: CanvasShape = CanvasShape.Quad(1.0f, 1.0f),
-        ): SurfaceEntity {
-            val rtCanvasShape =
-                when (canvasShape) {
-                    is CanvasShape.Quad ->
-                        JxrPlatformAdapter.SurfaceEntity.CanvasShape.Quad(
-                            canvasShape.width,
-                            canvasShape.height
-                        )
-                    is CanvasShape.Vr360Sphere ->
-                        JxrPlatformAdapter.SurfaceEntity.CanvasShape.Vr360Sphere(canvasShape.radius)
-                    is CanvasShape.Vr180Hemisphere ->
-                        JxrPlatformAdapter.SurfaceEntity.CanvasShape.Vr180Hemisphere(
-                            canvasShape.radius
-                        )
-                    else -> throw IllegalArgumentException("Unsupported canvas shape: $canvasShape")
-                }
-            return SurfaceEntity(
-                adapter.createSurfaceEntity(
-                    getRtStereoMode(stereoMode),
-                    rtCanvasShape,
-                    pose,
-                    adapter.activitySpaceRootImpl,
-                ),
-                entityManager,
-                canvasShape,
-            )
-        }
-
-        /**
-         * Public factory function for a SurfaceEntity.
-         *
-         * This method must be called from the main thread.
-         * https://developer.android.com/guide/components/processes-and-threads
-         *
-         * @param session Session to create the SurfaceEntity in.
-         * @param stereoMode Stereo mode for the surface.
-         * @param pose Pose of this entity relative to its parent, default value is Identity.
-         * @param canvasShape The [CanvasShape] which describes the spatialized shape of the canvas.
-         * @return a SurfaceEntity instance
-         */
-        @MainThread
-        @JvmOverloads
-        @JvmStatic
-        public fun create(
-            session: Session,
-            stereoMode: Int = SurfaceEntity.StereoMode.SIDE_BY_SIDE,
-            pose: Pose = Pose.Identity,
-            canvasShape: CanvasShape = CanvasShape.Quad(1.0f, 1.0f),
-        ): SurfaceEntity =
-            SurfaceEntity.create(
-                session.platformAdapter,
-                session.entityManager,
-                stereoMode,
-                pose,
-                canvasShape,
-            )
-    }
-
-    /**
-     * Controls how the surface content will be routed for stereo viewing. Applications must render
-     * into the surface in accordance with what is specified here in order for the compositor to
-     * correctly produce a stereoscopic view to the user.
-     *
-     * Values must be one of the values from [StereoMode].
-     */
-    public var stereoMode: Int
-        get() = rtEntity.stereoMode
-        @MainThread
-        set(value) {
-            rtEntity.stereoMode = getRtStereoMode(value)
-        }
-
-    /**
-     * Returns the dimensions of the Entity.
-     *
-     * This is the size of the canvas in the local spatial coordinate system of the entity. This
-     * field cannot be directly set - to update the dimensions of the canvas, update the value of
-     * [canvasShape].
-     */
-    public val dimensions: Dimensions
-        get() = rtEntity.dimensions.toDimensions()
-
-    /**
-     * The shape of the canvas that backs the Entity.
-     *
-     * Updating this value will alter the dimensions of the Entity.
-     */
-    public var canvasShape: CanvasShape = canvasShape
-        @MainThread
-        set(value) {
-            val rtCanvasShape =
-                when (value) {
-                    is CanvasShape.Quad ->
-                        JxrPlatformAdapter.SurfaceEntity.CanvasShape.Quad(value.width, value.height)
-                    is CanvasShape.Vr360Sphere ->
-                        JxrPlatformAdapter.SurfaceEntity.CanvasShape.Vr360Sphere(value.radius)
-                    is CanvasShape.Vr180Hemisphere ->
-                        JxrPlatformAdapter.SurfaceEntity.CanvasShape.Vr180Hemisphere(value.radius)
-                    else -> throw IllegalArgumentException("Unsupported canvas shape: $value")
-                }
-            rtEntity.setCanvasShape(rtCanvasShape)
-            field = value
-        }
-
-    /**
-     * Returns a surface into which the application can render stereo image content.
-     *
-     * This method must be called from the main thread.
-     * https://developer.android.com/guide/components/processes-and-threads
-     */
-    @MainThread
-    public fun getSurface(): Surface {
-        return rtEntity.surface
-    }
-}
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Texture.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Texture.kt
index b90dc72f..f3dbdb2 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Texture.kt
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Texture.kt
@@ -21,15 +21,16 @@
 import androidx.concurrent.futures.ResolvableFuture
 import androidx.xr.scenecore.JxrPlatformAdapter.TextureResource as RtTextureResource
 import com.google.common.util.concurrent.ListenableFuture
+import java.lang.ref.WeakReference
 
 /** [Texture] represents a texture that can be used with materials. */
 @Suppress("NotCloseable")
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public open class Texture
 internal constructor(
-    internal val texture: RtTextureResource,
-    internal val sampler: TextureSampler = TextureSampler.create(),
-    internal val session: Session,
+    public val texture: RtTextureResource,
+    public val sampler: TextureSampler = TextureSampler.create(),
+    public val session: WeakReference<Session>,
 ) {
 
     /**
@@ -45,7 +46,7 @@
     // TODO(b/376277201): Provide Session.GltfModel.dispose().
     @MainThread
     public open fun dispose() {
-        session.platformAdapter.destroyTexture(texture)
+        session.get()!!.platformAdapter.destroyTexture(texture)
     }
 
     public companion object {
@@ -54,7 +55,7 @@
             platformAdapter: JxrPlatformAdapter,
             name: String,
             sampler: TextureSampler,
-            session: Session,
+            session: WeakReference<Session>,
         ): ListenableFuture<Texture> {
             val textureResourceFuture =
                 platformAdapter.loadTexture(name, sampler.toRtTextureSampler())
@@ -96,7 +97,9 @@
             name: String,
             sampler: TextureSampler,
         ): ListenableFuture<Texture> {
-            return createAsync(session.platformAdapter, name, sampler, session)
+            // The WeakReference prevents the Session (and its Activity) from being held in memory
+            // indefinitely.
+            return createAsync(session.platformAdapter, name, sampler, WeakReference(session))
         }
     }
 }
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Utils.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Utils.kt
index 8bbcca2..4f57e27 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Utils.kt
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/Utils.kt
@@ -82,16 +82,6 @@
     }
 }
 
-/** Extension function that converts [Space] value to [JxrPlatformAdapter.Space] value. */
-internal fun Int.toRtSpace(): Int {
-    return when (this) {
-        Space.PARENT -> JxrPlatformAdapter.Space.PARENT
-        Space.ACTIVITY -> JxrPlatformAdapter.Space.ACTIVITY
-        Space.REAL_WORLD -> JxrPlatformAdapter.Space.REAL_WORLD
-        else -> error("Unknown Space Value: $this")
-    }
-}
-
 /** Extension function that converts a [RtMoveEvent] to a [MoveEvent]. */
 internal fun RtMoveEvent.toMoveEvent(entityManager: EntityManager): MoveEvent {
 
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/WaterMaterial.kt b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/WaterMaterial.kt
index e40e9e4..fdab0f3 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/WaterMaterial.kt
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/WaterMaterial.kt
@@ -19,23 +19,16 @@
 import androidx.annotation.MainThread
 import androidx.annotation.RestrictTo
 import androidx.concurrent.futures.ResolvableFuture
-import androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource as RtMaterial
+import androidx.xr.runtime.math.Vector4
+import androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource as RtMaterialResource
 import com.google.common.util.concurrent.ListenableFuture
 
-/** Represents a Material in SceneCore. */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public open class Material(internal val material: RtMaterial?)
-
 /** A Material which implements a water effect. */
 // TODO(b/396201066): Add unit tests for this class if we end up making it public.
 @Suppress("NotCloseable")
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class WaterMaterial
-internal constructor(
-    internal val materialResource: RtMaterial,
-    internal val isAlphaMapVersion: Boolean,
-    internal val session: Session,
-) : Material(materialResource) {
+internal constructor(public val material: RtMaterialResource, public val session: Session) {
 
     /**
      * Disposes the given water material resource.
@@ -50,7 +43,7 @@
     // TODO(b/376277201): Provide Session.GltfModel.dispose().
     @MainThread
     public fun dispose() {
-        session.platformAdapter.destroyWaterMaterial(materialResource)
+        session.platformAdapter.destroyWaterMaterial(material)
     }
 
     /**
@@ -63,7 +56,7 @@
      */
     @MainThread
     public fun setReflectionCube(reflectionCube: CubeMapTexture) {
-        session.platformAdapter.setReflectionCube(materialResource, reflectionCube.texture)
+        session.platformAdapter.setReflectionCube(material, reflectionCube.texture)
     }
 
     /**
@@ -76,7 +69,7 @@
      */
     @MainThread
     public fun setNormalMap(normalMap: Texture) {
-        session.platformAdapter.setNormalMap(materialResource, normalMap.texture)
+        session.platformAdapter.setNormalMap(material, normalMap.texture)
     }
 
     /**
@@ -89,7 +82,7 @@
      */
     @MainThread
     public fun setNormalTiling(normalTiling: Float) {
-        session.platformAdapter.setNormalTiling(materialResource, normalTiling)
+        session.platformAdapter.setNormalTiling(material, normalTiling)
     }
 
     /**
@@ -102,87 +95,46 @@
      */
     @MainThread
     public fun setNormalSpeed(normalSpeed: Float) {
-        session.platformAdapter.setNormalSpeed(materialResource, normalSpeed)
+        session.platformAdapter.setNormalSpeed(material, normalSpeed)
     }
 
     /**
-     * Sets the alpha step multiplier for the alpha map version of the water material.
+     * Sets the alpha step U for the water material.
+     *
+     * This method must be called from the main thread.
+     * https://developer.android.com/guide/components/processes-and-threads
+     *
+     * @param alphaStepU The alpha step U.
+     */
+    @MainThread
+    public fun setAlphaStepU(alphaStepU: Vector4) {
+        session.platformAdapter.setAlphaStepU(material, alphaStepU)
+    }
+
+    /**
+     * Sets the alpha step V for the water material.
+     *
+     * This method must be called from the main thread.
+     * https://developer.android.com/guide/components/processes-and-threads
+     *
+     * @param alphaStepV The alpha step V.
+     */
+    @MainThread
+    public fun setAlphaStepV(alphaStepV: Vector4) {
+        session.platformAdapter.setAlphaStepV(material, alphaStepV)
+    }
+
+    /**
+     * Sets the alpha step multiplier for the water material.
      *
      * This method must be called from the main thread.
      * https://developer.android.com/guide/components/processes-and-threads
      *
      * @param alphaStepMultiplier The alpha step multiplier.
-     * @throws IllegalStateException if the water material is not the alpha map version.
      */
     @MainThread
     public fun setAlphaStepMultiplier(alphaStepMultiplier: Float) {
-        if (isAlphaMapVersion) {
-            session.platformAdapter.setAlphaStepMultiplier(materialResource, alphaStepMultiplier)
-        } else {
-            throw IllegalStateException(
-                "The alpha step multiplier can only be set for alpha map version of the water material."
-            )
-        }
-    }
-
-    /**
-     * Sets the alpha map for the alpha map version of the water material.
-     *
-     * This method must be called from the main thread.
-     * https://developer.android.com/guide/components/processes-and-threads
-     *
-     * @param alphaMap The alpha map.
-     * @throws IllegalStateException if the water material is not the alpha map version.
-     */
-    @MainThread
-    public fun setAlphaMap(alphaMap: Texture) {
-        if (isAlphaMapVersion) {
-            session.platformAdapter.setAlphaMap(materialResource, alphaMap.texture)
-        } else {
-            throw IllegalStateException(
-                "The alpha map can only be set for alpha map version of the water material."
-            )
-        }
-    }
-
-    /**
-     * Sets the normal z for the alpha map version of the water material.
-     *
-     * This method must be called from the main thread.
-     * https://developer.android.com/guide/components/processes-and-threads
-     *
-     * @param normalZ The normal z.
-     * @throws IllegalStateException if the water material is not the alpha map version.
-     */
-    @MainThread
-    public fun setNormalZ(normalZ: Float) {
-        if (isAlphaMapVersion) {
-            session.platformAdapter.setNormalZ(materialResource, normalZ)
-        } else {
-            throw IllegalStateException(
-                "The normal Z can only be set for alpha map version of the water material.."
-            )
-        }
-    }
-
-    /**
-     * Sets the normal boundary for the alpha map version of the water material.
-     *
-     * This method must be called from the main thread.
-     * https://developer.android.com/guide/components/processes-and-threads
-     *
-     * @param normalBoundary The normal boundary.
-     * @throws IllegalStateException if the water material is not the alpha map version.
-     */
-    @MainThread
-    public fun setNormalBoundary(normalBoundary: Float) {
-        if (isAlphaMapVersion) {
-            session.platformAdapter.setNormalBoundary(materialResource, normalBoundary)
-        } else {
-            throw IllegalStateException(
-                "The normal boundary can only be set for alpha map version of the water material."
-            )
-        }
+        session.platformAdapter.setAlphaStepMultiplier(material, alphaStepMultiplier)
     }
 
     public companion object {
@@ -193,10 +145,10 @@
         @SuppressWarnings("RestrictTo")
         internal fun createAsync(
             platformAdapter: JxrPlatformAdapter,
-            isAlphaMapVersion: Boolean,
+            transparent: Boolean,
             session: Session,
         ): ListenableFuture<WaterMaterial> {
-            val materialResourceFuture = platformAdapter.createWaterMaterial(isAlphaMapVersion)
+            val materialResourceFuture = platformAdapter.createWaterMaterial(transparent)
             val materialFuture = ResolvableFuture.create<WaterMaterial>()
 
             // TODO: b/375070346 - remove this `!!` when we're sure the future is non-null.
@@ -204,7 +156,7 @@
                 {
                     try {
                         val material = materialResourceFuture.get()
-                        materialFuture.set(WaterMaterial(material, isAlphaMapVersion, session))
+                        materialFuture.set(WaterMaterial(material, session))
                     } catch (e: Exception) {
                         if (e is InterruptedException) {
                             Thread.currentThread().interrupt()
@@ -224,18 +176,17 @@
          * This method must be called from the main thread.
          * https://developer.android.com/guide/components/processes-and-threads
          *
+         * Currently, only URLs and relative paths from the android_assets/ directory are supported.
+         *
          * @param session The [Session] to use for loading the model.
-         * @param isAlphaMapVersion If the water material should be the alpha map version or not.
+         * @param transparent If the water material should have transparency or not.
          * @return a ListenableFuture<WaterMaterial>. Listeners will be called on the main thread if
          *   Runnable::run is supplied.
          */
         @MainThread
         @JvmStatic
-        public fun create(
-            session: Session,
-            isAlphaMapVersion: Boolean,
-        ): ListenableFuture<WaterMaterial> {
-            return WaterMaterial.createAsync(session.platformAdapter, isAlphaMapVersion, session)
+        public fun create(session: Session, transparent: Boolean): ListenableFuture<WaterMaterial> {
+            return WaterMaterial.createAsync(session.platformAdapter, transparent, session)
         }
     }
 }
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/common/BaseEntity.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/common/BaseEntity.java
index 8819cd0..8fa2041 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/common/BaseEntity.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/common/BaseEntity.java
@@ -25,8 +25,6 @@
 import androidx.xr.runtime.math.Vector3;
 import androidx.xr.scenecore.JxrPlatformAdapter.Component;
 import androidx.xr.scenecore.JxrPlatformAdapter.Entity;
-import androidx.xr.scenecore.JxrPlatformAdapter.Space;
-import androidx.xr.scenecore.JxrPlatformAdapter.SpaceValue;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -81,12 +79,12 @@
             Log.e("RealityCoreRuntime", "Cannot set non-BaseEntity as a parent of a BaseEntity");
             return;
         }
-        if (mParent != null) {
-            mParent.removeChildInternal(this);
+        if (this.mParent != null) {
+            this.mParent.removeChildInternal(this);
         }
-        mParent = (BaseEntity) parent;
-        if (mParent != null) {
-            mParent.addChildInternal(this);
+        this.mParent = (BaseEntity) parent;
+        if (this.mParent != null) {
+            this.mParent.addChildInternal(this);
         }
     }
 
@@ -104,13 +102,13 @@
 
     @Override
     @NonNull
-    public Pose getPose(@SpaceValue int relativeTo) {
+    public Pose getPose() {
         return mPose;
     }
 
     @Override
-    public void setPose(@NonNull Pose pose, @SpaceValue int relativeTo) {
-        mPose = pose;
+    public void setPose(@NonNull Pose pose) {
+        this.mPose = pose;
     }
 
     @Override
@@ -125,76 +123,38 @@
         return mParent.getActivitySpacePose()
                 .compose(
                         new Pose(
-                                mPose.getTranslation().times(mParent.getWorldSpaceScale()),
-                                mPose.getRotation()));
+                                this.mPose.getTranslation().times(mParent.getWorldSpaceScale()),
+                                this.mPose.getRotation()));
     }
 
     @Override
     @NonNull
-    public Vector3 getScale(@SpaceValue int relativeTo) {
-        switch (relativeTo) {
-            case Space.PARENT:
-                return mScale;
-            case Space.ACTIVITY:
-                return getActivitySpaceScale();
-            case Space.REAL_WORLD:
-                return getWorldSpaceScale();
-            default:
-                throw new IllegalArgumentException("Unsupported relativeTo value: " + relativeTo);
-        }
+    public Vector3 getScale() {
+        return mScale;
     }
 
     @Override
-    public void setScale(@NonNull Vector3 scale, @SpaceValue int relativeTo) {
-        switch (relativeTo) {
-            case Space.PARENT:
-                mScale = scale;
-                break;
-            case Space.ACTIVITY:
-                mScale = scale.div(getActivitySpaceScale());
-                break;
-            case Space.REAL_WORLD:
-                mScale = scale.div(getWorldSpaceScale());
-                break;
-            default:
-                throw new IllegalArgumentException("Unsupported relativeTo value: " + relativeTo);
-        }
+    public void setScale(@NonNull Vector3 scale) {
+        this.mScale = scale;
     }
 
     // Purely sets the value of the scale.
     protected final void setScaleInternal(@NonNull Vector3 scale) {
-        mScale = scale;
+        this.mScale = scale;
     }
 
     @Override
-    public float getAlpha(@SpaceValue int relativeTo) {
-        switch (relativeTo) {
-            case Space.PARENT:
-                return mAlpha;
-            case Space.ACTIVITY:
-            case Space.REAL_WORLD:
-                return getActivitySpaceAlpha();
-            default:
-                throw new IllegalArgumentException("Unsupported relativeTo value: " + relativeTo);
-        }
+    public float getAlpha() {
+        return mAlpha;
     }
 
     @Override
-    public void setAlpha(float alpha, @SpaceValue int relativeTo) {
-        switch (relativeTo) {
-            case Space.PARENT:
-                mAlpha = alpha;
-                break;
-            case Space.ACTIVITY:
-            case Space.REAL_WORLD:
-                mAlpha = alpha / getActivitySpaceAlpha();
-                break;
-            default:
-                throw new IllegalArgumentException("Unsupported relativeTo value: " + relativeTo);
-        }
+    public void setAlpha(float alpha) {
+        this.mAlpha = alpha;
     }
 
-    private float getActivitySpaceAlpha() {
+    @Override
+    public float getActivitySpaceAlpha() {
         if (mParent == null) {
             return mAlpha;
         }
@@ -207,7 +167,7 @@
         if (mParent == null) {
             throw new IllegalStateException("Cannot get scale in WorldSpace with a null parent");
         }
-        return mParent.getWorldSpaceScale().times(mScale);
+        return mParent.getWorldSpaceScale().times(this.mScale);
     }
 
     @Override
@@ -216,7 +176,7 @@
         if (mParent == null) {
             throw new IllegalStateException("Cannot get scale in ActivitySpace with a null parent");
         }
-        return mParent.getActivitySpaceScale().times(mScale);
+        return mParent.getActivitySpaceScale().times(this.mScale);
     }
 
     @Override
@@ -229,7 +189,7 @@
 
     @Override
     public void setHidden(boolean hidden) {
-        mHidden = hidden;
+        this.mHidden = hidden;
     }
 
     @Override
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ActivityPanelEntityImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ActivityPanelEntityImpl.java
index e34343d..fdf93d7 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ActivityPanelEntityImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ActivityPanelEntityImpl.java
@@ -22,16 +22,14 @@
 import android.os.Bundle;
 import android.util.Log;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.node.Node;
+import androidx.xr.extensions.node.NodeTransaction;
+import androidx.xr.extensions.space.ActivityPanel;
 import androidx.xr.scenecore.JxrPlatformAdapter.ActivityPanelEntity;
 import androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.NodeTransaction;
-import com.android.extensions.xr.space.ActivityPanel;
-
 import java.util.Objects;
 import java.util.concurrent.ScheduledExecutorService;
 
@@ -54,7 +52,7 @@
         super(node, extensions, entityManager, executor);
         // We need to notify our base class of the pixelDimensions, even though the Extensions are
         // initialized in the factory method. (ext.ActivityPanel.setWindowBounds, etc)
-        super.setSizeInPixels(windowBoundsPx);
+        super.setPixelDimensions(windowBoundsPx);
         float cornerRadius = getDefaultCornerRadiusInMeters();
         try (NodeTransaction transaction = mExtensions.createNodeTransaction()) {
             transaction
@@ -68,7 +66,7 @@
     }
 
     @Override
-    public void launchActivity(@NonNull Intent intent, @Nullable Bundle bundle) {
+    public void launchActivity(Intent intent, @Nullable Bundle bundle) {
         // Note that launching an Activity into the Panel doesn't actually update the size. The
         // application is expected to set the size of the ActivityPanel at construction time, before
         // launching an Activity into it. The Activity will then render into the size the
@@ -78,7 +76,7 @@
     }
 
     @Override
-    public void moveActivity(@NonNull Activity activity) {
+    public void moveActivity(Activity activity) {
         // Note that moving an Activity into the Panel doesn't actually update the size. The
         // application
         // should explicitly call setPixelDimensions() to update the size of an ActivityPanel.
@@ -86,9 +84,9 @@
     }
 
     @Override
-    public void setSizeInPixels(@NonNull PixelDimensions dimensions) {
+    public void setPixelDimensions(PixelDimensions dimensions) {
         PixelDimensions oldDimensions = mPixelDimensions;
-        super.setSizeInPixels(dimensions);
+        super.setPixelDimensions(dimensions);
 
         // Avoid updating the bounds if we were called with the same values.
         if (Objects.equals(oldDimensions, dimensions)) {
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ActivitySpaceImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ActivitySpaceImpl.java
index 1dcf18b..120e958 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ActivitySpaceImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ActivitySpaceImpl.java
@@ -19,17 +19,15 @@
 import android.util.Log;
 
 import androidx.annotation.NonNull;
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.node.Node;
+import androidx.xr.extensions.space.Bounds;
+import androidx.xr.extensions.space.SpatialState;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Vector3;
 import androidx.xr.scenecore.JxrPlatformAdapter.ActivitySpace;
 import androidx.xr.scenecore.JxrPlatformAdapter.Dimensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.Entity;
-import androidx.xr.scenecore.JxrPlatformAdapter.SpaceValue;
-
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.space.Bounds;
-import com.android.extensions.xr.space.SpatialState;
 
 import java.util.Collections;
 import java.util.HashSet;
@@ -43,7 +41,7 @@
  *
  * <p>This is used to create an entity that contains the task node.
  */
-@SuppressWarnings({"UnnecessarilyFullyQualified"})
+@SuppressWarnings({"deprecation", "UnnecessarilyFullyQualified"}) // TODO(b/373435470): Remove
 final class ActivitySpaceImpl extends SystemSpaceEntityImpl implements ActivitySpace {
 
     private static final String TAG = "ActivitySpaceImpl";
@@ -91,7 +89,7 @@
     }
 
     @Override
-    public void setScale(@NonNull Vector3 scale, @SpaceValue int relativeTo) {
+    public void setScale(@NonNull Vector3 scale) {
         // TODO(b/349391097): make this behavior consistent with AnchorEntityImpl
         Log.e(TAG, "Cannot set scale for the ActivitySpace.");
     }
@@ -103,7 +101,6 @@
         super.dispose();
     }
 
-    @NonNull
     @Override
     public Dimensions getBounds() {
         // The bounds are kept in sync with the Extensions in the onBoundsChangedEvent callback. We
@@ -113,8 +110,7 @@
                 oldBounds -> {
                     if (oldBounds == null) {
                         Bounds bounds = mSpatialStateProvider.get().getBounds();
-                        return new Dimensions(
-                                bounds.getWidth(), bounds.getHeight(), bounds.getDepth());
+                        return new Dimensions(bounds.width, bounds.height, bounds.depth);
                     }
                     return oldBounds;
                 });
@@ -141,10 +137,7 @@
         Dimensions newDimensions =
                 mBounds.updateAndGet(
                         oldBounds ->
-                                new Dimensions(
-                                        newBounds.getWidth(),
-                                        newBounds.getHeight(),
-                                        newBounds.getDepth()));
+                                new Dimensions(newBounds.width, newBounds.height, newBounds.depth));
         for (OnBoundsChangedListener listener : mBoundsListeners) {
             listener.onBoundsChanged(newDimensions);
         }
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/AnchorEntityImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/AnchorEntityImpl.java
index 506f7d4..2974d09 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/AnchorEntityImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/AnchorEntityImpl.java
@@ -26,25 +26,24 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.core.content.ContextCompat;
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.node.Node;
+import androidx.xr.extensions.node.NodeTransaction;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Vector3;
 import androidx.xr.runtime.openxr.ExportableAnchor;
 import androidx.xr.scenecore.JxrPlatformAdapter.ActivitySpace;
 import androidx.xr.scenecore.JxrPlatformAdapter.AnchorEntity;
+import androidx.xr.scenecore.JxrPlatformAdapter.AnchorEntity.OnStateChangedListener;
 import androidx.xr.scenecore.JxrPlatformAdapter.Dimensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.Entity;
 import androidx.xr.scenecore.JxrPlatformAdapter.PlaneSemantic;
 import androidx.xr.scenecore.JxrPlatformAdapter.PlaneType;
-import androidx.xr.scenecore.JxrPlatformAdapter.SpaceValue;
 import androidx.xr.scenecore.impl.perception.Anchor;
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
 import androidx.xr.scenecore.impl.perception.Plane;
 import androidx.xr.scenecore.impl.perception.Plane.PlaneData;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.NodeTransaction;
-
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.time.Duration;
@@ -575,17 +574,17 @@
 
     @NonNull
     @Override
-    public Pose getPose(@SpaceValue int relativeTo) {
+    public Pose getPose() {
         throw new UnsupportedOperationException("Cannot get 'pose' on an AnchorEntity.");
     }
 
     @Override
-    public void setPose(@NonNull Pose pose, @SpaceValue int relativeTo) {
+    public void setPose(@NonNull Pose pose) {
         throw new UnsupportedOperationException("Cannot set 'pose' on an AnchorEntity.");
     }
 
     @Override
-    public void setScale(@NonNull Vector3 scale, @SpaceValue int relativeTo) {
+    public void setScale(@NonNull Vector3 scale) {
         // TODO(b/349391097): make this behavior consistent with ActivitySpaceImpl
         throw new UnsupportedOperationException("Cannot set 'scale' on an AnchorEntity.");
     }
@@ -654,7 +653,8 @@
         // entity
         // was always null so does not need to be reset.
         try (NodeTransaction transaction = mExtensions.createNodeTransaction()) {
-            transaction.setAnchorId(mNode, null).setParent(mNode, null).apply();
+            transaction.setAnchorId(mNode, null);
+            transaction.setParent(mNode, null).apply();
         }
         super.dispose();
     }
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/AndroidXrEntity.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/AndroidXrEntity.java
index 53bdbdb..c44de0a 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/AndroidXrEntity.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/AndroidXrEntity.java
@@ -19,26 +19,22 @@
 import android.util.Log;
 
 import androidx.annotation.NonNull;
+import androidx.xr.extensions.Consumer;
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.node.InputEvent;
+import androidx.xr.extensions.node.Node;
+import androidx.xr.extensions.node.NodeTransaction;
+import androidx.xr.extensions.node.ReformEvent;
+import androidx.xr.extensions.node.ReformOptions;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Quaternion;
 import androidx.xr.runtime.math.Vector3;
-import androidx.xr.scenecore.JxrPlatformAdapter.ActivitySpace;
+import androidx.xr.scenecore.JxrPlatformAdapter.Dimensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.Entity;
 import androidx.xr.scenecore.JxrPlatformAdapter.InputEventListener;
-import androidx.xr.scenecore.JxrPlatformAdapter.PerceptionSpaceActivityPose;
 import androidx.xr.scenecore.JxrPlatformAdapter.PointerCaptureComponent;
-import androidx.xr.scenecore.JxrPlatformAdapter.Space;
-import androidx.xr.scenecore.JxrPlatformAdapter.SpaceValue;
 import androidx.xr.scenecore.common.BaseEntity;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.function.Consumer;
-import com.android.extensions.xr.node.InputEvent;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.NodeTransaction;
-import com.android.extensions.xr.node.ReformEvent;
-import com.android.extensions.xr.node.ReformOptions;
-
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executor;
@@ -78,65 +74,33 @@
         mEntityManager.setEntityForNode(node, this);
     }
 
-    @NonNull
     @Override
-    public Pose getPose(@SpaceValue int relativeTo) {
-        switch (relativeTo) {
-            case Space.PARENT:
-                return super.getPose(relativeTo);
-            case Space.ACTIVITY:
-                return getPoseInActivitySpace();
-            case Space.REAL_WORLD:
-                return getPoseInPerceptionSpace();
-            default:
-                throw new IllegalArgumentException("Unsupported relativeTo value: " + relativeTo);
-        }
-    }
-
-    @Override
-    public void setPose(@NonNull Pose pose, @SpaceValue int relativeTo) {
+    public void setPose(@NonNull Pose pose) {
         // TODO: b/321268237 - Minimize the number of node transactions
-        Pose localPose;
-        switch (relativeTo) {
-            case Space.PARENT:
-                localPose = pose;
-                break;
-            case Space.ACTIVITY:
-                localPose = getLocalPoseForActivitySpacePose(pose);
-                break;
-            case Space.REAL_WORLD:
-                localPose = getLocalPoseForPerceptionSpacePose(pose);
-                break;
-            default:
-                throw new IllegalArgumentException("Unsupported relativeTo value: " + relativeTo);
-        }
-        super.setPose(localPose, Space.PARENT);
+        super.setPose(pose);
 
         try (NodeTransaction transaction = mExtensions.createNodeTransaction()) {
             transaction
                     .setPosition(
                             mNode,
-                            localPose.getTranslation().getX(),
-                            localPose.getTranslation().getY(),
-                            localPose.getTranslation().getZ())
+                            pose.getTranslation().getX(),
+                            pose.getTranslation().getY(),
+                            pose.getTranslation().getZ())
                     .setOrientation(
                             mNode,
-                            localPose.getRotation().getX(),
-                            localPose.getRotation().getY(),
-                            localPose.getRotation().getZ(),
-                            localPose.getRotation().getW())
+                            pose.getRotation().getX(),
+                            pose.getRotation().getY(),
+                            pose.getRotation().getZ(),
+                            pose.getRotation().getW())
                     .apply();
         }
     }
 
     @Override
-    public void setScale(@NonNull Vector3 scale, @SpaceValue int relativeTo) {
-        super.setScale(scale, relativeTo);
-        Vector3 localScale = super.getScale(Space.PARENT);
+    public void setScale(@NonNull Vector3 scale) {
+        super.setScale(scale);
         try (NodeTransaction transaction = mExtensions.createNodeTransaction()) {
-            transaction
-                    .setScale(mNode, localScale.getX(), localScale.getY(), localScale.getZ())
-                    .apply();
+            transaction.setScale(mNode, scale.getX(), scale.getY(), scale.getZ()).apply();
         }
     }
 
@@ -159,42 +123,16 @@
         return xrParent.getPoseInActivitySpace()
                 .compose(
                         new Pose(
-                                getPose(Space.PARENT)
-                                        .getTranslation()
-                                        .times(xrParent.getActivitySpaceScale()),
-                                getPose(Space.PARENT).getRotation()));
+                                getPose().getTranslation().times(xrParent.getActivitySpaceScale()),
+                                getPose().getRotation()));
     }
 
-    private Pose getPoseInPerceptionSpace() {
-        PerceptionSpaceActivityPose perceptionSpaceActivityPose =
-                mEntityManager
-                        .getSystemSpaceActivityPoseOfType(PerceptionSpaceActivityPose.class)
-                        .get(0);
-        return transformPoseTo(new Pose(), perceptionSpaceActivityPose);
-    }
-
-    private Pose getLocalPoseForActivitySpacePose(Pose pose) {
-        if (!(getParent() instanceof AndroidXrEntity)) {
-            throw new IllegalStateException(
-                    "Cannot get pose in Activity Space with a non-AndroidXrEntity parent");
-        }
-        AndroidXrEntity xrParent = (AndroidXrEntity) getParent();
-        ActivitySpace activitySpace =
-                mEntityManager.getSystemSpaceActivityPoseOfType(ActivitySpace.class).get(0);
-        return activitySpace.transformPoseTo(pose, xrParent);
-    }
-
-    private Pose getLocalPoseForPerceptionSpacePose(Pose pose) {
-        if (!(getParent() instanceof AndroidXrEntity)) {
-            throw new IllegalStateException(
-                    "Cannot get pose in Activity Space with a non-AndroidXrEntity parent");
-        }
-        AndroidXrEntity xrParent = (AndroidXrEntity) getParent();
-        PerceptionSpaceActivityPose perceptionSpaceActivityPose =
-                mEntityManager
-                        .getSystemSpaceActivityPoseOfType(PerceptionSpaceActivityPose.class)
-                        .get(0);
-        return perceptionSpaceActivityPose.transformPoseTo(pose, xrParent);
+    /**
+     * This method should be called when the ActivitySpace's underlying base space has been updated.
+     * For example, this method should be called when the task node moves in XrExtensions.
+     */
+    public void onActivitySpaceUpdated() {
+        // Defaults to a no-op.
     }
 
     // Returns the underlying extension Node for the Entity.
@@ -216,20 +154,29 @@
 
         try (NodeTransaction transaction = mExtensions.createNodeTransaction()) {
             if (xrParent == null) {
-                NodeTransaction unused =
-                        transaction.setVisibility(mNode, false).setParent(mNode, null);
+                transaction.setVisibility(mNode, false).setParent(mNode, null);
             } else {
-                NodeTransaction unused = transaction.setParent(mNode, xrParent.getNode());
+                transaction.setParent(mNode, xrParent.getNode());
             }
             transaction.apply();
         }
     }
 
     @Override
-    public void setAlpha(float alpha, @SpaceValue int relativeTo) {
-        super.setAlpha(alpha, relativeTo);
+    public void setSize(@NonNull Dimensions dimensions) {
+        // TODO: b/326479171: Uncomment when extensions implement setSize.
+        // try (NodeTransaction transaction = mExtensions.createNodeTransaction()) {
+        //   transaction.setSize(mNode, dimensions.width, dimensions.height,
+        // dimensions.depth).apply();
+        // }
+    }
+
+    @Override
+    public void setAlpha(float alpha) {
+        super.setAlpha(alpha);
+
         try (NodeTransaction transaction = mExtensions.createNodeTransaction()) {
-            transaction.setAlpha(mNode, super.getAlpha(relativeTo)).apply();
+            transaction.setAlpha(mNode, alpha).apply();
         }
     }
 
@@ -242,10 +189,10 @@
                 if (hidden) {
                     // Since this entity is being hidden, disable reform and the highlights around
                     // the node.
-                    NodeTransaction unused = transaction.disableReform(mNode);
+                    transaction.disableReform(mNode);
                 } else {
                     // Enables reform and the highlights around the node.
-                    NodeTransaction unused = transaction.enableReform(mNode, mReformOptions);
+                    transaction.enableReform(mNode, mReformOptions);
                 }
             }
             transaction.setVisibility(mNode, !hidden).apply();
@@ -361,7 +308,7 @@
         mNode.stopListeningForInput();
         mReformEventConsumerMap.clear();
         try (NodeTransaction transaction = mExtensions.createNodeTransaction()) {
-            NodeTransaction unused = transaction.disableReform(mNode);
+            transaction.disableReform(mNode);
         }
 
         // SystemSpaceEntityImpls (Anchors, ActivitySpace, etc) should have null parents.
@@ -396,8 +343,7 @@
                                                     reformEvent.getProposedOrientation().x,
                                                     reformEvent.getProposedOrientation().y,
                                                     reformEvent.getProposedOrientation().z,
-                                                    reformEvent.getProposedOrientation().w)),
-                                    Space.PARENT);
+                                                    reformEvent.getProposedOrientation().w)));
                             // Update the cached scale of the entity.
                             super.setScaleInternal(
                                     new Vector3(
@@ -423,10 +369,10 @@
         try (NodeTransaction transaction = mExtensions.createNodeTransaction()) {
             if (mReformOptions.getEnabledReform() == 0) {
                 // Disables reform and the highlights around the node.
-                NodeTransaction unused = transaction.disableReform(mNode);
+                transaction.disableReform(mNode);
             } else {
                 // Enables reform and the highlights around the node.
-                NodeTransaction unused = transaction.enableReform(mNode, mReformOptions);
+                transaction.enableReform(mNode, mReformOptions);
             }
             transaction.apply();
         }
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/AudioTrackExtensionsWrapperImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/AudioTrackExtensionsWrapperImpl.java
index c2df7e3..9ebcad34 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/AudioTrackExtensionsWrapperImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/AudioTrackExtensionsWrapperImpl.java
@@ -20,13 +20,12 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.xr.extensions.media.AudioTrackExtensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.AudioTrackExtensionsWrapper;
 import androidx.xr.scenecore.JxrPlatformAdapter.Entity;
 import androidx.xr.scenecore.JxrPlatformAdapter.PointSourceAttributes;
 import androidx.xr.scenecore.JxrPlatformAdapter.SoundFieldAttributes;
 
-import com.android.extensions.xr.media.AudioTrackExtensions;
-
 /** Implementation of the {@link AudioTrackExtensionsWrapper} */
 final class AudioTrackExtensionsWrapperImpl implements AudioTrackExtensionsWrapper {
 
@@ -42,7 +41,7 @@
     @Nullable
     @Override
     public PointSourceAttributes getPointSourceAttributes(@NonNull AudioTrack audioTrack) {
-        com.android.extensions.xr.media.PointSourceAttributes extAttributes =
+        androidx.xr.extensions.media.PointSourceAttributes extAttributes =
                 mExtensions.getPointSourceAttributes(audioTrack);
 
         if (extAttributes == null) {
@@ -61,7 +60,7 @@
     @Nullable
     @Override
     public SoundFieldAttributes getSoundFieldAttributes(@NonNull AudioTrack audioTrack) {
-        com.android.extensions.xr.media.SoundFieldAttributes extAttributes =
+        androidx.xr.extensions.media.SoundFieldAttributes extAttributes =
                 mExtensions.getSoundFieldAttributes(audioTrack);
 
         if (extAttributes == null) {
@@ -81,7 +80,7 @@
     @NonNull
     public AudioTrack.Builder setPointSourceAttributes(
             @NonNull AudioTrack.Builder builder, @NonNull PointSourceAttributes attributes) {
-        com.android.extensions.xr.media.PointSourceAttributes extAttributes =
+        androidx.xr.extensions.media.PointSourceAttributes extAttributes =
                 MediaUtils.convertPointSourceAttributesToExtensions(attributes);
 
         return mExtensions.setPointSourceAttributes(builder, extAttributes);
@@ -91,7 +90,7 @@
     @NonNull
     public AudioTrack.Builder setSoundFieldAttributes(
             @NonNull AudioTrack.Builder builder, @NonNull SoundFieldAttributes attributes) {
-        com.android.extensions.xr.media.SoundFieldAttributes extAttributes =
+        androidx.xr.extensions.media.SoundFieldAttributes extAttributes =
                 MediaUtils.convertSoundFieldAttributesToExtensions(attributes);
 
         return mExtensions.setSoundFieldAttributes(builder, extAttributes);
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/BasePanelEntity.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/BasePanelEntity.java
index c7dd01f..99b30f5 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/BasePanelEntity.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/BasePanelEntity.java
@@ -24,18 +24,18 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.node.Node;
+import androidx.xr.extensions.node.NodeTransaction;
 import androidx.xr.runtime.math.Vector3;
 import androidx.xr.scenecore.JxrPlatformAdapter.Dimensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.PanelEntity;
 import androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.NodeTransaction;
-
 import java.util.concurrent.ScheduledExecutorService;
 
 /** BasePanelEntity provides implementations of capabilities common to PanelEntities. */
+@SuppressWarnings("deprecation") // TODO(b/373435470): Remove
 abstract class BasePanelEntity extends AndroidXrEntity implements PanelEntity {
     private static final float DEFAULT_CORNER_RADIUS_DP = 32.0f;
     protected PixelDimensions mPixelDimensions;
@@ -49,7 +49,7 @@
         super(node, extensions, entityManager, executor);
     }
 
-    protected float getDefaultPixelDensity() {
+    private float getDefaultPixelDensity() {
         return mExtensions
                 .getConfig()
                 .defaultPixelsPerMeter(Resources.getSystem().getDisplayMetrics().density);
@@ -91,9 +91,7 @@
         return radiusPixels / getDefaultPixelDensity();
     }
 
-    @NonNull
     @Override
-    @Deprecated
     public Vector3 getPixelDensity() {
         Vector3 scale = getWorldSpaceScale();
         float defaultPixelDensity = getDefaultPixelDensity();
@@ -103,31 +101,28 @@
                 defaultPixelDensity / scale.getZ());
     }
 
-    @NonNull
     @Override
     public Dimensions getSize() {
-        float pixelDensity = getDefaultPixelDensity();
+        Vector3 pixelDensity = getPixelDensity();
         return new Dimensions(
-                mPixelDimensions.width / pixelDensity, mPixelDimensions.height / pixelDensity, 0);
+                mPixelDimensions.width / pixelDensity.getX(),
+                mPixelDimensions.height / pixelDensity.getY(),
+                0);
     }
 
     @Override
     public void setSize(@NonNull Dimensions dimensions) {
-        float pixelDensity = getDefaultPixelDensity();
-        setSizeInPixels(
-                new PixelDimensions(
-                        (int) (dimensions.width * pixelDensity),
-                        (int) (dimensions.height * pixelDensity)));
+        // TODO(b/352630025): remove this method.
+        setPixelDimensions(new PixelDimensions((int) dimensions.width, (int) dimensions.height));
     }
 
-    @NonNull
     @Override
-    public PixelDimensions getSizeInPixels() {
+    public PixelDimensions getPixelDimensions() {
         return mPixelDimensions;
     }
 
     @Override
-    public void setSizeInPixels(@NonNull PixelDimensions dimensions) {
+    public void setPixelDimensions(PixelDimensions dimensions) {
         mPixelDimensions = dimensions;
     }
 
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/EntityManager.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/EntityManager.java
index d81bc4b..aaacd1d 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/EntityManager.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/EntityManager.java
@@ -20,12 +20,10 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.xr.extensions.node.NodeTypeConverter;
+import androidx.xr.extensions.node.Node;
 import androidx.xr.scenecore.JxrPlatformAdapter.ActivityPose;
 import androidx.xr.scenecore.JxrPlatformAdapter.Entity;
 
-import com.android.extensions.xr.node.Node;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -44,20 +42,6 @@
     /**
      * Returns the {@link Entity} associated with the given {@link Node}.
      *
-     * @deprecated Use the {@link Node} overload instead.
-     * @param node the {@link Node} to get the associated {@link Entity} for.
-     * @return the {@link Entity} associated with the given {@link Node}, or null if no such {@link
-     *     Entity} exists.
-     */
-    @Nullable
-    @Deprecated
-    Entity getEntityForNode(@NonNull androidx.xr.extensions.node.Node node) {
-        return mNodeEntityMap.get(NodeTypeConverter.toFramework(node));
-    }
-
-    /**
-     * Returns the {@link Entity} associated with the given {@link Node}.
-     *
      * @param node the {@link Node} to get the associated {@link Entity} for.
      * @return the {@link Entity} associated with the given {@link Node}, or null if no such {@link
      *     Entity} exists.
@@ -70,18 +54,6 @@
     /**
      * Sets the {@link Entity} associated with the given {@link Node}.
      *
-     * @deprecated Use the {@link Node} overload instead.
-     * @param node the {@link Node} to set the associated {@link Entity} for.
-     * @param entity the {@link Entity} to associate with the given {@link Node}.
-     */
-    @Deprecated
-    void setEntityForNode(@NonNull androidx.xr.extensions.node.Node node, @NonNull Entity entity) {
-        mNodeEntityMap.put(NodeTypeConverter.toFramework(node), entity);
-    }
-
-    /**
-     * Sets the {@link Entity} associated with the given {@link Node}.
-     *
      * @param node the {@link Node} to set the associated {@link Entity} for.
      * @param entity the {@link Entity} to associate with the given {@link Node}.
      */
@@ -107,16 +79,6 @@
         return mNodeEntityMap.values();
     }
 
-    /**
-     * Removes the given {@link androidx.xr.extensions.node.Node} from the map.
-     *
-     * @deprecated Use the {@link Node} overload instead.
-     */
-    @Deprecated
-    void removeEntityForNode(@NonNull androidx.xr.extensions.node.Node node) {
-        mNodeEntityMap.remove(NodeTypeConverter.toFramework(node));
-    }
-
     /** Removes the given {@link Node} from the map. */
     void removeEntityForNode(@NonNull Node node) {
         mNodeEntityMap.remove(node);
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ExrImageResourceImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ExrImageResourceImpl.java
index 1e7ce10..9628d57 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ExrImageResourceImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ExrImageResourceImpl.java
@@ -27,13 +27,13 @@
 @SuppressWarnings({"deprecation", "UnnecessarilyFullyQualified"}) // TODO(b/373435470): Remove
 final class ExrImageResourceImpl implements ExrImageResource {
     // Note: right now the "environment" format accessible through the XRExtensions layer is .EXR
-    private final com.android.extensions.xr.asset.EnvironmentToken mToken;
+    private final androidx.xr.extensions.asset.EnvironmentToken mToken;
 
-    ExrImageResourceImpl(com.android.extensions.xr.asset.EnvironmentToken token) {
+    ExrImageResourceImpl(androidx.xr.extensions.asset.EnvironmentToken token) {
         mToken = token;
     }
 
-    public com.android.extensions.xr.asset.EnvironmentToken getToken() {
+    public androidx.xr.extensions.asset.EnvironmentToken getToken() {
         return mToken;
     }
 }
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ExrImageResourceImplSplitEngine.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ExrImageResourceImplSplitEngine.java
deleted file mode 100644
index 84bc3d5..0000000
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ExrImageResourceImplSplitEngine.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.scenecore.impl;
-
-import androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource;
-
-/**
- * Implementation of a SceneCore ExrImageResource for the Split Engine.
- *
- * <p>EXR Images are high dynamic range images that can be used as environmental skyboxes, and can
- * be used for Image Based Lighting.
- */
-final class ExrImageResourceImplSplitEngine implements ExrImageResource {
-    private final long mToken;
-
-    ExrImageResourceImplSplitEngine(long token) {
-        mToken = token;
-    }
-
-    public long getExtensionImageToken() {
-        return mToken;
-    }
-}
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/GltfEntityImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/GltfEntityImpl.java
index a6b370d7..68523e5 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/GltfEntityImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/GltfEntityImpl.java
@@ -20,13 +20,12 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.node.NodeTransaction;
 import androidx.xr.scenecore.JxrPlatformAdapter.Entity;
 import androidx.xr.scenecore.JxrPlatformAdapter.GltfEntity;
 import androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.NodeTransaction;
-
 import java.util.concurrent.ScheduledExecutorService;
 
 /**
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/GltfEntityImplSplitEngine.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/GltfEntityImplSplitEngine.java
index 9c651c5..6c5b539 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/GltfEntityImplSplitEngine.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/GltfEntityImplSplitEngine.java
@@ -20,13 +20,12 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.node.NodeTransaction;
 import androidx.xr.scenecore.JxrPlatformAdapter.Entity;
 import androidx.xr.scenecore.JxrPlatformAdapter.GltfEntity;
 import androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.NodeTransaction;
-
 import com.google.androidxr.splitengine.SplitEngineSubspaceManager;
 import com.google.androidxr.splitengine.SubspaceNode;
 import com.google.ar.imp.apibindings.ImpressApi;
@@ -72,7 +71,7 @@
 
         try (NodeTransaction transaction = extensions.createNodeTransaction()) {
             // Make the Entity node a parent of the subspace node.
-            transaction.setParent(mSubspace.getSubspaceNodeActual(), mNode).apply();
+            transaction.setParent(mSubspace.subspaceNode, mNode).apply();
         }
         mModelImpressNode =
                 impressApi.instanceGltfModel(gltfModelResource.getExtensionModelToken());
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/GltfModelResourceImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/GltfModelResourceImpl.java
index df3cacd..175d95d 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/GltfModelResourceImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/GltfModelResourceImpl.java
@@ -25,13 +25,13 @@
  */
 @SuppressWarnings({"deprecation", "UnnecessarilyFullyQualified"}) // TODO(b/373435470): Remove
 final class GltfModelResourceImpl implements GltfModelResource {
-    private final com.android.extensions.xr.asset.GltfModelToken mToken;
+    private final androidx.xr.extensions.asset.GltfModelToken mToken;
 
-    GltfModelResourceImpl(com.android.extensions.xr.asset.GltfModelToken token) {
+    GltfModelResourceImpl(androidx.xr.extensions.asset.GltfModelToken token) {
         mToken = token;
     }
 
-    public com.android.extensions.xr.asset.GltfModelToken getExtensionModelToken() {
+    public androidx.xr.extensions.asset.GltfModelToken getExtensionModelToken() {
         return mToken;
     }
 }
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/JxrPlatformAdapterAxr.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/JxrPlatformAdapterAxr.java
index 1f4c420..7d7f5fa 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/JxrPlatformAdapterAxr.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/JxrPlatformAdapterAxr.java
@@ -32,21 +32,20 @@
 import androidx.annotation.VisibleForTesting;
 import androidx.concurrent.futures.ResolvableFuture;
 import androidx.xr.arcore.Anchor;
-import androidx.xr.extensions.node.NodeTypeConverter;
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.XrExtensionsProvider;
+import androidx.xr.extensions.node.Node;
+import androidx.xr.extensions.node.NodeTransaction;
+import androidx.xr.extensions.space.ActivityPanel;
+import androidx.xr.extensions.space.ActivityPanelLaunchParameters;
+import androidx.xr.extensions.space.SpatialState;
 import androidx.xr.runtime.math.Pose;
+import androidx.xr.runtime.math.Vector4;
 import androidx.xr.scenecore.JxrPlatformAdapter;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
 import androidx.xr.scenecore.impl.perception.Session;
 import androidx.xr.scenecore.impl.perception.ViewProjections;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.NodeTransaction;
-import com.android.extensions.xr.space.ActivityPanel;
-import com.android.extensions.xr.space.ActivityPanelLaunchParameters;
-import com.android.extensions.xr.space.SpatialState;
-
 import com.google.androidxr.splitengine.SplitEngineSubspaceManager;
 import com.google.ar.imp.apibindings.ImpressApi;
 import com.google.ar.imp.apibindings.ImpressApiImpl;
@@ -67,9 +66,7 @@
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Consumer;
@@ -88,7 +85,6 @@
 public class JxrPlatformAdapterAxr implements JxrPlatformAdapter {
     private static final String TAG = "JxrPlatformAdapterAxr";
     private static final String SPLIT_ENGINE_LIBRARY_NAME = "impress_api_jni";
-    private static final boolean IS_SKYBOX_MIGRATION_PERIOD_OVER = false;
 
     private final ActivitySpaceImpl mActivitySpace;
     private final HeadActivityPoseImpl mHeadActivityPose;
@@ -111,7 +107,7 @@
     private final ImpressApi mImpressApi;
     private final Map<Consumer<SpatialCapabilities>, Executor>
             mSpatialCapabilitiesChangedListeners = new ConcurrentHashMap<>();
-    @VisibleForTesting final ListenableFuture<ExrImageResource> mNullSkyboxResourceFuture;
+    private final ListenableFuture<ExrImageResource> mNullSkyboxResourceFuture;
 
     @Nullable private Activity mActivity;
     private SplitEngineSubspaceManager mSplitEngineSubspaceManager;
@@ -166,12 +162,14 @@
         mEntityManager = entityManager;
         mPerceptionLibrary = perceptionLibrary;
         mTaskWindowLeashNode = taskWindowLeashNode;
+        mNullSkyboxResourceFuture = loadExrImageByAssetName("images/black_skybox.exr");
         mEnvironment =
                 new SpatialEnvironmentImpl(
                         activity,
                         extensions,
                         rootSceneNode,
                         mLazySpatialStateProvider,
+                        mNullSkyboxResourceFuture,
                         useSplitEngine);
         mActivitySpace =
                 new ActivitySpaceImpl(
@@ -205,7 +203,7 @@
                         perceptionLibrary));
         mCameraActivityPoses.forEach(mEntityManager::addSystemSpaceActivityPose);
         mUseSplitEngine = useSplitEngine;
-        mOpenXrReferenceSpaceType = extensions.getOpenXrWorldReferenceSpaceType();
+        mOpenXrReferenceSpaceType = extensions.getOpenXrWorldSpaceType();
 
         mMainPanelEntity =
                 new MainPanelEntityImpl(
@@ -236,26 +234,6 @@
             mImpressApi.setup(mSplitEngineRenderer.getView());
             mEnvironment.onSplitEngineReady(mSplitEngineSubspaceManager, mImpressApi);
         }
-        // TODO(b/396483557): This is a temporary measure to not break clients while they migrate to
-        // the
-        // Split Engine route.
-        if (useSplitEngine && IS_SKYBOX_MIGRATION_PERIOD_OVER) {
-            mNullSkyboxResourceFuture =
-                    loadExrImageByAssetNameSplitEngine(
-                            "images/preprocessed_black_skybox_android_xr_scenecore.zip");
-        } else {
-            mNullSkyboxResourceFuture =
-                    loadExrImageByAssetName("images/black_skybox_android_xr_scenecore.exr");
-        }
-        mNullSkyboxResourceFuture.addListener(
-                () -> {
-                    try {
-                        mEnvironment.onNullSkyboxResourceReady(mNullSkyboxResourceFuture.get());
-                    } catch (ExecutionException | InterruptedException e) {
-                        Log.e(TAG, "Failed to get null skybox resource.");
-                    }
-                },
-                Executors.newSingleThreadExecutor());
     }
 
     /** Create a new @c JxrPlatformAdapterAxr. */
@@ -292,33 +270,6 @@
                 useSplitEngine);
     }
 
-    /**
-     * Create a new @c JxrPlatformAdapterAxr.
-     *
-     * @deprecated use {@link #create(Activity, ScheduledExecutorService, Node, Node)} instead.
-     */
-    @NonNull
-    @Deprecated
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-    public static JxrPlatformAdapterAxr create(
-            @NonNull Activity activity,
-            @NonNull ScheduledExecutorService executor,
-            @NonNull androidx.xr.extensions.node.Node rootSceneNode,
-            @NonNull androidx.xr.extensions.node.Node taskWindowLeashNode) {
-        return create(
-                activity,
-                executor,
-                XrExtensionsProvider.getXrExtensions(),
-                null,
-                new EntityManager(),
-                new PerceptionLibrary(),
-                null,
-                null,
-                NodeTypeConverter.toFramework(rootSceneNode),
-                NodeTypeConverter.toFramework(taskWindowLeashNode),
-                /* useSplitEngine= */ false);
-    }
-
     /** Create a new @c JxrPlatformAdapterAxr. */
     @NonNull
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@@ -435,7 +386,7 @@
     }
 
     private static GltfModelResourceImpl getModelResourceFromToken(
-            com.android.extensions.xr.asset.GltfModelToken token) {
+            androidx.xr.extensions.asset.GltfModelToken token) {
         return new GltfModelResourceImpl(token);
     }
 
@@ -445,15 +396,10 @@
     }
 
     private static ExrImageResourceImpl getExrImageResourceFromToken(
-            com.android.extensions.xr.asset.EnvironmentToken token) {
+            androidx.xr.extensions.asset.EnvironmentToken token) {
         return new ExrImageResourceImpl(token);
     }
 
-    private static ExrImageResourceImplSplitEngine getExrImageResourceFromTokenSplitEngine(
-            long token) {
-        return new ExrImageResourceImplSplitEngine(token);
-    }
-
     private static TextureResourceImpl getTextureResourceFromToken(long token) {
         return new TextureResourceImpl(token);
     }
@@ -467,7 +413,8 @@
     // It is synchronized because we assume this.spatialState cannot be updated elsewhere during the
     // execution of this method.
     @VisibleForTesting
-    synchronized void onSpatialStateChanged(@NonNull SpatialState newSpatialState) {
+    synchronized void onSpatialStateChanged(
+            @NonNull androidx.xr.extensions.space.SpatialState newSpatialState) {
         SpatialState previousSpatialState = mSpatialState.getAndSet(newSpatialState);
 
         boolean spatialCapabilitiesChanged =
@@ -516,7 +463,7 @@
 
     private void setSpatialStateCallback() {
         Handler mainHandler = new Handler(Looper.getMainLooper());
-        mExtensions.setSpatialStateCallback(
+        mExtensions.registerSpatialStateCallback(
                 mActivity, this::onSpatialStateChanged, mainHandler::post);
     }
 
@@ -568,7 +515,7 @@
     @NonNull
     public LoggingEntity createLoggingEntity(@NonNull Pose pose) {
         LoggingEntityImpl entity = new LoggingEntityImpl();
-        entity.setPose(pose, Space.PARENT);
+        entity.setPose(pose);
         return entity;
     }
 
@@ -689,7 +636,7 @@
             return null;
         }
 
-        CompletableFuture<com.android.extensions.xr.asset.GltfModelToken> tokenFuture;
+        CompletableFuture<androidx.xr.extensions.asset.GltfModelToken> tokenFuture;
         try {
             tokenFuture = mExtensions.loadGltfModel(asset, asset.available(), 0, assetName);
             // Unfortunately, there is no way to avoid "leaking" this future, since we want to
@@ -714,15 +661,52 @@
     @Nullable
     public ListenableFuture<GltfModelResource> loadGltfByAssetNameSplitEngine(
             @NonNull String name) {
-        return loadGltfModel(() -> mImpressApi.loadGltfModel(name));
-    }
+        ResolvableFuture<GltfModelResource> gltfModelResourceFuture = ResolvableFuture.create();
+        // TODO:b/374216912 - Consider calling setFuture() here to catch if the application calls
+        // cancel() on the return value from this function, so we can propagate the cancelation
+        // message
+        // to the Impress API.
 
-    @SuppressWarnings({"RestrictTo", "AsyncSuffixFuture"})
-    @Override
-    @Nullable
-    public ListenableFuture<GltfModelResource> loadGltfByByteArray(
-            @NonNull byte[] assetData, @NonNull String assetKey) {
-        return loadGltfModel(() -> mImpressApi.loadGltfModel(assetData, assetKey));
+        if (!Looper.getMainLooper().isCurrentThread()) {
+            throw new IllegalStateException("This method must be called on the main thread.");
+        }
+
+        ListenableFuture<Long> gltfTokenFuture;
+        try {
+            gltfTokenFuture = mImpressApi.loadGltfModel(name);
+        } catch (RuntimeException e) {
+            Log.e(TAG, "Failed to load glTF model with error: " + e.getMessage());
+            // TODO:b/375070346 - make this method NonNull and set the gltfModelResourceFuture to an
+            // exception and return that.
+            return null;
+        }
+
+        gltfTokenFuture.addListener(
+                () -> {
+                    try {
+                        long gltfToken = gltfTokenFuture.get();
+                        gltfModelResourceFuture.set(
+                                getModelResourceFromTokenSplitEngine(gltfToken));
+                    } catch (Exception e) {
+                        if (e instanceof InterruptedException) {
+                            Thread.currentThread().interrupt();
+                        }
+                        Log.e(TAG, "Failed to load glTF model with error: " + e.getMessage());
+                        gltfModelResourceFuture.setException(e);
+                    }
+                },
+                // It's convenient for the main application for us to dispatch their listeners on
+                // the main
+                // thread, because they are required to call back to Impress from there, and it's
+                // likely
+                // that they will want to call back into the SDK to create entities from within a
+                // listener.
+                // We defensively post to the main thread here, but in practice this should not
+                // cause a
+                // thread hop because the Impress API already dispatches its callbacks to the main
+                // thread.
+                mActivity::runOnUiThread);
+        return gltfModelResourceFuture;
     }
 
     // TODO: b/376504646 - Delete this method once we've migrated to a SplitEngine backed skybox.
@@ -745,7 +729,7 @@
             return null;
         }
 
-        CompletableFuture<com.android.extensions.xr.asset.EnvironmentToken> tokenFuture;
+        CompletableFuture<androidx.xr.extensions.asset.EnvironmentToken> tokenFuture;
         try {
             // NOTE: At the moment, extensions.loadEnvironment expects a .EXR file explicitly. This
             //       will need to be updated as support for GLTF environment geometry is added by
@@ -773,25 +757,6 @@
     @SuppressWarnings({"RestrictTo", "AsyncSuffixFuture"})
     @Override
     @Nullable
-    public ListenableFuture<ExrImageResource> loadExrImageByAssetNameSplitEngine(
-            @NonNull String assetName) {
-        return loadExrImage(() -> mImpressApi.loadImageBasedLightingAsset(assetName));
-    }
-
-    @SuppressWarnings({"RestrictTo", "AsyncSuffixFuture"})
-    @Override
-    @Nullable
-    public ListenableFuture<ExrImageResource> loadExrImageByByteArraySplitEngine(
-            @NonNull byte[] assetData, @NonNull String assetKey) {
-        return loadExrImage(() -> mImpressApi.loadImageBasedLightingAsset(assetData, assetKey));
-    }
-
-    // ResolvableFuture is marked as RestrictTo(LIBRARY_GROUP_PREFIX), which is intended for classes
-    // within AndroidX. We're in the process of migrating to AndroidX. Without suppressing this
-    // warning, however, we get a build error - go/bugpattern/RestrictTo.
-    @SuppressWarnings({"RestrictTo", "AsyncSuffixFuture"})
-    @Override
-    @Nullable
     public ListenableFuture<TextureResource> loadTexture(
             @NonNull String path, @NonNull TextureSampler sampler) {
         ResolvableFuture<TextureResource> textureResourceFuture = ResolvableFuture.create();
@@ -864,7 +829,7 @@
     @SuppressWarnings({"RestrictTo", "AsyncSuffixFuture"})
     @Override
     @Nullable
-    public ListenableFuture<MaterialResource> createWaterMaterial(boolean isAlphaMapVersion) {
+    public ListenableFuture<MaterialResource> createWaterMaterial(boolean transparent) {
         ResolvableFuture<MaterialResource> materialResourceFuture = ResolvableFuture.create();
         // TODO:b/374216912 - Consider calling setFuture() here to catch if the application calls
         // cancel() on the return value from this function, so we can propagate the cancelation
@@ -877,7 +842,7 @@
 
         ListenableFuture<WaterMaterial> materialFuture;
         try {
-            materialFuture = mImpressApi.createWaterMaterial(isAlphaMapVersion);
+            materialFuture = mImpressApi.createWaterMaterial(transparent);
         } catch (RuntimeException e) {
             Log.e(TAG, "Failed to load water material with error: " + e.getMessage());
             // TODO:b/375070346 - make this method NonNull and set the textureResourceFuture to an
@@ -968,6 +933,32 @@
     }
 
     @Override
+    public void setAlphaStepU(@NonNull MaterialResource material, @NonNull Vector4 alphaStepU) {
+        if (!(material instanceof MaterialResourceImpl)) {
+            throw new IllegalArgumentException("MaterialResource is not a MaterialResourceImpl");
+        }
+        mImpressApi.setAlphaStepUOnWaterMaterial(
+                ((MaterialResourceImpl) material).getMaterialToken(),
+                alphaStepU.getX(),
+                alphaStepU.getY(),
+                alphaStepU.getZ(),
+                alphaStepU.getW());
+    }
+
+    @Override
+    public void setAlphaStepV(@NonNull MaterialResource material, @NonNull Vector4 alphaStepV) {
+        if (!(material instanceof MaterialResourceImpl)) {
+            throw new IllegalArgumentException("MaterialResource is not a MaterialResourceImpl");
+        }
+        mImpressApi.setAlphaStepVOnWaterMaterial(
+                ((MaterialResourceImpl) material).getMaterialToken(),
+                alphaStepV.getX(),
+                alphaStepV.getY(),
+                alphaStepV.getZ(),
+                alphaStepV.getW());
+    }
+
+    @Override
     public void setAlphaStepMultiplier(
             @NonNull MaterialResource material, float alphaStepMultiplier) {
         if (!(material instanceof MaterialResourceImpl)) {
@@ -978,50 +969,6 @@
     }
 
     @Override
-    public void setAlphaMap(@NonNull MaterialResource material, @NonNull TextureResource alphaMap) {
-        if (!(material instanceof MaterialResourceImpl)) {
-            throw new IllegalArgumentException("MaterialResource is not a MaterialResourceImpl");
-        }
-        if (!(alphaMap instanceof TextureResourceImpl)) {
-            throw new IllegalArgumentException("TextureResource is not a TextureResourceImpl");
-        }
-        mImpressApi.setAlphaMapOnWaterMaterial(
-                ((MaterialResourceImpl) material).getMaterialToken(),
-                ((TextureResourceImpl) alphaMap).getTextureToken());
-    }
-
-    @Override
-    public void setNormalZ(@NonNull MaterialResource material, float normalZ) {
-        if (!(material instanceof MaterialResourceImpl)) {
-            throw new IllegalArgumentException("MaterialResource is not a MaterialResourceImpl");
-        }
-        mImpressApi.setNormalZOnWaterMaterial(
-                ((MaterialResourceImpl) material).getMaterialToken(), normalZ);
-    }
-
-    @Override
-    public void setNormalBoundary(@NonNull MaterialResource material, float normalBoundary) {
-        if (!(material instanceof MaterialResourceImpl)) {
-            throw new IllegalArgumentException("MaterialResource is not a MaterialResourceImpl");
-        }
-        mImpressApi.setNormalBoundaryOnWaterMaterial(
-                ((MaterialResourceImpl) material).getMaterialToken(), normalBoundary);
-    }
-
-    @Override
-    @Nullable
-    public TextureResource getReflectionTextureFromIbl(@NonNull ExrImageResource iblToken) {
-        ExrImageResourceImplSplitEngine exrImageResource =
-                (ExrImageResourceImplSplitEngine) iblToken;
-        Texture texture =
-                mImpressApi.getReflectionTextureFromIbl(exrImageResource.getExtensionImageToken());
-        if (texture == null) {
-            return null;
-        }
-        return getTextureResourceFromToken(texture.getNativeHandle());
-    }
-
-    @Override
     @NonNull
     public GltfEntity createGltfEntity(
             @NonNull Pose pose, @NonNull GltfModelResource model, @Nullable Entity parentEntity) {
@@ -1041,7 +988,7 @@
                         mExtensions,
                         mEntityManager,
                         mExecutor);
-        entity.setPose(pose, Space.PARENT);
+        entity.setPose(pose);
         return entity;
     }
 
@@ -1063,52 +1010,27 @@
     @Override
     @NonNull
     public PanelEntity createPanelEntity(
-            @NonNull Context context,
             @NonNull Pose pose,
             @NonNull View view,
+            @NonNull PixelDimensions surfaceDimensionsPx,
             @NonNull Dimensions dimensions,
             @NonNull String name,
+            @SuppressWarnings("ContextFirst") @NonNull Context context,
             @NonNull Entity parent) {
 
         Node node = mExtensions.createNode();
         PanelEntity panelEntity =
                 new PanelEntityImpl(
-                        context,
                         node,
                         view,
                         mExtensions,
                         mEntityManager,
-                        dimensions,
+                        surfaceDimensionsPx,
                         name,
-                        mExecutor);
-        panelEntity.setParent(parent);
-        panelEntity.setPose(pose, Space.PARENT);
-        return panelEntity;
-    }
-
-    @Override
-    @NonNull
-    public PanelEntity createPanelEntity(
-            @NonNull Context context,
-            @NonNull Pose pose,
-            @NonNull View view,
-            @NonNull PixelDimensions pixelDimensions,
-            @NonNull String name,
-            @NonNull Entity parent) {
-
-        Node node = mExtensions.createNode();
-        PanelEntity panelEntity =
-                new PanelEntityImpl(
                         context,
-                        node,
-                        view,
-                        mExtensions,
-                        mEntityManager,
-                        pixelDimensions,
-                        name,
                         mExecutor);
         panelEntity.setParent(parent);
-        panelEntity.setPose(pose, Space.PARENT);
+        panelEntity.setPose(pose);
         return panelEntity;
     }
 
@@ -1207,7 +1129,7 @@
                         windowBoundsPx,
                         mExecutor);
         activityPanelEntity.setParent(parent);
-        activityPanelEntity.setPose(pose, Space.PARENT);
+        activityPanelEntity.setPose(pose);
         return activityPanelEntity;
     }
 
@@ -1259,7 +1181,7 @@
         // This entity is used to back JXR Core's ContentlessEntity.
         Entity entity = new AndroidXrEntity(node, mExtensions, mEntityManager, mExecutor) {};
         entity.setParent(parent);
-        entity.setPose(pose, Space.PARENT);
+        entity.setPose(pose);
         return entity;
     }
 
@@ -1293,13 +1215,13 @@
     @Override
     @NonNull
     public Bundle setFullSpaceMode(@NonNull Bundle bundle) {
-        return mExtensions.setFullSpaceStartMode(bundle);
+        return mExtensions.setFullSpaceMode(bundle);
     }
 
     @Override
     @NonNull
     public Bundle setFullSpaceModeWithEnvironmentInherited(@NonNull Bundle bundle) {
-        return mExtensions.setFullSpaceStartModeWithEnvironmentInherited(bundle);
+        return mExtensions.setFullSpaceModeWithEnvironmentInherited(bundle);
     }
 
     @Override
@@ -1338,8 +1260,8 @@
         mEntityManager.getAllEntities().forEach(Entity::dispose);
         mEntityManager.clear();
         if (mSplitEngineRenderer != null && mSplitEngineSubspaceManager != null) {
-            mSplitEngineSubspaceManager.destroy();
             mSplitEngineRenderer.destroy();
+            mSplitEngineSubspaceManager.destroy();
         }
     }
 
@@ -1434,7 +1356,7 @@
                         mExecutor,
                         stereoMode,
                         canvasShape);
-        entity.setPose(pose, Space.PARENT);
+        entity.setPose(pose);
         return entity;
     }
 
@@ -1460,93 +1382,7 @@
                         mExtensions,
                         mEntityManager,
                         mExecutor);
-        entity.setPose(pose, Space.PARENT);
+        entity.setPose(pose);
         return entity;
     }
-
-    // ResolvableFuture is marked as RestrictTo(LIBRARY_GROUP_PREFIX), which is intended for classes
-    // within AndroidX. We're in the process of migrating to AndroidX. Without suppressing this
-    // warning, however, we get a build error - go/bugpattern/RestrictTo.
-    @SuppressWarnings({
-        "RestrictTo",
-        "FutureReturnValueIgnored",
-    })
-    @Nullable
-    private ListenableFuture<GltfModelResource> loadGltfModel(
-            Supplier<ListenableFuture<Long>> modelLoader) {
-        if (!Looper.getMainLooper().isCurrentThread()) {
-            throw new IllegalStateException("This method must be called on the main thread.");
-        }
-
-        ResolvableFuture<GltfModelResource> gltfModelResourceFuture = ResolvableFuture.create();
-
-        ListenableFuture<Long> gltfTokenFuture;
-        try {
-            gltfTokenFuture = modelLoader.get();
-        } catch (RuntimeException e) {
-            Log.e(TAG, "Failed to load glTF model: " + e.getMessage());
-            return null;
-        }
-
-        gltfTokenFuture.addListener(
-                () -> {
-                    try {
-                        long gltfToken = gltfTokenFuture.get();
-                        gltfModelResourceFuture.set(
-                                getModelResourceFromTokenSplitEngine(gltfToken));
-                    } catch (Exception e) {
-                        if (e instanceof InterruptedException) {
-                            Thread.currentThread().interrupt();
-                        }
-                        Log.e(TAG, "Failed to load glTF model: " + e.getMessage());
-                        gltfModelResourceFuture.setException(e);
-                    }
-                },
-                mActivity::runOnUiThread);
-
-        return gltfModelResourceFuture;
-    }
-
-    // ResolvableFuture is marked as RestrictTo(LIBRARY_GROUP_PREFIX), which is intended for classes
-    // within AndroidX. We're in the process of migrating to AndroidX. Without suppressing this
-    // warning, however, we get a build error - go/bugpattern/RestrictTo.
-    @SuppressWarnings({
-        "RestrictTo",
-        "FutureReturnValueIgnored",
-    })
-    @Nullable
-    private ListenableFuture<ExrImageResource> loadExrImage(
-            Supplier<ListenableFuture<Long>> assetLoader) {
-        if (!Looper.getMainLooper().isCurrentThread()) {
-            throw new IllegalStateException("This method must be called on the main thread.");
-        }
-
-        ResolvableFuture<ExrImageResource> exrImageResourceFuture = ResolvableFuture.create();
-
-        ListenableFuture<Long> exrImageTokenFuture;
-        try {
-            exrImageTokenFuture = assetLoader.get();
-        } catch (RuntimeException e) {
-            Log.e(TAG, "Failed to load EXR image: " + e.getMessage());
-            return null;
-        }
-
-        exrImageTokenFuture.addListener(
-                () -> {
-                    try {
-                        long exrImageToken = exrImageTokenFuture.get();
-                        exrImageResourceFuture.set(
-                                getExrImageResourceFromTokenSplitEngine(exrImageToken));
-                    } catch (Exception e) {
-                        if (e instanceof InterruptedException) {
-                            Thread.currentThread().interrupt();
-                        }
-                        Log.e(TAG, "Failed to load EXR image: " + e.getMessage());
-                        exrImageResourceFuture.setException(e);
-                    }
-                },
-                mActivity::runOnUiThread);
-
-        return exrImageResourceFuture;
-    }
 }
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/LoggingEntityImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/LoggingEntityImpl.java
index 7831b91..fd56405 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/LoggingEntityImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/LoggingEntityImpl.java
@@ -21,10 +21,10 @@
 import androidx.annotation.NonNull;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.scenecore.JxrPlatformAdapter.ActivityPose;
+import androidx.xr.scenecore.JxrPlatformAdapter.Dimensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.Entity;
 import androidx.xr.scenecore.JxrPlatformAdapter.InputEventListener;
 import androidx.xr.scenecore.JxrPlatformAdapter.LoggingEntity;
-import androidx.xr.scenecore.JxrPlatformAdapter.SpaceValue;
 import androidx.xr.scenecore.common.BaseEntity;
 
 import java.util.List;
@@ -41,20 +41,15 @@
 
     @NonNull
     @Override
-    public Pose getPose(@SpaceValue int relativeTo) {
-        Log.i(
-                TAG,
-                "Getting Logging Entity pose: "
-                        + super.getPose(relativeTo)
-                        + " relativeTo: "
-                        + relativeTo);
-        return super.getPose(relativeTo);
+    public Pose getPose() {
+        Log.i(TAG, "Getting Logging Entity pose: " + super.getPose());
+        return super.getPose();
     }
 
     @Override
-    public void setPose(@NonNull Pose pose, @SpaceValue int relativeTo) {
-        Log.i(TAG, "Setting Logging Entity pose to: " + pose + " relativeTo: " + relativeTo);
-        super.setPose(pose, relativeTo);
+    public void setPose(@NonNull Pose pose) {
+        Log.i(TAG, "Setting Logging Entity pose to: " + pose);
+        super.setPose(pose);
     }
 
     @NonNull
@@ -112,6 +107,11 @@
     }
 
     @Override
+    public void setSize(@NonNull Dimensions dimensions) {
+        Log.i(TAG, "Set size to " + dimensions);
+    }
+
+    @Override
     public void addInputEventListener(
             @NonNull Executor executor, @NonNull InputEventListener consumer) {
         Log.i(TAG, "Add input consumer " + consumer + " executor " + executor);
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MainPanelEntityImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MainPanelEntityImpl.java
index f864f9e..c81d97f 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MainPanelEntityImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MainPanelEntityImpl.java
@@ -19,15 +19,14 @@
 import android.app.Activity;
 import android.graphics.Rect;
 
-import androidx.annotation.NonNull;
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.node.Node;
+import androidx.xr.extensions.node.NodeTransaction;
+import androidx.xr.runtime.math.Vector3;
 import androidx.xr.scenecore.JxrPlatformAdapter.Dimensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.PanelEntity;
 import androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.NodeTransaction;
-
 import java.util.concurrent.ScheduledExecutorService;
 
 /**
@@ -35,6 +34,7 @@
  * node. The content of this PanelEntity is assumed to have been previously defined and associated
  * with the Window Leash Node.
  */
+@SuppressWarnings("deprecation") // TODO(b/373435470): Remove
 final class MainPanelEntityImpl extends BasePanelEntity implements PanelEntity {
     Activity mRuntimeActivity;
 
@@ -52,7 +52,7 @@
         //   Note that this requires MinAPI 30.
         // TODO(b/352827267): Enforce minSDK API strategy - go/androidx-api-guidelines#compat-newapi
         Rect bounds = getBoundsFromWindowManager();
-        super.setSizeInPixels(new PixelDimensions(bounds.width(), bounds.height()));
+        super.setPixelDimensions(new PixelDimensions(bounds.width(), bounds.height()));
         float cornerRadius = getDefaultCornerRadiusInMeters();
         try (NodeTransaction transaction = mExtensions.createNodeTransaction()) {
             transaction.setCornerRadius(node, cornerRadius).apply();
@@ -64,19 +64,18 @@
         return mRuntimeActivity.getWindowManager().getCurrentWindowMetrics().getBounds();
     }
 
-    @NonNull
     @Override
     public Dimensions getSize() {
         // The main panel bounds can change in HSM without JXRCore. Always read the bounds from the
         // WindowManager.
         Rect bounds = getBoundsFromWindowManager();
-        float pixelDensity = getDefaultPixelDensity();
-        return new Dimensions(bounds.width() / pixelDensity, bounds.height() / pixelDensity, 0);
+        Vector3 pixelDensity = getPixelDensity();
+        return new Dimensions(
+                bounds.width() / pixelDensity.getX(), bounds.height() / pixelDensity.getY(), 0);
     }
 
-    @NonNull
     @Override
-    public PixelDimensions getSizeInPixels() {
+    public PixelDimensions getPixelDimensions() {
         // The main panel bounds can change in HSM without JXRCore. Always read the bounds from the
         // WindowManager.
         Rect bounds = getBoundsFromWindowManager();
@@ -84,11 +83,11 @@
     }
 
     @Override
-    public void setSizeInPixels(@NonNull PixelDimensions dimensions) {
+    public void setPixelDimensions(PixelDimensions dimensions) {
         // TODO: b/376126162 - Consider calling setPixelDimensions() either when setMainWindowSize's
         // callback is called, or when the next spatial state callback with the expected size is
         // called.
-        super.setSizeInPixels(dimensions);
+        super.setPixelDimensions(dimensions);
         // TODO: b/376934871 - Check async results.
         mExtensions.setMainWindowSize(
                 mRuntimeActivity,
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MediaPlayerExtensionsWrapperImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MediaPlayerExtensionsWrapperImpl.java
index ac2b3fc1..099b304 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MediaPlayerExtensionsWrapperImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MediaPlayerExtensionsWrapperImpl.java
@@ -19,12 +19,11 @@
 import android.media.MediaPlayer;
 
 import androidx.annotation.NonNull;
+import androidx.xr.extensions.media.MediaPlayerExtensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.MediaPlayerExtensionsWrapper;
 import androidx.xr.scenecore.JxrPlatformAdapter.PointSourceAttributes;
 import androidx.xr.scenecore.JxrPlatformAdapter.SoundFieldAttributes;
 
-import com.android.extensions.xr.media.MediaPlayerExtensions;
-
 /** Implementation of the {@link MediaPlayerExtensionsWrapper}. */
 final class MediaPlayerExtensionsWrapperImpl implements MediaPlayerExtensionsWrapper {
 
@@ -37,18 +36,18 @@
     @Override
     public void setPointSourceAttributes(
             @NonNull MediaPlayer mediaPlayer, @NonNull PointSourceAttributes attributes) {
-        com.android.extensions.xr.media.PointSourceAttributes extAttributes =
+        androidx.xr.extensions.media.PointSourceAttributes extAttributes =
                 MediaUtils.convertPointSourceAttributesToExtensions(attributes);
 
-        MediaPlayer unused = mExtensions.setPointSourceAttributes(mediaPlayer, extAttributes);
+        mExtensions.setPointSourceAttributes(mediaPlayer, extAttributes);
     }
 
     @Override
     public void setSoundFieldAttributes(
             @NonNull MediaPlayer mediaPlayer, @NonNull SoundFieldAttributes attributes) {
-        com.android.extensions.xr.media.SoundFieldAttributes extAttributes =
+        androidx.xr.extensions.media.SoundFieldAttributes extAttributes =
                 MediaUtils.convertSoundFieldAttributesToExtensions(attributes);
 
-        MediaPlayer unused = mExtensions.setSoundFieldAttributes(mediaPlayer, extAttributes);
+        mExtensions.setSoundFieldAttributes(mediaPlayer, extAttributes);
     }
 }
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MediaUtils.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MediaUtils.java
index 6640187..52010dc 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MediaUtils.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MediaUtils.java
@@ -17,14 +17,13 @@
 package androidx.xr.scenecore.impl;
 
 import androidx.annotation.RestrictTo;
+import androidx.xr.extensions.media.PointSourceAttributes;
+import androidx.xr.extensions.media.SoundFieldAttributes;
+import androidx.xr.extensions.media.SpatializerExtensions;
+import androidx.xr.extensions.node.Node;
 import androidx.xr.scenecore.JxrPlatformAdapter;
 import androidx.xr.scenecore.JxrPlatformAdapter.SpatializerConstants;
 
-import com.android.extensions.xr.media.PointSourceAttributes;
-import com.android.extensions.xr.media.SoundFieldAttributes;
-import com.android.extensions.xr.media.SpatializerExtensions;
-import com.android.extensions.xr.node.Node;
-
 /** Utils for the runtime media class conversions. */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class MediaUtils {
@@ -47,6 +46,7 @@
                 .build();
     }
 
+    @SpatializerExtensions.AmbisonicsOrder
     static int convertAmbisonicsOrderToExtensions(
             @SpatializerConstants.AmbisonicsOrder int ambisonicsOrder) {
         switch (ambisonicsOrder) {
@@ -63,7 +63,8 @@
     }
 
     @SpatializerConstants.SourceType
-    static int convertExtensionsToSourceType(int extensionsSourceType) {
+    static int convertExtensionsToSourceType(
+            @SpatializerExtensions.SourceType int extensionsSourceType) {
         switch (extensionsSourceType) {
             case SpatializerExtensions.SOURCE_TYPE_BYPASS:
                 return SpatializerConstants.SOURCE_TYPE_BYPASS;
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MovableComponentImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MovableComponentImpl.java
index 77ec63c..f575610 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MovableComponentImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/MovableComponentImpl.java
@@ -24,6 +24,11 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.xr.extensions.Consumer;
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.node.ReformEvent;
+import androidx.xr.extensions.node.ReformOptions;
+import androidx.xr.extensions.node.Vec3;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Quaternion;
 import androidx.xr.runtime.math.Vector3;
@@ -37,20 +42,11 @@
 import androidx.xr.scenecore.JxrPlatformAdapter.PlaneSemantic;
 import androidx.xr.scenecore.JxrPlatformAdapter.PlaneType;
 import androidx.xr.scenecore.JxrPlatformAdapter.Ray;
-import androidx.xr.scenecore.JxrPlatformAdapter.Space;
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
 import androidx.xr.scenecore.impl.perception.Plane;
 import androidx.xr.scenecore.impl.perception.Plane.PlaneData;
 import androidx.xr.scenecore.impl.perception.Session;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.function.Consumer;
-import com.android.extensions.xr.node.ReformEvent;
-import com.android.extensions.xr.node.ReformOptions;
-import com.android.extensions.xr.node.Vec3;
-
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
-
 import java.util.EnumMap;
 import java.util.List;
 import java.util.Map;
@@ -135,28 +131,27 @@
                         : reformFlags;
         reformFlags =
                 mScaleInZ ? reformFlags | ReformOptions.FLAG_SCALE_WITH_DISTANCE : reformFlags;
-        ReformOptions unused = reformOptions.setFlags(reformFlags);
-        unused =
-                reformOptions
-                        .setEnabledReform(
-                                reformOptions.getEnabledReform() | ReformOptions.ALLOW_MOVE)
-                        .setScaleWithDistanceMode(
-                                translateScaleWithDistanceMode(mScaleWithDistanceMode));
+        reformOptions.setFlags(reformFlags);
+        reformOptions.setEnabledReform(reformOptions.getEnabledReform() | ReformOptions.ALLOW_MOVE);
+        reformOptions.setScaleWithDistanceMode(
+                translateScaleWithDistanceMode(mScaleWithDistanceMode));
 
         // TODO: b/348037292 - Remove this special case for PanelEntityImpl.
         if (entity instanceof PanelEntityImpl && mCurrentSize == null) {
             mCurrentSize = ((PanelEntityImpl) entity).getSize();
         }
         if (mCurrentSize != null) {
-            unused =
-                    reformOptions.setCurrentSize(
-                            new Vec3(mCurrentSize.width, mCurrentSize.height, mCurrentSize.depth));
+            reformOptions.setCurrentSize(
+                    new Vec3(mCurrentSize.width, mCurrentSize.height, mCurrentSize.depth));
         }
         if (mUserAnchorable && mSystemMovable && mReformEventConsumer == null) {
-            mReformEventConsumer = reformEvent -> getUpdatedReformEventPoseAndParent(reformEvent);
+            mReformEventConsumer =
+                    reformEvent -> {
+                        Pair<Pose, Entity> unused = getUpdatedReformEventPoseAndParent(reformEvent);
+                    };
         }
-        mLastPose = entity.getPose(Space.PARENT);
-        mLastScale = entity.getScale(Space.PARENT);
+        mLastPose = entity.getPose();
+        mLastScale = entity.getScale();
         ((AndroidXrEntity) entity).updateReformOptions();
         if (mReformEventConsumer != null) {
             ((AndroidXrEntity) entity)
@@ -168,9 +163,8 @@
     @Override
     public void onDetach(@NonNull Entity entity) {
         ReformOptions reformOptions = ((AndroidXrEntity) entity).getReformOptions();
-        ReformOptions unused =
-                reformOptions.setEnabledReform(
-                        reformOptions.getEnabledReform() & ~ReformOptions.ALLOW_MOVE);
+        reformOptions.setEnabledReform(
+                reformOptions.getEnabledReform() & ~ReformOptions.ALLOW_MOVE);
         // Clear any flags that were set by this component.
         int reformFlags = reformOptions.getFlags();
         reformFlags =
@@ -179,7 +173,7 @@
                         : reformFlags;
         reformFlags =
                 mScaleInZ ? reformFlags & ~ReformOptions.FLAG_SCALE_WITH_DISTANCE : reformFlags;
-        unused = reformOptions.setFlags(reformFlags);
+        reformOptions.setFlags(reformFlags);
         ((AndroidXrEntity) entity).updateReformOptions();
         if (mReformEventConsumer != null) {
             ((AndroidXrEntity) entity).removeReformEventConsumer(mReformEventConsumer);
@@ -196,9 +190,8 @@
             return;
         }
         ReformOptions reformOptions = ((AndroidXrEntity) mEntity).getReformOptions();
-        ReformOptions unused =
-                reformOptions.setCurrentSize(
-                        new Vec3(dimensions.width, dimensions.height, dimensions.depth));
+        reformOptions.setCurrentSize(
+                new Vec3(dimensions.width, dimensions.height, dimensions.depth));
         ((AndroidXrEntity) mEntity).updateReformOptions();
     }
 
@@ -218,9 +211,8 @@
             return;
         }
         ReformOptions reformOptions = ((AndroidXrEntity) mEntity).getReformOptions();
-        ReformOptions unused =
-                reformOptions.setScaleWithDistanceMode(
-                        translateScaleWithDistanceMode(scaleWithDistanceMode));
+        reformOptions.setScaleWithDistanceMode(
+                translateScaleWithDistanceMode(scaleWithDistanceMode));
         ((AndroidXrEntity) mEntity).updateReformOptions();
     }
 
@@ -320,7 +312,6 @@
         mMoveEventListenersMap.remove(moveEventListener);
     }
 
-    @CanIgnoreReturnValue
     private Pair<Pose, Entity> getUpdatedReformEventPoseAndParent(ReformEvent reformEvent) {
         if (reformEvent.getState() == ReformEvent.REFORM_STATE_END && shouldRenderPlaneShadow()) {
             mPanelShadowRenderer.destroy();
@@ -330,7 +321,7 @@
                         reformEvent.getProposedPosition(), reformEvent.getProposedOrientation());
         Pair<Pose, Entity> updatedEntity = updatePoseWithPlanes(proposedPose, reformEvent);
         if (mSystemMovable) {
-            mEntity.setPose(updatedEntity.first, Space.PARENT);
+            mEntity.setPose(updatedEntity.first);
         }
         return updatedEntity;
     }
@@ -412,8 +403,7 @@
             // TODO: b/367754233 - Revisit if this needs to use ActivitySpaceScale or
             // WorldSpaceScale.
             mEntity.setScale(
-                    mEntity.getWorldSpaceScale().div(mActivitySpaceImpl.getWorldSpaceScale()),
-                    Space.PARENT);
+                    mEntity.getWorldSpaceScale().div(mActivitySpaceImpl.getWorldSpaceScale()));
             mEntity.setParent(mActivitySpaceImpl);
             checkAndDisposeAnchorEntity();
             mCreatedAnchorEntity = null;
@@ -496,7 +486,7 @@
         // the
         // anchor entity's scale.
         Vector3 entityScale = mEntity.getWorldSpaceScale();
-        mEntity.setScale(entityScale, Space.PARENT);
+        mEntity.setScale(entityScale);
         Quaternion planeRotation =
                 RuntimeUtils.fromPerceptionPose(anchorablePlaneData.centerPose).getRotation();
         Pose rotatedPose =
@@ -581,7 +571,8 @@
         }
     }
 
-    private static int translateScaleWithDistanceMode(@ScaleWithDistanceMode int scale) {
+    private static @ReformOptions.ScaleWithDistanceMode int translateScaleWithDistanceMode(
+            @ScaleWithDistanceMode int scale) {
         switch (scale) {
             case ScaleWithDistanceMode.DMM:
                 return ReformOptions.SCALE_WITH_DISTANCE_MODE_DMM;
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/PanelEntityImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/PanelEntityImpl.java
index fb2bf0c..3bb3f7c 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/PanelEntityImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/PanelEntityImpl.java
@@ -27,14 +27,12 @@
 import android.window.OnBackInvokedDispatcher;
 
 import androidx.annotation.NonNull;
-import androidx.xr.scenecore.JxrPlatformAdapter.Dimensions;
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.node.Node;
+import androidx.xr.extensions.node.NodeTransaction;
 import androidx.xr.scenecore.JxrPlatformAdapter.PanelEntity;
 import androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.NodeTransaction;
-
 import java.util.Objects;
 import java.util.concurrent.ScheduledExecutorService;
 
@@ -50,81 +48,26 @@
     private final SurfaceControlViewHost mSurfaceControlViewHost;
 
     PanelEntityImpl(
-            @NonNull Context context,
             Node node,
             @NonNull View view,
             XrExtensions extensions,
             EntityManager entityManager,
             PixelDimensions surfaceDimensionsPx,
             @NonNull String name,
+            @SuppressWarnings("ContextFirst") @NonNull Context context,
             ScheduledExecutorService executor) {
         super(node, extensions, entityManager, executor);
-        mSurfaceControlViewHost =
+        SurfaceControlViewHost surfaceControlViewHost =
                 new SurfaceControlViewHost(
                         context, Objects.requireNonNull(context.getDisplay()), new Binder());
-        setupSurfaceControlViewHostAndCornerRadius(view, surfaceDimensionsPx, name);
-        setDefaultOnBackInvokedCallback(view);
-    }
-
-    PanelEntityImpl(
-            @NonNull Context context,
-            Node node,
-            @NonNull View view,
-            XrExtensions extensions,
-            EntityManager entityManager,
-            Dimensions surfaceDimensions,
-            @NonNull String name,
-            ScheduledExecutorService executor) {
-        super(node, extensions, entityManager, executor);
-        float unscaledPixelDensity = getDefaultPixelDensity();
-        PixelDimensions surfaceDimensionsPx =
-                new PixelDimensions(
-                        (int) (surfaceDimensions.width * unscaledPixelDensity),
-                        (int) (surfaceDimensions.height * unscaledPixelDensity));
-        mSurfaceControlViewHost =
-                new SurfaceControlViewHost(
-                        context, Objects.requireNonNull(context.getDisplay()), new Binder());
-        setupSurfaceControlViewHostAndCornerRadius(view, surfaceDimensionsPx, name);
-        setDefaultOnBackInvokedCallback(view);
-    }
-
-    // TODO(b/352827267): Enforce minSDK API strategy - go/androidx-api-guidelines#compat-newapi
-    private void setupSurfaceControlViewHostAndCornerRadius(
-            @NonNull View view,
-            @NonNull PixelDimensions surfaceDimensionsPx,
-            @NonNull String name) {
-        mSurfaceControlViewHost.setView(
-                view, surfaceDimensionsPx.width, surfaceDimensionsPx.height);
-
-        SurfacePackage surfacePackage =
-                Objects.requireNonNull(mSurfaceControlViewHost.getSurfacePackage());
-
-        // We need to manually inform our base class of the pixelDimensions, even though the
-        // Extensions
-        // are initialized in the factory method. (ext.setWindowBounds, etc)
-        super.setSizeInPixels(surfaceDimensionsPx);
-        float cornerRadius = getDefaultCornerRadiusInMeters();
-        try (NodeTransaction transaction = mExtensions.createNodeTransaction()) {
-            transaction
-                    .setName(mNode, name)
-                    .setSurfacePackage(mNode, surfacePackage)
-                    .setWindowBounds(
-                            surfacePackage, surfaceDimensionsPx.width, surfaceDimensionsPx.height)
-                    .setVisibility(mNode, true)
-                    .setCornerRadius(mNode, cornerRadius)
-                    .apply();
-        } finally {
-            surfacePackage.release();
-        }
-        super.setCornerRadiusValue(cornerRadius);
-    }
-
-    @SuppressWarnings("deprecation") // TODO: b/398052385 - Replace deprecate onBackPressed.
-    private void setDefaultOnBackInvokedCallback(View view) {
+        surfaceControlViewHost.setView(view, surfaceDimensionsPx.width, surfaceDimensionsPx.height);
         OnBackInvokedCallback onBackInvokedCallback =
-                () -> {
-                    if (view.getContext() instanceof Activity) {
-                        ((Activity) view.getContext()).onBackPressed();
+                new OnBackInvokedCallback() {
+                    @Override
+                    public void onBackInvoked() {
+                        if (view.getContext() instanceof Activity) {
+                            ((Activity) view.getContext()).onBackPressed();
+                        }
                     }
                 };
         OnBackInvokedDispatcher backDispatcher = view.findOnBackInvokedDispatcher();
@@ -132,11 +75,38 @@
             backDispatcher.registerOnBackInvokedCallback(
                     OnBackInvokedDispatcher.PRIORITY_DEFAULT, onBackInvokedCallback);
         }
+
+        SurfacePackage surfacePackage =
+                Objects.requireNonNull(surfaceControlViewHost.getSurfacePackage());
+
+        // We need to manually inform our base class of the pixelDimensions, even though the
+        // Extensions
+        // are initialized in the factory method. (ext.setWindowBounds, etc)
+        super.setPixelDimensions(surfaceDimensionsPx);
+        float cornerRadius = getDefaultCornerRadiusInMeters();
+        try (NodeTransaction transaction = mExtensions.createNodeTransaction()) {
+            transaction
+                    .setName(node, name)
+                    .setSurfacePackage(node, surfacePackage)
+                    .setWindowBounds(
+                            surfacePackage, surfaceDimensionsPx.width, surfaceDimensionsPx.height)
+                    .setVisibility(node, true)
+                    .setCornerRadius(node, cornerRadius)
+                    .apply();
+        }
+
+        // TODO (b/392642541): Handle surfacePackage release in the case where there is an exception
+        // on
+        // the NodeTransaction.
+        surfacePackage.release();
+        super.setCornerRadiusValue(cornerRadius);
+        mSurfaceControlViewHost = surfaceControlViewHost;
     }
 
+    // TODO(b/352827267): Enforce minSDK API strategy - go/androidx-api-guidelines#compat-newapi
     @Override
-    public void setSizeInPixels(@NonNull PixelDimensions dimensions) {
-        super.setSizeInPixels(dimensions);
+    public void setPixelDimensions(PixelDimensions dimensions) {
+        super.setPixelDimensions(dimensions);
 
         SurfacePackage surfacePackage =
                 Objects.requireNonNull(mSurfaceControlViewHost.getSurfacePackage());
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/PanelShadowRenderer.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/PanelShadowRenderer.java
index e00b7c5..fb5700d 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/PanelShadowRenderer.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/PanelShadowRenderer.java
@@ -28,13 +28,12 @@
 import android.view.SurfaceControlViewHost.SurfacePackage;
 import android.view.View;
 
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.node.Node;
+import androidx.xr.extensions.node.NodeTransaction;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Vector3;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.NodeTransaction;
-
 import java.util.Objects;
 
 /** Class for rendering the border of a panel onto a perception plane. */
@@ -103,7 +102,7 @@
                 getUpdatedPanelPoseInActivitySpace(openXrToProposedPanel, openXrtoPlane);
         try (NodeTransaction transaction = mExtensions.createNodeTransaction()) {
             if (!mIsVisible) {
-                NodeTransaction unused = transaction.setVisibility(mPanelShadowNode, true);
+                transaction.setVisibility(mPanelShadowNode, true);
                 mIsVisible = true;
             }
             transaction
@@ -151,12 +150,12 @@
         // Scale the panel shadow to the size of the PanelEntity in the activity space.
         Vector3 entityScale = panelEntity.getWorldSpaceScale();
         float sizeX =
-                panelEntity.getSizeInPixels().width
+                panelEntity.getPixelDimensions().width
                                 * entityScale.getX()
                                 / mActivitySpaceImpl.getWorldSpaceScale().getX()
                         + PANEL_BORDER_ADDED_MARGIN;
         float sizeZ =
-                panelEntity.getSizeInPixels().height
+                panelEntity.getPixelDimensions().height
                                 * entityScale.getZ()
                                 / mActivitySpaceImpl.getWorldSpaceScale().getX()
                         + PANEL_BORDER_ADDED_MARGIN;
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ResizableComponentImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ResizableComponentImpl.java
index 56d45d7..ef036c3 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ResizableComponentImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/ResizableComponentImpl.java
@@ -19,19 +19,17 @@
 import android.util.Log;
 
 import androidx.annotation.NonNull;
+import androidx.xr.extensions.Consumer;
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.node.NodeTransaction;
+import androidx.xr.extensions.node.ReformEvent;
+import androidx.xr.extensions.node.ReformOptions;
+import androidx.xr.extensions.node.Vec3;
 import androidx.xr.scenecore.JxrPlatformAdapter.Dimensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.Entity;
 import androidx.xr.scenecore.JxrPlatformAdapter.ResizableComponent;
 import androidx.xr.scenecore.JxrPlatformAdapter.ResizeEvent;
 import androidx.xr.scenecore.JxrPlatformAdapter.ResizeEventListener;
-import androidx.xr.scenecore.JxrPlatformAdapter.Space;
-
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.function.Consumer;
-import com.android.extensions.xr.node.NodeTransaction;
-import com.android.extensions.xr.node.ReformEvent;
-import com.android.extensions.xr.node.ReformOptions;
-import com.android.extensions.xr.node.Vec3;
 
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executor;
@@ -77,9 +75,8 @@
         }
         mEntity = entity;
         ReformOptions reformOptions = ((AndroidXrEntity) entity).getReformOptions();
-        ReformOptions unused =
-                reformOptions.setEnabledReform(
-                        reformOptions.getEnabledReform() | ReformOptions.ALLOW_RESIZE);
+        reformOptions.setEnabledReform(
+                reformOptions.getEnabledReform() | ReformOptions.ALLOW_RESIZE);
 
         // Update the current size if it's not set.
         // TODO: b/348037292 - Remove this special case for PanelEntityImpl.
@@ -88,16 +85,13 @@
             // TODO: b/350563642 - Add checks that size is within minsize and maxsize.
         }
         if (mCurrentSize != null) {
-            unused =
-                    reformOptions.setCurrentSize(
-                            new Vec3(mCurrentSize.width, mCurrentSize.height, mCurrentSize.depth));
+            reformOptions.setCurrentSize(
+                    new Vec3(mCurrentSize.width, mCurrentSize.height, mCurrentSize.depth));
         }
-        unused =
-                reformOptions
-                        .setMinimumSize(new Vec3(mMinSize.width, mMinSize.height, mMinSize.depth))
-                        .setMaximumSize(new Vec3(mMaxSize.width, mMaxSize.height, mMaxSize.depth))
-                        .setFixedAspectRatio(mFixedAspectRatio)
-                        .setForceShowResizeOverlay(mForceShowResizeOverlay);
+        reformOptions.setMinimumSize(new Vec3(mMinSize.width, mMinSize.height, mMinSize.depth));
+        reformOptions.setMaximumSize(new Vec3(mMaxSize.width, mMaxSize.height, mMaxSize.depth));
+        reformOptions.setFixedAspectRatio(mFixedAspectRatio);
+        reformOptions.setForceShowResizeOverlay(mForceShowResizeOverlay);
         ((AndroidXrEntity) entity).updateReformOptions();
         if (mReformEventConsumer != null) {
             ((AndroidXrEntity) entity).addReformEventConsumer(mReformEventConsumer, mExecutor);
@@ -108,9 +102,8 @@
     @Override
     public void onDetach(@NonNull Entity entity) {
         ReformOptions reformOptions = ((AndroidXrEntity) entity).getReformOptions();
-        ReformOptions unused =
-                reformOptions.setEnabledReform(
-                        reformOptions.getEnabledReform() & ~ReformOptions.ALLOW_RESIZE);
+        reformOptions.setEnabledReform(
+                reformOptions.getEnabledReform() & ~ReformOptions.ALLOW_RESIZE);
         ((AndroidXrEntity) entity).updateReformOptions();
         if (mReformEventConsumer != null) {
             ((AndroidXrEntity) entity).removeReformEventConsumer(mReformEventConsumer);
@@ -127,8 +120,7 @@
             return;
         }
         ReformOptions reformOptions = ((AndroidXrEntity) mEntity).getReformOptions();
-        ReformOptions unused =
-                reformOptions.setCurrentSize(new Vec3(size.width, size.height, size.depth));
+        reformOptions.setCurrentSize(new Vec3(size.width, size.height, size.depth));
         ((AndroidXrEntity) mEntity).updateReformOptions();
     }
 
@@ -140,9 +132,7 @@
             return;
         }
         ReformOptions reformOptions = ((AndroidXrEntity) mEntity).getReformOptions();
-        ReformOptions unused =
-                reformOptions.setMinimumSize(
-                        new Vec3(minSize.width, minSize.height, minSize.depth));
+        reformOptions.setMinimumSize(new Vec3(minSize.width, minSize.height, minSize.depth));
         ((AndroidXrEntity) mEntity).updateReformOptions();
     }
 
@@ -154,9 +144,7 @@
             return;
         }
         ReformOptions reformOptions = ((AndroidXrEntity) mEntity).getReformOptions();
-        ReformOptions unused =
-                reformOptions.setMaximumSize(
-                        new Vec3(maxSize.width, maxSize.height, maxSize.depth));
+        reformOptions.setMaximumSize(new Vec3(maxSize.width, maxSize.height, maxSize.depth));
         ((AndroidXrEntity) mEntity).updateReformOptions();
     }
 
@@ -168,7 +156,7 @@
             return;
         }
         ReformOptions reformOptions = ((AndroidXrEntity) mEntity).getReformOptions();
-        ReformOptions unused = reformOptions.setFixedAspectRatio(fixedAspectRatio);
+        reformOptions.setFixedAspectRatio(fixedAspectRatio);
         ((AndroidXrEntity) mEntity).updateReformOptions();
     }
 
@@ -190,7 +178,7 @@
             return;
         }
         ReformOptions reformOptions = ((AndroidXrEntity) mEntity).getReformOptions();
-        ReformOptions unused = reformOptions.setForceShowResizeOverlay(show);
+        reformOptions.setForceShowResizeOverlay(show);
         ((AndroidXrEntity) mEntity).updateReformOptions();
     }
 
@@ -222,7 +210,7 @@
                             break;
                         case ReformEvent.REFORM_STATE_END:
                             if (mAutoHideContent) {
-                                mEntity.setAlpha(mEntity.getAlpha(Space.PARENT), Space.PARENT);
+                                mEntity.setAlpha(mEntity.getAlpha());
                             }
                             break;
                         default:
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/RuntimeUtils.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/RuntimeUtils.java
index b671c05..b9548f2 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/RuntimeUtils.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/RuntimeUtils.java
@@ -20,6 +20,15 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.xr.extensions.environment.EnvironmentVisibilityState;
+import androidx.xr.extensions.environment.PassthroughVisibilityState;
+import androidx.xr.extensions.node.InputEvent.Action;
+import androidx.xr.extensions.node.InputEvent.PointerType;
+import androidx.xr.extensions.node.InputEvent.Source;
+import androidx.xr.extensions.node.Mat4f;
+import androidx.xr.extensions.node.Quatf;
+import androidx.xr.extensions.node.ReformEvent;
+import androidx.xr.extensions.node.Vec3;
 import androidx.xr.runtime.math.Matrix4;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Quaternion;
@@ -34,13 +43,6 @@
 import androidx.xr.scenecore.JxrPlatformAdapter.SpatialCapabilities;
 import androidx.xr.scenecore.impl.perception.Plane;
 
-import com.android.extensions.xr.environment.EnvironmentVisibilityState;
-import com.android.extensions.xr.environment.PassthroughVisibilityState;
-import com.android.extensions.xr.node.Mat4f;
-import com.android.extensions.xr.node.Quatf;
-import com.android.extensions.xr.node.ReformEvent;
-import com.android.extensions.xr.node.Vec3;
-
 final class RuntimeUtils {
     private RuntimeUtils() {}
 
@@ -108,8 +110,7 @@
 
     @Nullable
     private static HitInfo getHitInfo(
-            com.android.extensions.xr.node.InputEvent.HitInfo xrHitInfo,
-            EntityManager entityManager) {
+            androidx.xr.extensions.node.InputEvent.HitInfo xrHitInfo, EntityManager entityManager) {
         if (xrHitInfo == null
                 || xrHitInfo.getInputNode() == null
                 || xrHitInfo.getTransform() == null) {
@@ -131,14 +132,14 @@
     /**
      * Converts an XR InputEvent to a JXRCore InputEvent.
      *
-     * @param xrInputEvent an {@link com.android.extensions.xr.node.InputEvent} instance to be
+     * @param xrInputEvent an {@link androidx.xr.extensions.node.InputEvent} instance to be
      *     converted.
      * @param entityManager an {@link EntityManager} instance to look up entities.
      * @return a {@link androidx.xr.scenecore.JXRCoreRuntime.InputEvent} instance representing the
      *     input event.
      */
     static InputEvent getInputEvent(
-            @NonNull com.android.extensions.xr.node.InputEvent xrInputEvent,
+            @NonNull androidx.xr.extensions.node.InputEvent xrInputEvent,
             @NonNull EntityManager entityManager) {
         Vector3 origin = getVector3(xrInputEvent.getOrigin());
         Vector3 direction = getVector3(xrInputEvent.getDirection());
@@ -162,19 +163,19 @@
     }
 
     @InputEvent.Source
-    static int getInputEventSource(int xrInputEventSource) {
+    static int getInputEventSource(@Source int xrInputEventSource) {
         switch (xrInputEventSource) {
-            case com.android.extensions.xr.node.InputEvent.SOURCE_UNKNOWN:
+            case androidx.xr.extensions.node.InputEvent.SOURCE_UNKNOWN:
                 return InputEvent.SOURCE_UNKNOWN;
-            case com.android.extensions.xr.node.InputEvent.SOURCE_HEAD:
+            case androidx.xr.extensions.node.InputEvent.SOURCE_HEAD:
                 return InputEvent.SOURCE_HEAD;
-            case com.android.extensions.xr.node.InputEvent.SOURCE_CONTROLLER:
+            case androidx.xr.extensions.node.InputEvent.SOURCE_CONTROLLER:
                 return InputEvent.SOURCE_CONTROLLER;
-            case com.android.extensions.xr.node.InputEvent.SOURCE_HANDS:
+            case androidx.xr.extensions.node.InputEvent.SOURCE_HANDS:
                 return InputEvent.SOURCE_HANDS;
-            case com.android.extensions.xr.node.InputEvent.SOURCE_MOUSE:
+            case androidx.xr.extensions.node.InputEvent.SOURCE_MOUSE:
                 return InputEvent.SOURCE_MOUSE;
-            case com.android.extensions.xr.node.InputEvent.SOURCE_GAZE_AND_GESTURE:
+            case androidx.xr.extensions.node.InputEvent.SOURCE_GAZE_AND_GESTURE:
                 return InputEvent.SOURCE_GAZE_AND_GESTURE;
             default:
                 throw new IllegalArgumentException(
@@ -183,13 +184,13 @@
     }
 
     @InputEvent.PointerType
-    static int getInputEventPointerType(int xrInputEventPointerType) {
+    static int getInputEventPointerType(@PointerType int xrInputEventPointerType) {
         switch (xrInputEventPointerType) {
-            case com.android.extensions.xr.node.InputEvent.POINTER_TYPE_DEFAULT:
+            case androidx.xr.extensions.node.InputEvent.POINTER_TYPE_DEFAULT:
                 return InputEvent.POINTER_TYPE_DEFAULT;
-            case com.android.extensions.xr.node.InputEvent.POINTER_TYPE_LEFT:
+            case androidx.xr.extensions.node.InputEvent.POINTER_TYPE_LEFT:
                 return InputEvent.POINTER_TYPE_LEFT;
-            case com.android.extensions.xr.node.InputEvent.POINTER_TYPE_RIGHT:
+            case androidx.xr.extensions.node.InputEvent.POINTER_TYPE_RIGHT:
                 return InputEvent.POINTER_TYPE_RIGHT;
             default:
                 throw new IllegalArgumentException(
@@ -198,21 +199,21 @@
     }
 
     @InputEvent.Action
-    static int getInputEventAction(int xrInputEventAction) {
+    static int getInputEventAction(@Action int xrInputEventAction) {
         switch (xrInputEventAction) {
-            case com.android.extensions.xr.node.InputEvent.ACTION_DOWN:
+            case androidx.xr.extensions.node.InputEvent.ACTION_DOWN:
                 return InputEvent.ACTION_DOWN;
-            case com.android.extensions.xr.node.InputEvent.ACTION_UP:
+            case androidx.xr.extensions.node.InputEvent.ACTION_UP:
                 return InputEvent.ACTION_UP;
-            case com.android.extensions.xr.node.InputEvent.ACTION_MOVE:
+            case androidx.xr.extensions.node.InputEvent.ACTION_MOVE:
                 return InputEvent.ACTION_MOVE;
-            case com.android.extensions.xr.node.InputEvent.ACTION_CANCEL:
+            case androidx.xr.extensions.node.InputEvent.ACTION_CANCEL:
                 return InputEvent.ACTION_CANCEL;
-            case com.android.extensions.xr.node.InputEvent.ACTION_HOVER_MOVE:
+            case androidx.xr.extensions.node.InputEvent.ACTION_HOVER_MOVE:
                 return InputEvent.ACTION_HOVER_MOVE;
-            case com.android.extensions.xr.node.InputEvent.ACTION_HOVER_ENTER:
+            case androidx.xr.extensions.node.InputEvent.ACTION_HOVER_ENTER:
                 return InputEvent.ACTION_HOVER_ENTER;
-            case com.android.extensions.xr.node.InputEvent.ACTION_HOVER_EXIT:
+            case androidx.xr.extensions.node.InputEvent.ACTION_HOVER_EXIT:
                 return InputEvent.ACTION_HOVER_EXIT;
             default:
                 throw new IllegalArgumentException(
@@ -221,7 +222,7 @@
     }
 
     @ResizeEvent.ResizeState
-    static int getResizeEventState(int resizeState) {
+    static int getResizeEventState(@ReformEvent.ReformState int resizeState) {
         switch (resizeState) {
             case ReformEvent.REFORM_STATE_UNKNOWN:
                 return ResizeEvent.RESIZE_STATE_UNKNOWN;
@@ -237,7 +238,10 @@
     }
 
     static Matrix4 getMatrix(Mat4f xrMatrix) {
-        float[] matrixData = xrMatrix.getFlattenedMatrix();
+        float[] matrixData = new float[16];
+        for (int i = 0; i < 4; i++) {
+            System.arraycopy(xrMatrix.m[i], 0, matrixData, i * 4, 4);
+        }
         return new Matrix4(matrixData);
     }
 
@@ -313,34 +317,34 @@
     /**
      * Converts from the Extensions spatial capabilities to the runtime spatial capabilities.
      *
-     * @param extCapabilities a {@link com.android.extensions.xr.space.SpatialCapabilities} instance
-     *     to be converted.
+     * @param extCapabilities a {@link androidx.xr.extensions.space.SpatialCapabilities} instance to
+     *     be converted.
      */
     static SpatialCapabilities convertSpatialCapabilities(
-            com.android.extensions.xr.space.SpatialCapabilities extCapabilities) {
+            androidx.xr.extensions.space.SpatialCapabilities extCapabilities) {
         @SpatialCapabilities.SpatialCapability int capabilities = 0;
         if (extCapabilities.get(
-                com.android.extensions.xr.space.SpatialCapabilities.SPATIAL_UI_CAPABLE)) {
+                androidx.xr.extensions.space.SpatialCapabilities.SPATIAL_UI_CAPABLE)) {
             capabilities |= SpatialCapabilities.SPATIAL_CAPABILITY_UI;
         }
         if (extCapabilities.get(
-                com.android.extensions.xr.space.SpatialCapabilities.SPATIAL_3D_CONTENTS_CAPABLE)) {
+                androidx.xr.extensions.space.SpatialCapabilities.SPATIAL_3D_CONTENTS_CAPABLE)) {
             capabilities |= SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT;
         }
         if (extCapabilities.get(
-                com.android.extensions.xr.space.SpatialCapabilities.PASSTHROUGH_CONTROL_CAPABLE)) {
+                androidx.xr.extensions.space.SpatialCapabilities.PASSTHROUGH_CONTROL_CAPABLE)) {
             capabilities |= SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL;
         }
         if (extCapabilities.get(
-                com.android.extensions.xr.space.SpatialCapabilities.APP_ENVIRONMENTS_CAPABLE)) {
+                androidx.xr.extensions.space.SpatialCapabilities.APP_ENVIRONMENTS_CAPABLE)) {
             capabilities |= SpatialCapabilities.SPATIAL_CAPABILITY_APP_ENVIRONMENT;
         }
         if (extCapabilities.get(
-                com.android.extensions.xr.space.SpatialCapabilities.SPATIAL_AUDIO_CAPABLE)) {
+                androidx.xr.extensions.space.SpatialCapabilities.SPATIAL_AUDIO_CAPABLE)) {
             capabilities |= SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO;
         }
         if (extCapabilities.get(
-                com.android.extensions.xr.space.SpatialCapabilities
+                androidx.xr.extensions.space.SpatialCapabilities
                         .SPATIAL_ACTIVITY_EMBEDDING_CAPABLE)) {
             capabilities |= SpatialCapabilities.SPATIAL_CAPABILITY_EMBED_ACTIVITY;
         }
@@ -353,10 +357,10 @@
      * visibility state.
      *
      * @param environmentState a {@link
-     *     com.android.extensions.xr.environment.EnvironmentVisibilityState} instance to be
-     *     converted.
+     *     androidx.xr.extensions.environment.EnvironmentVisibilityState} instance to be converted.
      */
-    static boolean getIsSpatialEnvironmentPreferenceActive(int environmentState) {
+    static boolean getIsSpatialEnvironmentPreferenceActive(
+            @EnvironmentVisibilityState.State int environmentState) {
         return environmentState == EnvironmentVisibilityState.APP_VISIBLE;
     }
 
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SoundPoolExtensionsWrapperImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SoundPoolExtensionsWrapperImpl.java
index 3f81d52..59bad36 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SoundPoolExtensionsWrapperImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SoundPoolExtensionsWrapperImpl.java
@@ -18,12 +18,11 @@
 
 import android.media.SoundPool;
 
+import androidx.xr.extensions.media.SoundPoolExtensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.PointSourceAttributes;
 import androidx.xr.scenecore.JxrPlatformAdapter.SoundFieldAttributes;
 import androidx.xr.scenecore.JxrPlatformAdapter.SoundPoolExtensionsWrapper;
 
-import com.android.extensions.xr.media.SoundPoolExtensions;
-
 /** Implementation of {@link SoundPoolExtensionsWrapper}. */
 final class SoundPoolExtensionsWrapperImpl implements SoundPoolExtensionsWrapper {
 
@@ -42,7 +41,7 @@
             int priority,
             int loop,
             float rate) {
-        com.android.extensions.xr.media.PointSourceAttributes extAttributes =
+        androidx.xr.extensions.media.PointSourceAttributes extAttributes =
                 MediaUtils.convertPointSourceAttributesToExtensions(attributes);
         return mExtensions.playAsPointSource(
                 soundPool, soundId, extAttributes, volume, priority, loop, rate);
@@ -57,7 +56,7 @@
             int priority,
             int loop,
             float rate) {
-        com.android.extensions.xr.media.SoundFieldAttributes extAttributes =
+        androidx.xr.extensions.media.SoundFieldAttributes extAttributes =
                 MediaUtils.convertSoundFieldAttributesToExtensions(attributes);
 
         return mExtensions.playAsSoundField(
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SpatialEnvironmentImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SpatialEnvironmentImpl.java
index 24962d4..accb540 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SpatialEnvironmentImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SpatialEnvironmentImpl.java
@@ -23,21 +23,19 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
+import androidx.xr.extensions.XrExtensionResult;
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.environment.EnvironmentVisibilityState;
+import androidx.xr.extensions.environment.PassthroughVisibilityState;
+import androidx.xr.extensions.node.Node;
+import androidx.xr.extensions.node.NodeTransaction;
+import androidx.xr.extensions.passthrough.PassthroughState;
+import androidx.xr.extensions.space.SpatialState;
 import androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource;
 import androidx.xr.scenecore.JxrPlatformAdapter.GltfModelResource;
-import androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource;
 import androidx.xr.scenecore.JxrPlatformAdapter.SpatialCapabilities;
 import androidx.xr.scenecore.JxrPlatformAdapter.SpatialEnvironment;
 
-import com.android.extensions.xr.XrExtensionResult;
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.environment.EnvironmentVisibilityState;
-import com.android.extensions.xr.environment.PassthroughVisibilityState;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.NodeTransaction;
-import com.android.extensions.xr.passthrough.PassthroughState;
-import com.android.extensions.xr.space.SpatialState;
-
 import com.google.androidxr.splitengine.SplitEngineSubspaceManager;
 import com.google.androidxr.splitengine.SubspaceNode;
 import com.google.ar.imp.apibindings.ImpressApi;
@@ -49,6 +47,7 @@
 import java.util.HashSet;
 import java.util.Objects;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 
@@ -64,9 +63,9 @@
     public static final String PASSTHROUGH_NODE_NAME = "EnvironmentPassthroughNode";
     @VisibleForTesting final Node mPassthroughNode;
     private final XrExtensions mXrExtensions;
+    private final Node mRootEnvironmentNode;
     private final boolean mUseSplitEngine;
     @Nullable private Activity mActivity;
-    private Node mRootEnvironmentNode;
     // Used to represent the geometry
     private Node mGeometryNode;
     // the "xrExtensions.setEnvironment" call effectively makes a node into a skybox
@@ -94,6 +93,7 @@
             Collections.synchronizedSet(new HashSet<>());
 
     // Assets used to turn the skybox black when devs pass in null for the skybox.
+    private ListenableFuture<ExrImageResource> mNullSkyboxResourceFuture;
     private ExrImageResource mNullSkyboxResource = null;
 
     SpatialEnvironmentImpl(
@@ -101,6 +101,7 @@
             @NonNull XrExtensions xrExtensions,
             @NonNull Node rootSceneNode,
             @NonNull Supplier<SpatialState> spatialStateProvider,
+            @NonNull ListenableFuture<ExrImageResource> nullSkyboxResourceFuture,
             boolean useSplitEngine) {
         mActivity = activity;
         mXrExtensions = xrExtensions;
@@ -110,6 +111,7 @@
         mSkyboxNode = xrExtensions.createNode();
         mUseSplitEngine = useSplitEngine;
         mSpatialStateProvider = spatialStateProvider;
+        mNullSkyboxResourceFuture = nullSkyboxResourceFuture;
 
         try (NodeTransaction transaction = xrExtensions.createNodeTransaction()) {
             transaction
@@ -303,7 +305,7 @@
      * skybox is null, this method unsets the client skybox preference, resulting in the system
      * skybox being used.
      */
-    private void applySkyboxLegacy(@Nullable ExrImageResourceImpl skybox) {
+    private void applySkybox(@Nullable ExrImageResourceImpl skybox) {
         // We need to create a new node here because we can't re-use the old CPM node when changing
         // geometry and skybox.
         try (NodeTransaction transaction = mXrExtensions.createNodeTransaction()) {
@@ -312,33 +314,17 @@
 
         mSkyboxNode = mXrExtensions.createNode();
         try (NodeTransaction transaction = mXrExtensions.createNodeTransaction()) {
-            NodeTransaction unused = transaction.setName(mSkyboxNode, SKYBOX_NODE_NAME);
+            transaction
+                    .setName(mSkyboxNode, SKYBOX_NODE_NAME)
+                    .setParent(mSkyboxNode, mRootEnvironmentNode);
             if (skybox != null) {
-                unused = transaction.setEnvironment(mSkyboxNode, skybox.getToken());
+                transaction.setEnvironment(mSkyboxNode, skybox.getToken());
             }
             transaction.apply();
         }
     }
 
     /**
-     * Updates the system's preferred IBL asset. This applies a skybox that has been generated from
-     * a preprocessed EXR image through SplitEngine. If skybox is null, this method clears the
-     * preferred IBL selection, resulting in the system skybox being used.
-     */
-    private void applySkyboxSplitEngine(@Nullable ExrImageResourceImplSplitEngine skybox) {
-        if (!Looper.getMainLooper().isCurrentThread()) {
-            throw new IllegalStateException("This method must be called on the main thread.");
-        }
-
-        // The skybox is not modeled by a node in the Split Engine, so we don't update mSkyboxNode
-        // here.
-        mImpressApi.clearPreferredEnvironmentIblAsset();
-        if (skybox != null) {
-            mImpressApi.setPreferredEnvironmentLight(skybox.getExtensionImageToken());
-        }
-    }
-
-    /**
      * Stages updates to the CPM graph for the Environment to reflect a new geometry preference. If
      * geometry is null, this method unsets the client geometry preference, resulting in the system
      * geometry being used.
@@ -351,9 +337,11 @@
         }
         mGeometryNode = mXrExtensions.createNode();
         try (NodeTransaction transaction = mXrExtensions.createNodeTransaction()) {
-            NodeTransaction unused = transaction.setName(mGeometryNode, GEOMETRY_NODE_NAME);
+            transaction
+                    .setName(mGeometryNode, GEOMETRY_NODE_NAME)
+                    .setParent(mGeometryNode, mRootEnvironmentNode);
             if (geometry != null) {
-                unused = transaction.setGltfModel(mGeometryNode, geometry.getExtensionModelToken());
+                transaction.setGltfModel(mGeometryNode, geometry.getExtensionModelToken());
             }
             transaction.apply();
         }
@@ -366,11 +354,7 @@
      *
      * @throws IllegalStateException if called on a thread other than the main thread.
      */
-    private void applyGeometrySplitEngine(
-            @Nullable GltfModelResourceImplSplitEngine geometry,
-            @Nullable MaterialResource material,
-            @Nullable String meshName,
-            @Nullable String animationName) {
+    private void applyGeometrySplitEngine(@Nullable GltfModelResourceImplSplitEngine geometry) {
         if (!Looper.getMainLooper().isCurrentThread()) {
             throw new IllegalStateException("This method must be called on the main thread.");
         }
@@ -393,19 +377,12 @@
 
         try (NodeTransaction transaction = mXrExtensions.createNodeTransaction()) {
             transaction
-                    .setName(
-                            mGeometrySubspaceSplitEngine.getSubspaceNodeActual(),
-                            GEOMETRY_NODE_NAME)
-                    .setPosition(
-                            mGeometrySubspaceSplitEngine.getSubspaceNodeActual(), 0.0f, 0.0f, 0.0f)
-                    .setScale(
-                            mGeometrySubspaceSplitEngine.getSubspaceNodeActual(), 1.0f, 1.0f, 1.0f)
+                    .setName(mGeometrySubspaceSplitEngine.subspaceNode, GEOMETRY_NODE_NAME)
+                    .setParent(mGeometrySubspaceSplitEngine.subspaceNode, mRootEnvironmentNode)
+                    .setPosition(mGeometrySubspaceSplitEngine.subspaceNode, 0.0f, 0.0f, 0.0f)
+                    .setScale(mGeometrySubspaceSplitEngine.subspaceNode, 1.0f, 1.0f, 1.0f)
                     .setOrientation(
-                            mGeometrySubspaceSplitEngine.getSubspaceNodeActual(),
-                            0.0f,
-                            0.0f,
-                            0.0f,
-                            1.0f)
+                            mGeometrySubspaceSplitEngine.subspaceNode, 0.0f, 0.0f, 0.0f, 1.0f)
                     .apply();
         }
 
@@ -413,24 +390,13 @@
             int modelImpressNode =
                     mImpressApi.instanceGltfModel(
                             geometry.getExtensionModelToken(), /* enableCollider= */ false);
-            if (material != null && meshName != null) {
-                MaterialResourceImpl materialImpl = (MaterialResourceImpl) material;
-                mImpressApi.setMaterialOverride(
-                        modelImpressNode, materialImpl.getMaterialToken(), meshName);
-            }
-            if (animationName != null) {
-                ListenableFuture<Void> unused =
-                        mImpressApi.animateGltfModel(modelImpressNode, animationName, true);
-            }
             mImpressApi.setImpressNodeParent(modelImpressNode, mGeometrySubspaceImpressNode);
         }
 
         if (prevGeometrySubspaceSplitEngine != null && prevGeometrySubspaceImpressNode != -1) {
             // Detach the previous geometry subspace from the root environment node.
             try (NodeTransaction transaction = mXrExtensions.createNodeTransaction()) {
-                transaction
-                        .setParent(prevGeometrySubspaceSplitEngine.getSubspaceNodeActual(), null)
-                        .apply();
+                transaction.setParent(prevGeometrySubspaceSplitEngine.subspaceNode, null).apply();
             }
             // Destroying the subspace will also destroy the underlying Impress node for the
             // Environment
@@ -447,10 +413,6 @@
         mImpressApi = api;
     }
 
-    void onNullSkyboxResourceReady(ExrImageResource nullSkyboxResource) {
-        mNullSkyboxResource = nullSkyboxResource;
-    }
-
     @Override
     @NonNull
     @CanIgnoreReturnValue
@@ -470,11 +432,6 @@
         ExrImageResource newSkybox = newPreference == null ? null : newPreference.skybox;
         ExrImageResource prevSkybox =
                 mSpatialEnvironmentPreference == null ? null : mSpatialEnvironmentPreference.skybox;
-        MaterialResource newMaterial =
-                newPreference == null ? null : newPreference.geometryMaterial;
-        String newMeshName = newPreference == null ? null : newPreference.geometryMeshName;
-        String newAnimationName =
-                newPreference == null ? null : newPreference.geometryAnimationName;
 
         // TODO(b/329907079): Map GltfModelResourceImplSplitEngine to GltfModelResource in Impl
         // Layer
@@ -491,31 +448,15 @@
         }
 
         // TODO b/329907079: Map ExrImageResourceImpl to ExrImageResource in Impl Layer
-        // TODO(b/396483557): Don't allow use of ExrImageResourceImpl when SplitEngine is enabled.
-        // This
-        // is a temporary measure to not break clients while they migrate to the Split Engine route.
-        if (newSkybox != null) {
-            if (mUseSplitEngine
-                    && !((newSkybox instanceof ExrImageResourceImplSplitEngine)
-                            || (newSkybox instanceof ExrImageResourceImpl))) {
-                throw new IllegalArgumentException(
-                        "SplitEngine is enabled but the prefererred skybox is not of type"
-                                + " ExrImageResourceImplSplitEngine or ExrImageResourceImpl.");
-            } else if (!mUseSplitEngine && !(newSkybox instanceof ExrImageResourceImpl)) {
-                throw new IllegalArgumentException(
-                        "SplitEngine is disabled but the prefererred skybox is not of type"
-                                + " ExrImageResourceImpl.");
-            }
+        if (newSkybox != null && !(newSkybox instanceof ExrImageResourceImpl)) {
+            throw new IllegalArgumentException(
+                    "The prefererred skybox is not of type ExrImageResourceImpl.");
         }
 
         if (!Objects.equals(newGeometry, prevGeometry)) {
             // TODO: b/354711945 - Remove this check once we migrate completely to SplitEngine
             if (mUseSplitEngine) {
-                applyGeometrySplitEngine(
-                        (GltfModelResourceImplSplitEngine) newGeometry,
-                        newMaterial,
-                        newMeshName,
-                        newAnimationName);
+                applyGeometrySplitEngine((GltfModelResourceImplSplitEngine) newGeometry);
             } else {
                 applyGeometryLegacy((GltfModelResourceImpl) newGeometry);
             }
@@ -526,85 +467,36 @@
                 || (mSpatialEnvironmentPreference == null && newPreference != null)) {
             // If the preference object is non-null but contains a null skybox, we set a black
             // skybox.
-            if (newSkybox == null && newPreference != null) {
+            if (mNullSkyboxResourceFuture == null) {
+                Log.e(TAG, "Failed to get null skybox resource.");
+            } else if (newSkybox == null && newPreference != null) {
                 // Lazy initialization of the null skybox resource.
                 if (mNullSkyboxResource == null) {
-                    Log.e(TAG, "Black skybox resource is needed before it finishes loading.");
+                    try {
+                        mNullSkyboxResource = mNullSkyboxResourceFuture.get();
+                    } catch (ExecutionException | InterruptedException e) {
+                        Log.e(TAG, "Failed to get null skybox resource.");
+                    }
                 }
                 // Set the skybox to a black texture
                 if (mNullSkyboxResource != null) {
                     newSkybox = mNullSkyboxResource;
                 }
             }
-
-            // TODO(b/396483557): Don't allow use of applySkyboxLegacy when SplitEngine is enabled.
-            // This
-            // is a temporary measure to not break clients while they migrate to the Split Engine
-            // route.
-            // For the null case, Split Engine could be enabled but a non Split Engine skybox could
-            // be
-            // set. In that case only the skybox node would not be null and the legacy path would be
-            // followed.
-            if (newSkybox == null) {
-                if (mUseSplitEngine && mSkyboxNode == null) {
-                    applySkyboxSplitEngine(null);
-                } else {
-                    applySkyboxLegacy(null);
-                }
-            } else {
-                // For the non null case, Split Engine could be enabled but a non Split Engine
-                // skybox could
-                // be set. In that case newSkybox would be an instance of ExrImageResourceImpl and
-                // the
-                // legacy
-                // path would be followed.
-                if (mUseSplitEngine && (newSkybox instanceof ExrImageResourceImplSplitEngine)) {
-                    applySkyboxSplitEngine((ExrImageResourceImplSplitEngine) newSkybox);
-                } else {
-                    applySkyboxLegacy((ExrImageResourceImpl) newSkybox);
-                }
-            }
+            applySkybox((ExrImageResourceImpl) newSkybox);
         }
 
         try (NodeTransaction transaction = mXrExtensions.createNodeTransaction()) {
             if (newSkybox == null && newGeometry == null) {
-                if (mUseSplitEngine) {
-                    mImpressApi.clearPreferredEnvironmentIblAsset();
-                }
                 mXrExtensions.detachSpatialEnvironment(
                         mActivity,
                         (result) -> logXrExtensionResult("detachSpatialEnvironment", result),
                         Runnable::run);
             } else {
-                // Create a new root node for the environment and attach the children of the old
-                // root node
-                // to the new root node if they exist. This is necessary because the system will
-                // only
-                // trigger an environment transition if the root environment node changes.
-                Node newRootEnvironmentNode = mXrExtensions.createNode();
-                if (mSkyboxNode != null) {
-                    NodeTransaction unused =
-                            transaction.setParent(mSkyboxNode, newRootEnvironmentNode);
-                }
-                if (mGeometrySubspaceSplitEngine != null) {
-                    NodeTransaction unused =
-                            transaction.setParent(
-                                    mGeometrySubspaceSplitEngine.getSubspaceNodeActual(),
-                                    newRootEnvironmentNode);
-                }
-                if (mGeometryNode != null) {
-                    NodeTransaction unused =
-                            transaction.setParent(mGeometryNode, newRootEnvironmentNode);
-                }
-                transaction.apply();
                 mXrExtensions.attachSpatialEnvironment(
                         mActivity,
-                        newRootEnvironmentNode,
-                        (result) -> {
-                            // Update the root environment node to the new root node.
-                            mRootEnvironmentNode = newRootEnvironmentNode;
-                            logXrExtensionResult("attachSpatialEnvironment", result);
-                        },
+                        mRootEnvironmentNode,
+                        (result) -> logXrExtensionResult("attachSpatialEnvironment", result),
                         Runnable::run);
             }
         }
@@ -678,14 +570,11 @@
         if (mUseSplitEngine) {
             if (mGeometrySubspaceSplitEngine != null) {
                 try (NodeTransaction transaction = mXrExtensions.createNodeTransaction()) {
-                    transaction
-                            .setParent(mGeometrySubspaceSplitEngine.getSubspaceNodeActual(), null)
-                            .apply();
+                    transaction.setParent(mGeometrySubspaceSplitEngine.subspaceNode, null).apply();
                 }
                 mSplitEngineSubspaceManager.deleteSubspace(mGeometrySubspaceSplitEngine.subspaceId);
                 mGeometrySubspaceSplitEngine = null;
                 mImpressApi.destroyImpressNode(mGeometrySubspaceImpressNode);
-                mImpressApi.clearPreferredEnvironmentIblAsset();
             }
         }
         mActivePassthroughOpacity = null;
@@ -697,7 +586,6 @@
                     .setParent(mPassthroughNode, null)
                     .apply();
         }
-        mRootEnvironmentNode = null;
         mGeometrySubspaceSplitEngine = null;
         mGeometrySubspaceImpressNode = 0;
         mSplitEngineSubspaceManager = null;
@@ -706,6 +594,7 @@
         mIsSpatialEnvironmentPreferenceActive = false;
         mOnPassthroughOpacityChangedListeners.clear();
         mOnSpatialEnvironmentChangedListeners.clear();
+        mNullSkyboxResourceFuture = null;
         mNullSkyboxResource = null;
         // TODO: b/376934871 - Check async results.
         mXrExtensions.detachSpatialEnvironment(mActivity, (result) -> {}, Runnable::run);
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SurfaceEntityImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SurfaceEntityImpl.java
index cb491b3..184462a 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SurfaceEntityImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SurfaceEntityImpl.java
@@ -18,14 +18,13 @@
 
 import android.view.Surface;
 
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.node.NodeTransaction;
 import androidx.xr.scenecore.JxrPlatformAdapter.Dimensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.Entity;
 import androidx.xr.scenecore.JxrPlatformAdapter.SurfaceEntity;
 import androidx.xr.scenecore.JxrPlatformAdapter.SurfaceEntity.CanvasShape;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.NodeTransaction;
-
 import com.google.androidxr.splitengine.SplitEngineSubspaceManager;
 import com.google.androidxr.splitengine.SubspaceNode;
 import com.google.ar.imp.apibindings.ImpressApi;
@@ -75,7 +74,7 @@
 
         try (NodeTransaction transaction = extensions.createNodeTransaction()) {
             // Make the Entity node a parent of the subspace node.
-            transaction.setParent(mSubspace.getSubspaceNodeActual(), mNode).apply();
+            transaction.setParent(mSubspace.subspaceNode, mNode).apply();
         }
 
         // This is broken up into two steps to limit the size of the Impress Surface
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SystemSpaceEntityImpl.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SystemSpaceEntityImpl.java
index d481ac6..f7706592 100644
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SystemSpaceEntityImpl.java
+++ b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/SystemSpaceEntityImpl.java
@@ -16,24 +16,20 @@
 
 package androidx.xr.scenecore.impl;
 
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-
 import android.util.Log;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.xr.extensions.XrExtensions;
+import androidx.xr.extensions.node.Node;
 import androidx.xr.runtime.math.Matrix4;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Vector3;
 import androidx.xr.scenecore.JxrPlatformAdapter;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.Node;
-
 import java.io.Closeable;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
 
 /**
  * A parentless system-controlled JXRCore Entity that defines its own coordinate space.
@@ -49,9 +45,6 @@
     Closeable mNodeTransformCloseable;
     private OnSpaceUpdatedListener mSpaceUpdatedListener;
     private Executor mSpaceUpdatedExecutor;
-    // TODO: b/377554103 - Remove delay once the subscription API are in sync with the node
-    // creation.
-    static final int SUBSCRIPTION_DELAY_MS = 30; // milliseconds
 
     SystemSpaceEntityImpl(
             Node node,
@@ -125,20 +118,13 @@
      * @param node The node to subscribe to.
      * @param executor The executor to run the callback on.
      */
-    private void subscribeToNodeTransform(Node node, ScheduledExecutorService executor) {
-        // Ensure that the subscription is created after the node is created in SpF.
-        ScheduledFuture<?> unused =
-                executor.schedule(
-                        () ->
-                                mNodeTransformCloseable =
-                                        node.subscribeToTransform(
-                                                (transform) ->
-                                                        setOpenXrReferenceSpacePose(
-                                                                RuntimeUtils.getMatrix(
-                                                                        transform.getTransform())),
-                                                executor),
-                        SUBSCRIPTION_DELAY_MS,
-                        MILLISECONDS);
+    private void subscribeToNodeTransform(Node node, Executor executor) {
+        mNodeTransformCloseable =
+                node.subscribeToTransform(
+                        (transform) ->
+                                setOpenXrReferenceSpacePose(
+                                        RuntimeUtils.getMatrix(transform.getTransform())),
+                        executor);
     }
 
     @NonNull
diff --git a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/extensions/XrExtensionsProvider.java b/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/extensions/XrExtensionsProvider.java
deleted file mode 100644
index 4d3989a..0000000
--- a/xr/scenecore/scenecore/src/main/java/androidx/xr/scenecore/impl/extensions/XrExtensionsProvider.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.scenecore.impl.extensions;
-
-import android.util.Log;
-
-import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
-
-import com.android.extensions.xr.XrExtensions;
-
-/** Provides the OEM implementation of {@link XrExtensions}. */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public class XrExtensionsProvider {
-    private XrExtensionsProvider() {}
-
-    /**
-     * Returns the OEM implementation of {@link XrExtensions} or returns null if no implementation
-     * is found.
-     */
-    @Nullable
-    public static XrExtensions getXrExtensions() {
-        try {
-            return XrExtensionsInstance.getInstance();
-        } catch (NoClassDefFoundError e) {
-            Log.w("XrExtensionsProvider", "No XrExtensions implementation found.", e);
-            return null;
-        }
-    }
-
-    private static class XrExtensionsInstance {
-        private XrExtensionsInstance() {}
-
-        private static class XrExtensionsHolder {
-            public static final XrExtensions INSTANCE = new XrExtensions();
-        }
-
-        private static XrExtensions getInstance() {
-            return XrExtensionsHolder.INSTANCE;
-        }
-    }
-}
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/EntityManagerTest.kt b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/EntityManagerTest.kt
index 8997a22..8ce0872 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/EntityManagerTest.kt
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/EntityManagerTest.kt
@@ -17,10 +17,7 @@
 package androidx.xr.scenecore
 
 import android.app.Activity
-import android.content.Context
-import android.view.View
 import android.widget.TextView
-import androidx.xr.runtime.math.Pose
 import com.google.common.truth.Truth.assertThat
 import com.google.common.util.concurrent.Futures
 import kotlin.time.Duration.Companion.seconds
@@ -38,7 +35,7 @@
 @RunWith(RobolectricTestRunner::class)
 class EntityManagerTest {
     private val activity = Robolectric.buildActivity(Activity::class.java).create().start().get()
-    private val mockPlatformAdapter = mock<JxrPlatformAdapter>()
+    private val mockRuntime = mock<JxrPlatformAdapter>()
     private val mockGltfModelEntityImpl = mock<JxrPlatformAdapter.GltfEntity>()
     private val mockPanelEntityImpl = mock<JxrPlatformAdapter.PanelEntity>()
     private val mockAnchorEntityImpl = mock<JxrPlatformAdapter.AnchorEntity>()
@@ -56,39 +53,29 @@
 
     @Before
     fun setUp() {
-        whenever(mockPlatformAdapter.spatialEnvironment).thenReturn(mock())
-        whenever(mockPlatformAdapter.activitySpace).thenReturn(mock())
-        whenever(mockPlatformAdapter.activitySpaceRootImpl).thenReturn(mock())
-        whenever(mockPlatformAdapter.headActivityPose).thenReturn(mock())
-        whenever(mockPlatformAdapter.perceptionSpaceActivityPose).thenReturn(mock())
-        whenever(mockPlatformAdapter.loadGltfByAssetNameSplitEngine(Mockito.anyString()))
+        whenever(mockRuntime.spatialEnvironment).thenReturn(mock())
+        whenever(mockRuntime.activitySpace).thenReturn(mock())
+        whenever(mockRuntime.activitySpaceRootImpl).thenReturn(mock())
+        whenever(mockRuntime.headActivityPose).thenReturn(mock())
+        whenever(mockRuntime.perceptionSpaceActivityPose).thenReturn(mock())
+        whenever(mockRuntime.loadGltfByAssetNameSplitEngine(Mockito.anyString()))
             .thenReturn(Futures.immediateFuture(mock()))
-        whenever(mockPlatformAdapter.createGltfEntity(any(), any(), any()))
+        whenever(mockRuntime.createGltfEntity(any(), any(), any()))
             .thenReturn(mockGltfModelEntityImpl)
-        whenever(
-                mockPlatformAdapter.createPanelEntity(
-                    any<Context>(),
-                    any<Pose>(),
-                    any<View>(),
-                    any<JxrPlatformAdapter.PixelDimensions>(),
-                    any<String>(),
-                    any<JxrPlatformAdapter.Entity>(),
-                )
-            )
+        whenever(mockRuntime.createPanelEntity(any(), any(), any(), any(), any(), any(), any()))
             .thenReturn(mockPanelEntityImpl)
-        whenever(mockPlatformAdapter.createAnchorEntity(any(), any(), any(), any()))
+        whenever(mockRuntime.createAnchorEntity(any(), any(), any(), any()))
             .thenReturn(mockAnchorEntityImpl)
         whenever(mockAnchorEntityImpl.state)
             .thenReturn(JxrPlatformAdapter.AnchorEntity.State.UNANCHORED)
         whenever(mockAnchorEntityImpl.persistState)
             .thenReturn(JxrPlatformAdapter.AnchorEntity.PersistState.PERSIST_NOT_REQUESTED)
-        whenever(mockPlatformAdapter.createActivityPanelEntity(any(), any(), any(), any(), any()))
+        whenever(mockRuntime.createActivityPanelEntity(any(), any(), any(), any(), any()))
             .thenReturn(mockActivityPanelEntity)
-        whenever(mockPlatformAdapter.createEntity(any(), any(), any()))
-            .thenReturn(mockContentlessEntity)
-        whenever(mockPlatformAdapter.mainPanelEntity).thenReturn(mockPanelEntityImpl)
-        session = Session.create(activity, mockPlatformAdapter)
-        activitySpace = ActivitySpace.create(mockPlatformAdapter, entityManager)
+        whenever(mockRuntime.createEntity(any(), any(), any())).thenReturn(mockContentlessEntity)
+        whenever(mockRuntime.mainPanelEntity).thenReturn(mockPanelEntityImpl)
+        session = Session.create(activity, mockRuntime)
+        activitySpace = ActivitySpace.create(mockRuntime, entityManager)
     }
 
     @Test
@@ -234,24 +221,25 @@
     private fun createPanelEntity() {
         panelEntity =
             PanelEntity.create(
-                activity,
-                mockPlatformAdapter,
+                mockRuntime,
                 entityManager,
                 TextView(activity),
-                PixelDimensions(720, 480),
+                Dimensions(720f, 480f),
+                Dimensions(0.1f, 0.1f, 0.1f),
                 "test",
+                activity,
             )
     }
 
     private fun createGltfEntity() {
         gltfModel = GltfModel.create(session, "test.glb").get()
-        gltfModelEntity = GltfModelEntity.create(mockPlatformAdapter, entityManager, gltfModel)
+        gltfModelEntity = GltfModelEntity.create(mockRuntime, entityManager, gltfModel)
     }
 
     private fun createAnchorEntity() {
         anchorEntity =
             AnchorEntity.create(
-                mockPlatformAdapter,
+                mockRuntime,
                 entityManager,
                 Dimensions(),
                 PlaneType.ANY,
@@ -263,7 +251,7 @@
     private fun createActivityPanelEntity() {
         activityPanelEntity =
             ActivityPanelEntity.create(
-                mockPlatformAdapter,
+                mockRuntime,
                 entityManager,
                 PixelDimensions(640, 480),
                 "test",
@@ -272,6 +260,6 @@
     }
 
     private fun createContentlessEntity() {
-        contentlessEntity = ContentlessEntity.create(mockPlatformAdapter, entityManager, "test")
+        contentlessEntity = ContentlessEntity.create(mockRuntime, entityManager, "test")
     }
 }
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/EntityTest.kt b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/EntityTest.kt
index 4ed0938..4fc43fe 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/EntityTest.kt
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/EntityTest.kt
@@ -17,9 +17,7 @@
 package androidx.xr.scenecore
 
 import android.app.Activity
-import android.content.Context
 import android.content.Intent
-import android.view.View
 import android.widget.TextView
 import androidx.xr.runtime.math.Pose
 import androidx.xr.runtime.math.Vector3
@@ -34,7 +32,6 @@
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.eq
 import org.mockito.Mockito
 import org.mockito.kotlin.any
 import org.mockito.kotlin.argumentCaptor
@@ -84,12 +81,13 @@
         var getAlphaCalled: Boolean = false
         var setHiddenCalled: Boolean = false
         var getHiddenCalled: Boolean = false
+        var getActivitySpaceAlphaCalled: Boolean = false
         var getWorldSpaceScaleCalled: Boolean = false
         var getActivitySpaceScaleCalled: Boolean = false
 
-        override fun setPose(pose: Pose, @SpaceValue space: Int) {}
+        override fun setPose(pose: Pose) {}
 
-        override fun getPose(@SpaceValue space: Int): Pose {
+        override fun getPose(): Pose {
             return Pose()
         }
 
@@ -104,26 +102,29 @@
             return Pose()
         }
 
-        override fun getAlpha(@SpaceValue space: Int): Float = 1.0f.apply { getAlphaCalled = true }
+        override fun setSize(dimensions: JxrPlatformAdapter.Dimensions) {}
 
-        override fun setAlpha(alpha: Float, @SpaceValue space: Int) {
+        override fun getAlpha(): Float = 1.0f.apply { getAlphaCalled = true }
+
+        override fun setAlpha(alpha: Float) {
             setAlphaCalled = true
         }
 
-        override fun isHidden(includeParents: Boolean): Boolean {
-            getHiddenCalled = true
-            return false
-        }
+        override fun isHidden(includeParents: Boolean): Boolean =
+            false.apply { getHiddenCalled = true }
 
         override fun setHidden(hidden: Boolean) {
             setHiddenCalled = true
         }
 
-        override fun setScale(scale: Vector3, @SpaceValue space: Int) {
+        override fun getActivitySpaceAlpha(): Float =
+            1.0f.apply { getActivitySpaceAlphaCalled = true }
+
+        override fun setScale(scale: Vector3) {
             setScaleCalled = true
         }
 
-        override fun getScale(@SpaceValue space: Int): Vector3 {
+        override fun getScale(): Vector3 {
             getScaleCalled = true
             return Vector3()
         }
@@ -209,12 +210,13 @@
             .thenReturn(mockGltfModelEntityImpl)
         whenever(
                 mockPlatformAdapter.createPanelEntity(
-                    any<Context>(),
-                    any<Pose>(),
-                    any<View>(),
-                    any<JxrPlatformAdapter.PixelDimensions>(),
-                    any<String>(),
-                    any<JxrPlatformAdapter.Entity>(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any()
                 )
             )
             .thenReturn(mockPanelEntityImpl)
@@ -237,12 +239,13 @@
         gltfModelEntity = GltfModelEntity.create(mockPlatformAdapter, entityManager, gltfModel)
         panelEntity =
             PanelEntity.create(
-                context = activity,
-                adapter = mockPlatformAdapter,
+                mockPlatformAdapter,
                 entityManager = entityManager,
-                view = TextView(activity),
-                pixelDimensions = PixelDimensions(720, 480),
-                name = "test",
+                TextView(activity),
+                Dimensions(720f, 480f),
+                Dimensions(0.1f, 0.1f, 0.1f),
+                "test",
+                activity,
             )
         anchorEntity =
             AnchorEntity.create(
@@ -373,35 +376,33 @@
         val pose = Pose.Identity
 
         panelEntity.setPose(pose)
-        gltfModelEntity.setPose(pose, Space.PARENT)
-        anchorEntity.setPose(pose, Space.ACTIVITY)
-        activityPanelEntity.setPose(pose, Space.REAL_WORLD)
+        gltfModelEntity.setPose(pose)
+        anchorEntity.setPose(pose)
+        activityPanelEntity.setPose(pose)
 
-        verify(mockPanelEntityImpl).setPose(any(), eq(JxrPlatformAdapter.Space.PARENT))
-        verify(mockGltfModelEntityImpl).setPose(any(), eq(JxrPlatformAdapter.Space.PARENT))
-        verify(mockAnchorEntityImpl).setPose(any(), eq(JxrPlatformAdapter.Space.ACTIVITY))
-        verify(mockActivityPanelEntity).setPose(any(), eq(JxrPlatformAdapter.Space.REAL_WORLD))
+        verify(mockPanelEntityImpl).setPose(any())
+        verify(mockGltfModelEntityImpl).setPose(any())
+        verify(mockAnchorEntityImpl).setPose(any())
+        verify(mockActivityPanelEntity).setPose(any())
     }
 
     @Test
     fun allEntityGetPose_callsRuntimeEntityImplGetPose() {
-        whenever(mockPanelEntityImpl.getPose(JxrPlatformAdapter.Space.PARENT)).thenReturn(Pose())
-        whenever(mockGltfModelEntityImpl.getPose(JxrPlatformAdapter.Space.PARENT))
-            .thenReturn(Pose())
-        whenever(mockAnchorEntityImpl.getPose(JxrPlatformAdapter.Space.ACTIVITY)).thenReturn(Pose())
-        whenever(mockActivityPanelEntity.getPose(JxrPlatformAdapter.Space.REAL_WORLD))
-            .thenReturn(Pose())
+        whenever(mockPanelEntityImpl.pose).thenReturn(Pose())
+        whenever(mockGltfModelEntityImpl.pose).thenReturn(Pose())
+        whenever(mockAnchorEntityImpl.pose).thenReturn(Pose())
+        whenever(mockActivityPanelEntity.pose).thenReturn(Pose())
         val pose = Pose.Identity
 
         assertThat(panelEntity.getPose()).isEqualTo(pose)
-        assertThat(gltfModelEntity.getPose(Space.PARENT)).isEqualTo(pose)
-        assertThat(anchorEntity.getPose(Space.ACTIVITY)).isEqualTo(pose)
-        assertThat(activityPanelEntity.getPose(Space.REAL_WORLD)).isEqualTo(pose)
+        assertThat(gltfModelEntity.getPose()).isEqualTo(pose)
+        assertThat(anchorEntity.getPose()).isEqualTo(pose)
+        assertThat(activityPanelEntity.getPose()).isEqualTo(pose)
 
-        verify(mockPanelEntityImpl).getPose(JxrPlatformAdapter.Space.PARENT)
-        verify(mockGltfModelEntityImpl).getPose(JxrPlatformAdapter.Space.PARENT)
-        verify(mockAnchorEntityImpl).getPose(JxrPlatformAdapter.Space.ACTIVITY)
-        verify(mockActivityPanelEntity).getPose(JxrPlatformAdapter.Space.REAL_WORLD)
+        verify(mockPanelEntityImpl).getPose()
+        verify(mockGltfModelEntityImpl).getPose()
+        verify(mockAnchorEntityImpl).getPose()
+        verify(mockActivityPanelEntity).getPose()
     }
 
     @Test
@@ -428,40 +429,39 @@
         val alpha = 0.1f
 
         panelEntity.setAlpha(alpha)
-        gltfModelEntity.setAlpha(alpha, Space.PARENT)
-        anchorEntity.setAlpha(alpha, Space.ACTIVITY)
-        activityPanelEntity.setAlpha(alpha, Space.REAL_WORLD)
+        gltfModelEntity.setAlpha(alpha)
+        anchorEntity.setAlpha(alpha)
+        activityPanelEntity.setAlpha(alpha)
         contentlessEntity.setAlpha(alpha)
         activitySpace.setAlpha(alpha)
 
-        verify(mockPanelEntityImpl).setAlpha(alpha, JxrPlatformAdapter.Space.PARENT)
-        verify(mockGltfModelEntityImpl).setAlpha(alpha, JxrPlatformAdapter.Space.PARENT)
-        verify(mockAnchorEntityImpl).setAlpha(alpha, JxrPlatformAdapter.Space.ACTIVITY)
-        verify(mockActivityPanelEntity).setAlpha(alpha, JxrPlatformAdapter.Space.REAL_WORLD)
-        verify(mockContentlessEntity).setAlpha(alpha, JxrPlatformAdapter.Space.PARENT)
+        verify(mockPanelEntityImpl).setAlpha(any())
+        verify(mockGltfModelEntityImpl).setAlpha(any())
+        verify(mockAnchorEntityImpl).setAlpha(any())
+        verify(mockActivityPanelEntity).setAlpha(any())
+        verify(mockContentlessEntity).setAlpha(any())
         assertThat(testActivitySpace.setAlphaCalled).isTrue()
     }
 
     @Test
     fun allEntityGetAlpha_callsRuntimeEntityImplGetAlpha() {
-        whenever(mockPanelEntityImpl.getAlpha(JxrPlatformAdapter.Space.PARENT)).thenReturn(0.1f)
-        whenever(mockGltfModelEntityImpl.getAlpha(JxrPlatformAdapter.Space.PARENT)).thenReturn(0.1f)
-        whenever(mockAnchorEntityImpl.getAlpha(JxrPlatformAdapter.Space.ACTIVITY)).thenReturn(0.1f)
-        whenever(mockActivityPanelEntity.getAlpha(JxrPlatformAdapter.Space.REAL_WORLD))
-            .thenReturn(0.1f)
+        whenever(mockPanelEntityImpl.getAlpha()).thenReturn(0.1f)
+        whenever(mockGltfModelEntityImpl.getAlpha()).thenReturn(0.1f)
+        whenever(mockAnchorEntityImpl.getAlpha()).thenReturn(0.1f)
+        whenever(mockActivityPanelEntity.getAlpha()).thenReturn(0.1f)
 
         assertThat(panelEntity.getAlpha()).isEqualTo(0.1f)
-        assertThat(gltfModelEntity.getAlpha(Space.PARENT)).isEqualTo(0.1f)
-        assertThat(anchorEntity.getAlpha(Space.ACTIVITY)).isEqualTo(0.1f)
-        assertThat(activityPanelEntity.getAlpha(Space.REAL_WORLD)).isEqualTo(0.1f)
+        assertThat(gltfModelEntity.getAlpha()).isEqualTo(0.1f)
+        assertThat(anchorEntity.getAlpha()).isEqualTo(0.1f)
+        assertThat(activityPanelEntity.getAlpha()).isEqualTo(0.1f)
 
         assertThat(activitySpace.getAlpha()).isEqualTo(1.0f)
         assertThat(testActivitySpace.getAlphaCalled).isTrue()
 
-        verify(mockPanelEntityImpl).getAlpha(JxrPlatformAdapter.Space.PARENT)
-        verify(mockGltfModelEntityImpl).getAlpha(JxrPlatformAdapter.Space.PARENT)
-        verify(mockAnchorEntityImpl).getAlpha(JxrPlatformAdapter.Space.ACTIVITY)
-        verify(mockActivityPanelEntity).getAlpha(JxrPlatformAdapter.Space.REAL_WORLD)
+        verify(mockPanelEntityImpl).getAlpha()
+        verify(mockGltfModelEntityImpl).getAlpha()
+        verify(mockAnchorEntityImpl).getAlpha()
+        verify(mockActivityPanelEntity).getAlpha()
     }
 
     @Test
@@ -483,23 +483,23 @@
 
     @Test
     fun allEntityGetActivitySpaceAlpha_callsRuntimeEntityImplGetActivitySpaceAlpha() {
-        whenever(mockPanelEntityImpl.getAlpha(JxrPlatformAdapter.Space.PARENT)).thenReturn(0.1f)
-        whenever(mockGltfModelEntityImpl.getAlpha(JxrPlatformAdapter.Space.PARENT)).thenReturn(0.1f)
-        whenever(mockAnchorEntityImpl.getAlpha(JxrPlatformAdapter.Space.ACTIVITY)).thenReturn(0.1f)
-        whenever(mockActivityPanelEntity.getAlpha(JxrPlatformAdapter.Space.REAL_WORLD))
-            .thenReturn(0.1f)
+        whenever(mockPanelEntityImpl.activitySpaceAlpha).thenReturn(0.1f)
+        whenever(mockGltfModelEntityImpl.activitySpaceAlpha).thenReturn(0.1f)
+        whenever(mockAnchorEntityImpl.activitySpaceAlpha).thenReturn(0.1f)
+        whenever(mockActivityPanelEntity.activitySpaceAlpha).thenReturn(0.1f)
 
-        assertThat(panelEntity.getAlpha(Space.PARENT)).isEqualTo(0.1f)
-        assertThat(gltfModelEntity.getAlpha(Space.PARENT)).isEqualTo(0.1f)
-        assertThat(anchorEntity.getAlpha(Space.ACTIVITY)).isEqualTo(0.1f)
-        assertThat(activityPanelEntity.getAlpha(Space.REAL_WORLD)).isEqualTo(0.1f)
+        assertThat(panelEntity.getActivitySpaceAlpha()).isEqualTo(0.1f)
+        assertThat(gltfModelEntity.getActivitySpaceAlpha()).isEqualTo(0.1f)
+        assertThat(anchorEntity.getActivitySpaceAlpha()).isEqualTo(0.1f)
+        assertThat(activityPanelEntity.getActivitySpaceAlpha()).isEqualTo(0.1f)
 
-        assertThat(activitySpace.getAlpha(Space.PARENT)).isEqualTo(1.0f)
+        assertThat(activitySpace.getActivitySpaceAlpha()).isEqualTo(1.0f)
+        assertThat(testActivitySpace.getActivitySpaceAlphaCalled).isTrue()
 
-        verify(mockPanelEntityImpl).getAlpha(JxrPlatformAdapter.Space.PARENT)
-        verify(mockGltfModelEntityImpl).getAlpha(JxrPlatformAdapter.Space.PARENT)
-        verify(mockAnchorEntityImpl).getAlpha(JxrPlatformAdapter.Space.ACTIVITY)
-        verify(mockActivityPanelEntity).getAlpha(JxrPlatformAdapter.Space.REAL_WORLD)
+        verify(mockPanelEntityImpl).activitySpaceAlpha
+        verify(mockGltfModelEntityImpl).activitySpaceAlpha
+        verify(mockAnchorEntityImpl).activitySpaceAlpha
+        verify(mockActivityPanelEntity).activitySpaceAlpha
     }
 
     @Test
@@ -507,20 +507,20 @@
         val scale = 0.1f
 
         panelEntity.setScale(scale)
-        gltfModelEntity.setScale(scale, Space.PARENT)
+        gltfModelEntity.setScale(scale)
         // Note that in production we expect this to raise an exception, but that should be handled
         // by the runtime Entity.
-        anchorEntity.setScale(scale, Space.ACTIVITY)
-        activityPanelEntity.setScale(scale, Space.REAL_WORLD)
+        anchorEntity.setScale(scale)
+        activityPanelEntity.setScale(scale)
         contentlessEntity.setScale(scale)
         // Note that in production we expect this to do nothing.
         activitySpace.setScale(scale)
 
-        verify(mockPanelEntityImpl).setScale(any(), eq(JxrPlatformAdapter.Space.PARENT))
-        verify(mockGltfModelEntityImpl).setScale(any(), eq(JxrPlatformAdapter.Space.PARENT))
-        verify(mockAnchorEntityImpl).setScale(any(), eq(JxrPlatformAdapter.Space.ACTIVITY))
-        verify(mockActivityPanelEntity).setScale(any(), eq(JxrPlatformAdapter.Space.REAL_WORLD))
-        verify(mockContentlessEntity).setScale(any(), eq(JxrPlatformAdapter.Space.PARENT))
+        verify(mockPanelEntityImpl).setScale(any())
+        verify(mockGltfModelEntityImpl).setScale(any())
+        verify(mockAnchorEntityImpl).setScale(any())
+        verify(mockActivityPanelEntity).setScale(any())
+        verify(mockContentlessEntity).setScale(any())
         assertThat(testActivitySpace.setScaleCalled).isTrue()
     }
 
@@ -529,28 +529,49 @@
         val runtimeScale = Vector3(0.1f, 0.1f, 0.1f)
         val sdkScale = 0.1f
 
-        whenever(mockPanelEntityImpl.getScale(JxrPlatformAdapter.Space.PARENT))
-            .thenReturn(runtimeScale)
-        whenever(mockGltfModelEntityImpl.getScale(JxrPlatformAdapter.Space.PARENT))
-            .thenReturn(runtimeScale)
-        whenever(mockAnchorEntityImpl.getScale(JxrPlatformAdapter.Space.ACTIVITY))
-            .thenReturn(runtimeScale)
-        whenever(mockActivityPanelEntity.getScale(JxrPlatformAdapter.Space.REAL_WORLD))
-            .thenReturn(runtimeScale)
+        whenever(mockPanelEntityImpl.getScale()).thenReturn(runtimeScale)
+        whenever(mockGltfModelEntityImpl.getScale()).thenReturn(runtimeScale)
+        whenever(mockAnchorEntityImpl.getScale()).thenReturn(runtimeScale)
+        whenever(mockActivityPanelEntity.getScale()).thenReturn(runtimeScale)
 
         assertThat(panelEntity.getScale()).isEqualTo(sdkScale)
-        assertThat(gltfModelEntity.getScale(Space.PARENT)).isEqualTo(sdkScale)
-        assertThat(anchorEntity.getScale(Space.ACTIVITY)).isEqualTo(sdkScale)
-        assertThat(activityPanelEntity.getScale(Space.REAL_WORLD)).isEqualTo(sdkScale)
+        assertThat(gltfModelEntity.getScale()).isEqualTo(sdkScale)
+        assertThat(anchorEntity.getScale()).isEqualTo(sdkScale)
+        assertThat(activityPanelEntity.getScale()).isEqualTo(sdkScale)
 
         // This is unrealistic, but we want to make sure the SDK delegates to the runtimeImpl.
         assertThat(activitySpace.getScale()).isEqualTo(0f)
         assertThat(testActivitySpace.getScaleCalled).isTrue()
 
-        verify(mockPanelEntityImpl).getScale(JxrPlatformAdapter.Space.PARENT)
-        verify(mockGltfModelEntityImpl).getScale(JxrPlatformAdapter.Space.PARENT)
-        verify(mockAnchorEntityImpl).getScale(JxrPlatformAdapter.Space.ACTIVITY)
-        verify(mockActivityPanelEntity).getScale(JxrPlatformAdapter.Space.REAL_WORLD)
+        verify(mockPanelEntityImpl).getScale()
+        verify(mockGltfModelEntityImpl).getScale()
+        verify(mockAnchorEntityImpl).getScale()
+        verify(mockActivityPanelEntity).getScale()
+    }
+
+    @Test
+    fun allEntityGetWorldSpaceScale_callsRuntimeEntityImplGetWorldSpaceScale() {
+        val runtimeScale = Vector3(0.1f, 0.1f, 0.1f)
+        val sdkScale = 0.1f
+
+        whenever(mockPanelEntityImpl.getWorldSpaceScale()).thenReturn(runtimeScale)
+        whenever(mockGltfModelEntityImpl.getWorldSpaceScale()).thenReturn(runtimeScale)
+        whenever(mockAnchorEntityImpl.getWorldSpaceScale()).thenReturn(runtimeScale)
+        whenever(mockActivityPanelEntity.getWorldSpaceScale()).thenReturn(runtimeScale)
+
+        assertThat(panelEntity.getWorldSpaceScale()).isEqualTo(sdkScale)
+        assertThat(gltfModelEntity.getWorldSpaceScale()).isEqualTo(sdkScale)
+        assertThat(anchorEntity.getWorldSpaceScale()).isEqualTo(sdkScale)
+        assertThat(activityPanelEntity.getWorldSpaceScale()).isEqualTo(sdkScale)
+
+        // This is unrealistic, but we want to make sure the SDK delegates to the runtimeImpl.
+        assertThat(activitySpace.getWorldSpaceScale()).isEqualTo(0f)
+        assertThat(testActivitySpace.getWorldSpaceScaleCalled).isTrue()
+
+        verify(mockPanelEntityImpl).getWorldSpaceScale()
+        verify(mockGltfModelEntityImpl).getWorldSpaceScale()
+        verify(mockAnchorEntityImpl).getWorldSpaceScale()
+        verify(mockActivityPanelEntity).getWorldSpaceScale()
     }
 
     @Test
@@ -576,28 +597,83 @@
     }
 
     @Test
-    fun allPanelEntitySetSizeInPixels_callsRuntimeEntityImplsetSizeInPixels() {
-        val dimensions = PixelDimensions(320, 240)
-        panelEntity.setSizeInPixels(dimensions)
-        activityPanelEntity.setSizeInPixels(dimensions)
+    fun allEntitySetSize_callsRuntimeEntityImplSetSize() {
+        val dimensions = Dimensions(0.3f, 0.2f, 0.1f)
 
-        verify(mockPanelEntityImpl).sizeInPixels = any()
-        verify(mockActivityPanelEntity).setSizeInPixels(any())
+        panelEntity.setSize(dimensions)
+        gltfModelEntity.setSize(dimensions)
+        anchorEntity.setSize(dimensions)
+        activityPanelEntity.setSize(dimensions)
+
+        verify(mockPanelEntityImpl).setSize(any())
+        verify(mockGltfModelEntityImpl).setSize(any())
+        verify(mockAnchorEntityImpl).setSize(any())
+        verify(mockActivityPanelEntity).setSize(any())
     }
 
     @Test
-    fun allPanelEntityGetSizeInPixels_callsRuntimeEntityImplgetSizeInPixels() {
+    fun allNonPanelEntityGetSize_returnsSize() {
+        val dimensions = Dimensions(0.3f, 0.2f, 0.1f)
+
+        gltfModelEntity.setSize(dimensions)
+        anchorEntity.setSize(dimensions)
+
+        assertThat(gltfModelEntity.getSize()).isEqualTo(dimensions)
+        assertThat(anchorEntity.getSize()).isEqualTo(dimensions)
+    }
+
+    @Test
+    fun allPanelEntityGetSize_callsRuntimeEntityImplGetSize() {
+        val dimensions = JxrPlatformAdapter.Dimensions(320.0f, 240.0f, 0.0f)
+        val expectedDimensions = dimensions.toDimensions()
+
+        whenever(mockPanelEntityImpl.getSize()).thenReturn(dimensions)
+        whenever(mockActivityPanelEntity.getSize()).thenReturn(dimensions)
+
+        assertThat(panelEntity.getSize()).isEqualTo(expectedDimensions)
+        assertThat(activityPanelEntity.getSize()).isEqualTo(expectedDimensions)
+
+        verify(mockPanelEntityImpl).getSize()
+        verify(mockActivityPanelEntity).getSize()
+    }
+
+    @Test
+    fun allPanelEntityGetPixelDensity_callsRuntimeEntityImplGetPixelDensity() {
+        val pixelDensity = Vector3(14.0f, 14.0f, 14.0f)
+        val expectedPixelDensity = pixelDensity
+        whenever(mockPanelEntityImpl.getPixelDensity()).thenReturn(pixelDensity)
+        whenever(mockActivityPanelEntity.getPixelDensity()).thenReturn(pixelDensity)
+
+        assertThat(panelEntity.getPixelDensity()).isEqualTo(expectedPixelDensity)
+        assertThat(activityPanelEntity.getPixelDensity()).isEqualTo(expectedPixelDensity)
+
+        verify(mockPanelEntityImpl).getPixelDensity()
+        verify(mockActivityPanelEntity).getPixelDensity()
+    }
+
+    @Test
+    fun allPanelEntitySetPixelDimensions_callsRuntimeEntityImplSetPixelDimensions() {
+        val dimensions = PixelDimensions(320, 240)
+        panelEntity.setPixelDimensions(dimensions)
+        activityPanelEntity.setPixelDimensions(dimensions)
+
+        verify(mockPanelEntityImpl).setPixelDimensions(any())
+        verify(mockActivityPanelEntity).setPixelDimensions(any())
+    }
+
+    @Test
+    fun allPanelEntityGetPixelDimensions_callsRuntimeEntityImplGetPixelDimensions() {
         val pixelDimensions = JxrPlatformAdapter.PixelDimensions(320, 240)
         val expectedPixelDimensions = pixelDimensions.toPixelDimensions()
 
-        whenever(mockPanelEntityImpl.sizeInPixels).thenReturn(pixelDimensions)
-        whenever(mockActivityPanelEntity.sizeInPixels).thenReturn(pixelDimensions)
+        whenever(mockPanelEntityImpl.getPixelDimensions()).thenReturn(pixelDimensions)
+        whenever(mockActivityPanelEntity.getPixelDimensions()).thenReturn(pixelDimensions)
 
-        assertThat(panelEntity.getSizeInPixels()).isEqualTo(expectedPixelDimensions)
-        assertThat(activityPanelEntity.getSizeInPixels()).isEqualTo(expectedPixelDimensions)
+        assertThat(panelEntity.getPixelDimensions()).isEqualTo(expectedPixelDimensions)
+        assertThat(activityPanelEntity.getPixelDimensions()).isEqualTo(expectedPixelDimensions)
 
-        verify(mockPanelEntityImpl).sizeInPixels
-        verify(mockActivityPanelEntity).sizeInPixels
+        verify(mockPanelEntityImpl).getPixelDimensions()
+        verify(mockActivityPanelEntity).getPixelDimensions()
     }
 
     @Test
@@ -728,7 +804,7 @@
         entity.setPose(setPose)
 
         val captor = argumentCaptor<Pose>()
-        verify(mockContentlessEntity).setPose(captor.capture(), eq(JxrPlatformAdapter.Space.PARENT))
+        verify(mockContentlessEntity).setPose(captor.capture())
 
         val pose = captor.firstValue
         assertThat(pose.translation.x).isEqualTo(setPose.translation.x)
@@ -738,13 +814,13 @@
 
     @Test
     fun contentlessEntity_canGetPose() {
-        whenever(mockContentlessEntity.getPose(JxrPlatformAdapter.Space.PARENT)).thenReturn(Pose())
+        whenever(mockContentlessEntity.pose).thenReturn(Pose())
 
         val entity = ContentlessEntity.create(session, "test")
         val pose = Pose.Identity
 
         assertThat(entity.getPose()).isEqualTo(pose)
-        verify(mockContentlessEntity).getPose(JxrPlatformAdapter.Space.PARENT)
+        verify(mockContentlessEntity).getPose()
     }
 
     @Test
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/SessionTest.kt b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/SessionTest.kt
index 3acf785..31d11eb 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/SessionTest.kt
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/SessionTest.kt
@@ -19,12 +19,9 @@
 package androidx.xr.scenecore
 
 import android.app.Activity
-import android.content.Context
 import android.graphics.Rect
 import android.os.Bundle
-import android.view.View
 import android.widget.TextView
-import androidx.xr.runtime.math.Pose
 import androidx.xr.scenecore.JxrPlatformAdapter.GltfModelResource
 import com.google.common.truth.Truth.assertThat
 import com.google.common.util.concurrent.Futures
@@ -120,26 +117,27 @@
         val view = TextView(activity)
         whenever(
                 mockPlatformAdapter.createPanelEntity(
-                    any<Context>(),
-                    any<Pose>(),
-                    any<View>(),
-                    any<JxrPlatformAdapter.PixelDimensions>(),
-                    any<String>(),
-                    any<JxrPlatformAdapter.Entity>(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any()
                 )
             )
             .thenReturn(mock())
-        val unused = PanelEntity.create(session, view, PixelDimensions(720, 480), "test")
+        val unused =
+            PanelEntity.create(
+                session,
+                view,
+                Dimensions(720f, 480f),
+                Dimensions(0.1f, 0.1f, 0.1f),
+                "test",
+            )
 
         verify(mockPlatformAdapter)
-            .createPanelEntity(
-                any<Context>(),
-                any<Pose>(),
-                any<View>(),
-                any<JxrPlatformAdapter.PixelDimensions>(),
-                any<String>(),
-                any<JxrPlatformAdapter.Entity>(),
-            )
+            .createPanelEntity(any(), any(), any(), any(), any(), any(), any())
     }
 
     @Test
@@ -229,17 +227,25 @@
         val mockPanelEntity = mock<JxrPlatformAdapter.PanelEntity>()
         whenever(
                 mockPlatformAdapter.createPanelEntity(
-                    any<Context>(),
-                    any<Pose>(),
-                    any<View>(),
-                    any<JxrPlatformAdapter.PixelDimensions>(),
-                    any<String>(),
-                    any<JxrPlatformAdapter.Entity>(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any()
                 )
             )
             .thenReturn(mockPanelEntity)
         whenever(mockPanelEntity.addComponent(any())).thenReturn(true)
-        val panelEntity = PanelEntity.create(session, view, PixelDimensions(720, 480), "test")
+        val panelEntity =
+            PanelEntity.create(
+                session,
+                view,
+                Dimensions(720f, 480f),
+                Dimensions(0.1f, 0.1f, 0.1f),
+                "test",
+            )
         assertThat(panelEntity.addComponent(interactableComponent)).isTrue()
 
         verify(mockPlatformAdapter).createInteractableComponent(any(), anyOrNull())
@@ -255,17 +261,25 @@
         val mockRtPanelEntity = mock<JxrPlatformAdapter.PanelEntity>()
         whenever(
                 mockPlatformAdapter.createPanelEntity(
-                    any<Context>(),
-                    any<Pose>(),
-                    any<View>(),
-                    any<JxrPlatformAdapter.PixelDimensions>(),
-                    any<String>(),
-                    any<JxrPlatformAdapter.Entity>(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any()
                 )
             )
             .thenReturn(mockRtPanelEntity)
         whenever(mockRtPanelEntity.addComponent(any())).thenReturn(true)
-        val panelEntity = PanelEntity.create(session, view, PixelDimensions(720, 480), "test")
+        val panelEntity =
+            PanelEntity.create(
+                session,
+                view,
+                Dimensions(720f, 480f),
+                Dimensions(0.1f, 0.1f, 0.1f),
+                "test",
+            )
         assertThat(panelEntity.addComponent(movableComponent)).isTrue()
 
         verify(mockPlatformAdapter).createMovableComponent(any(), any(), any(), any())
@@ -281,17 +295,25 @@
         whenever(mockRtPanelEntity.getSize()).thenReturn(JxrPlatformAdapter.Dimensions(1f, 1f, 1f))
         whenever(
                 mockPlatformAdapter.createPanelEntity(
-                    any<Context>(),
-                    any<Pose>(),
-                    any<View>(),
-                    any<JxrPlatformAdapter.PixelDimensions>(),
-                    any<String>(),
-                    any<JxrPlatformAdapter.Entity>(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any()
                 )
             )
             .thenReturn(mockRtPanelEntity)
         whenever(mockRtPanelEntity.addComponent(any())).thenReturn(true)
-        val panelEntity = PanelEntity.create(session, view, PixelDimensions(720, 480), "test")
+        val panelEntity =
+            PanelEntity.create(
+                session,
+                view,
+                Dimensions(720f, 480f),
+                Dimensions(0.1f, 0.1f, 0.1f),
+                "test",
+            )
         assertThat(panelEntity.addComponent(resizableComponent)).isTrue()
 
         verify(mockPlatformAdapter).createResizableComponent(any(), any())
@@ -329,19 +351,26 @@
         val mockActivityPanelEntity = mock<JxrPlatformAdapter.ActivityPanelEntity>()
         whenever(
                 mockPlatformAdapter.createPanelEntity(
-                    any<Context>(),
-                    any<Pose>(),
-                    any<View>(),
-                    any<JxrPlatformAdapter.PixelDimensions>(),
-                    any<String>(),
-                    any<JxrPlatformAdapter.Entity>(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any()
                 )
             )
             .thenReturn(mockPanelEntity1)
         whenever(mockPlatformAdapter.createActivityPanelEntity(any(), any(), any(), any(), any()))
             .thenReturn(mockActivityPanelEntity)
         val panelEntity =
-            PanelEntity.create(session, TextView(activity), PixelDimensions(720, 480), "test1")
+            PanelEntity.create(
+                session,
+                TextView(activity),
+                Dimensions(720f, 480f),
+                Dimensions(0.1f, 0.1f, 0.1f),
+                "test1",
+            )
         val activityPanelEntity = ActivityPanelEntity.create(session, Rect(0, 0, 640, 480), "test2")
 
         assertThat(session.getEntitiesOfType(PanelEntity::class.java))
@@ -353,19 +382,26 @@
         val mockPanelEntity = mock<JxrPlatformAdapter.PanelEntity>()
         whenever(
                 mockPlatformAdapter.createPanelEntity(
-                    any<Context>(),
-                    any<Pose>(),
-                    any<View>(),
-                    any<JxrPlatformAdapter.PixelDimensions>(),
-                    any<String>(),
-                    any<JxrPlatformAdapter.Entity>(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any()
                 )
             )
             .thenReturn(mockPanelEntity)
         whenever(mockPlatformAdapter.createAnchorEntity(any(), any(), any(), any()))
             .thenReturn(mockAnchorEntity)
         val panelEntity =
-            PanelEntity.create(session, TextView(activity), PixelDimensions(720, 480), "test1")
+            PanelEntity.create(
+                session,
+                TextView(activity),
+                Dimensions(720f, 480f),
+                Dimensions(0.1f, 0.1f, 0.1f),
+                "test1",
+            )
         val anchorEntity =
             AnchorEntity.create(session, Dimensions(), PlaneType.ANY, PlaneSemantic.ANY)
 
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/SpatialEnvironmentTest.kt b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/SpatialEnvironmentTest.kt
index 8474709..78e239a 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/SpatialEnvironmentTest.kt
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/SpatialEnvironmentTest.kt
@@ -154,24 +154,15 @@
     fun spatialEnvironmentPreferenceEqualsHashcode_returnsTrueIfAllPropertiesAreEqual() {
         val rtImageMock = mock<JxrPlatformAdapter.ExrImageResource>()
         val rtModelMock = mock<JxrPlatformAdapter.GltfModelResource>()
-        val rtMaterialMock = mock<JxrPlatformAdapter.MaterialResource>()
-        val rtMeshName = "meshName"
-        val rtAnimationName = "animationName"
         val rtPreference =
             JxrPlatformAdapter.SpatialEnvironment.SpatialEnvironmentPreference(
                 rtImageMock,
-                rtModelMock,
-                rtMaterialMock,
-                rtMeshName,
-                rtAnimationName,
+                rtModelMock
             )
         val preference =
             SpatialEnvironment.SpatialEnvironmentPreference(
                 ExrImage(rtImageMock),
-                GltfModel(rtModelMock),
-                Material(rtMaterialMock),
-                rtMeshName,
-                rtAnimationName,
+                GltfModel(rtModelMock)
             )
 
         assertThat(preference).isEqualTo(rtPreference.toSpatialEnvironmentPreference())
@@ -183,30 +174,18 @@
     fun spatialEnvironmentPreferenceEqualsHashcode_returnsFalseIfAnyPropertiesAreNotEqual() {
         val rtImageMock = mock<JxrPlatformAdapter.ExrImageResource>()
         val rtModelMock = mock<JxrPlatformAdapter.GltfModelResource>()
-        val rtMaterialMock = mock<JxrPlatformAdapter.MaterialResource>()
-        val rtMeshName = "meshName"
-        val rtAnimationName = "animationName"
         val rtImageMock2 = mock<JxrPlatformAdapter.ExrImageResource>()
         val rtModelMock2 = mock<JxrPlatformAdapter.GltfModelResource>()
-        val rtMaterialMock2 = mock<JxrPlatformAdapter.MaterialResource>()
-        val rtMeshName2 = "meshName2"
-        val rtAnimationName2 = "animationName2"
         val rtPreference =
             JxrPlatformAdapter.SpatialEnvironment.SpatialEnvironmentPreference(
                 rtImageMock,
-                rtModelMock,
-                rtMaterialMock,
-                rtMeshName,
-                rtAnimationName,
+                rtModelMock
             )
 
         val preferenceDiffGeometry =
             SpatialEnvironment.SpatialEnvironmentPreference(
                 ExrImage(rtImageMock),
                 GltfModel(rtModelMock2),
-                Material(rtMaterialMock2),
-                rtMeshName2,
-                rtAnimationName2,
             )
         assertThat(preferenceDiffGeometry)
             .isNotEqualTo(rtPreference.toSpatialEnvironmentPreference())
@@ -217,9 +196,6 @@
             SpatialEnvironment.SpatialEnvironmentPreference(
                 ExrImage(rtImageMock2),
                 GltfModel(rtModelMock),
-                Material(rtMaterialMock),
-                rtMeshName,
-                rtAnimationName,
             )
         assertThat(preferenceDiffSkybox).isNotEqualTo(rtPreference.toSpatialEnvironmentPreference())
         assertThat(preferenceDiffSkybox.hashCode())
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/ActivityPanelEntityImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/ActivityPanelEntityImplTest.java
index 6778a3e..de1b295 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/ActivityPanelEntityImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/ActivityPanelEntityImplTest.java
@@ -32,18 +32,14 @@
 import androidx.xr.scenecore.JxrPlatformAdapter.ActivityPanelEntity;
 import androidx.xr.scenecore.JxrPlatformAdapter.Dimensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
 import androidx.xr.scenecore.impl.perception.Session;
 import androidx.xr.scenecore.testing.FakeImpressApi;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeActivityPanel;
 import androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode;
 
-import com.android.extensions.xr.ShadowXrExtensions;
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.space.ActivityPanel;
-import com.android.extensions.xr.space.ShadowActivityPanel;
-
 import com.google.androidxr.splitengine.SplitEngineSubspaceManager;
 import com.google.ar.imp.view.splitengine.ImpSplitEngineRenderer;
 
@@ -58,7 +54,7 @@
 
 @RunWith(RobolectricTestRunner.class)
 public class ActivityPanelEntityImplTest {
-    private final XrExtensions mXrExtensions = XrExtensionsProvider.getXrExtensions();
+    private final FakeXrExtensions mFakeExtensions = new FakeXrExtensions();
     private final FakeImpressApi mFakeImpressApi = new FakeImpressApi();
     private final ActivityController<Activity> mActivityController =
             Robolectric.buildActivity(Activity.class);
@@ -81,7 +77,7 @@
                 JxrPlatformAdapterAxr.create(
                         mHostActivity,
                         mFakeExecutor,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mFakeImpressApi,
                         new EntityManager(),
                         mPerceptionLibrary,
@@ -125,7 +121,7 @@
         // The (FakeXrExtensions) test default pixel density is 1 pixel per meter. Validate that the
         // corner radius is set to 32dp.
         assertThat(activityPanelEntity.getCornerRadius()).isEqualTo(32.0f);
-        FakeNode fakeNode = new FakeNode(((ActivityPanelEntityImpl) activityPanelEntity).getNode());
+        FakeNode fakeNode = (FakeNode) ((ActivityPanelEntityImpl) activityPanelEntity).getNode();
         assertThat(fakeNode.getCornerRadius()).isEqualTo(32.0f);
     }
 
@@ -137,7 +133,7 @@
         // The (FakeXrExtensions) test default pixel density is 1 pixel per meter.
         // Validate that the corner radius is set to half the width.
         assertThat(activityPanelEntity.getCornerRadius()).isEqualTo(20f);
-        FakeNode fakeNode = new FakeNode(((ActivityPanelEntityImpl) activityPanelEntity).getNode());
+        FakeNode fakeNode = (FakeNode) ((ActivityPanelEntityImpl) activityPanelEntity).getNode();
         assertThat(fakeNode.getCornerRadius()).isEqualTo(20f);
     }
 
@@ -149,7 +145,7 @@
         // The (FakeXrExtensions) test default pixel density is 1 pixel per meter.
         // Validate that the corner radius is set to half the height.
         assertThat(activityPanelEntity.getCornerRadius()).isEqualTo(20f);
-        FakeNode fakeNode = new FakeNode(((ActivityPanelEntityImpl) activityPanelEntity).getNode());
+        FakeNode fakeNode = (FakeNode) ((ActivityPanelEntityImpl) activityPanelEntity).getNode();
         assertThat(fakeNode.getCornerRadius()).isEqualTo(20f);
     }
 
@@ -159,14 +155,11 @@
         Intent launchIntent = mActivityController.getIntent();
         activityPanelEntity.launchActivity(launchIntent, null);
 
-        ShadowActivityPanel panel =
-                ShadowActivityPanel.extract(
-                        ShadowXrExtensions.extract(mXrExtensions)
-                                .getActivityPanelForHost(mHostActivity));
+        FakeActivityPanel fakePanel = mFakeExtensions.getActivityPanelForHost(mHostActivity);
 
-        assertThat(panel.getLaunchIntent()).isEqualTo(launchIntent);
-        assertThat(panel.getBundle()).isNull();
-        assertThat(panel.getBounds())
+        assertThat(fakePanel.getLaunchIntent()).isEqualTo(launchIntent);
+        assertThat(fakePanel.getBundle()).isNull();
+        assertThat(fakePanel.getBounds())
                 .isEqualTo(new Rect(0, 0, mWindowBoundsPx.width, mWindowBoundsPx.height));
     }
 
@@ -175,48 +168,43 @@
         ActivityPanelEntity activityPanelEntity = createActivityPanelEntity();
         activityPanelEntity.moveActivity(mHostActivity);
 
-        ShadowActivityPanel panel =
-                ShadowActivityPanel.extract(
-                        ShadowXrExtensions.extract(mXrExtensions)
-                                .getActivityPanelForHost(mHostActivity));
+        FakeActivityPanel fakePanel = mFakeExtensions.getActivityPanelForHost(mHostActivity);
 
-        assertThat(panel.getActivity()).isEqualTo(mHostActivity);
+        assertThat(fakePanel.getActivity()).isEqualTo(mHostActivity);
 
-        assertThat(panel.getBounds())
+        assertThat(fakePanel.getBounds())
                 .isEqualTo(new Rect(0, 0, mWindowBoundsPx.width, mWindowBoundsPx.height));
     }
 
     @Test
-    public void activityPanelEntitySetSize_callsSetSizeInPixels() {
+    public void activityPanelEntitySetSize_callsSetPixelDimensions() {
         ActivityPanelEntity activityPanelEntity = createActivityPanelEntity();
         Dimensions dimensions = new Dimensions(400f, 300f, 0f);
         activityPanelEntity.setSize(dimensions);
 
-        ActivityPanel panel =
-                ShadowXrExtensions.extract(mXrExtensions).getActivityPanelForHost(mHostActivity);
+        FakeActivityPanel fakePanel = mFakeExtensions.getActivityPanelForHost(mHostActivity);
 
-        assertThat(ShadowActivityPanel.extract(panel).getBounds())
+        assertThat(fakePanel.getBounds())
                 .isEqualTo(new Rect(0, 0, (int) dimensions.width, (int) dimensions.height));
 
-        // SetSize redirects to setSizeInPixels, so we check the same thing here.
-        PixelDimensions viewDimensions = activityPanelEntity.getSizeInPixels();
+        // SetSize redirects to setPixelDimensions, so we check the same thing here.
+        PixelDimensions viewDimensions = activityPanelEntity.getPixelDimensions();
         assertThat(viewDimensions.width).isEqualTo((int) dimensions.width);
         assertThat(viewDimensions.height).isEqualTo((int) dimensions.height);
     }
 
     @Test
-    public void activityPanelEntitysetSizeInPixels_callActivityPanel() {
+    public void activityPanelEntitySetPixelDimensions_callActivityPanel() {
         ActivityPanelEntity activityPanelEntity = createActivityPanelEntity();
         PixelDimensions dimensions = new PixelDimensions(400, 300);
-        activityPanelEntity.setSizeInPixels(dimensions);
+        activityPanelEntity.setPixelDimensions(dimensions);
 
-        ActivityPanel panel =
-                ShadowXrExtensions.extract(mXrExtensions).getActivityPanelForHost(mHostActivity);
+        FakeActivityPanel fakePanel = mFakeExtensions.getActivityPanelForHost(mHostActivity);
 
-        assertThat(ShadowActivityPanel.extract(panel).getBounds())
+        assertThat(fakePanel.getBounds())
                 .isEqualTo(new Rect(0, 0, dimensions.width, dimensions.height));
 
-        PixelDimensions viewDimensions = activityPanelEntity.getSizeInPixels();
+        PixelDimensions viewDimensions = activityPanelEntity.getPixelDimensions();
         assertThat(viewDimensions.width).isEqualTo(dimensions.width);
         assertThat(viewDimensions.height).isEqualTo(dimensions.height);
     }
@@ -226,9 +214,8 @@
         ActivityPanelEntity activityPanelEntity = createActivityPanelEntity();
         activityPanelEntity.dispose();
 
-        ActivityPanel panel =
-                ShadowXrExtensions.extract(mXrExtensions).getActivityPanelForHost(mHostActivity);
+        FakeActivityPanel fakePanel = mFakeExtensions.getActivityPanelForHost(mHostActivity);
 
-        assertThat(ShadowActivityPanel.extract(panel).isDeleted()).isTrue();
+        assertThat(fakePanel.isDeleted()).isTrue();
     }
 }
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/ActivitySpaceImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/ActivitySpaceImplTest.java
index 1be5a70..7294528 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/ActivitySpaceImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/ActivitySpaceImplTest.java
@@ -28,31 +28,20 @@
 import static org.mockito.Mockito.when;
 
 import android.app.Activity;
-import android.util.Size;
 
+import androidx.xr.extensions.space.Bounds;
 import androidx.xr.runtime.math.Matrix4;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Vector3;
 import androidx.xr.scenecore.JxrPlatformAdapter;
 import androidx.xr.scenecore.JxrPlatformAdapter.ActivitySpace;
 import androidx.xr.scenecore.JxrPlatformAdapter.Dimensions;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
 import androidx.xr.scenecore.impl.perception.Session;
 import androidx.xr.scenecore.testing.FakeImpressApi;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
-
-import com.android.extensions.xr.ShadowXrExtensions;
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.environment.EnvironmentVisibilityState;
-import com.android.extensions.xr.environment.PassthroughVisibilityState;
-import com.android.extensions.xr.environment.ShadowEnvironmentVisibilityState;
-import com.android.extensions.xr.environment.ShadowPassthroughVisibilityState;
-import com.android.extensions.xr.space.Bounds;
-import com.android.extensions.xr.space.ShadowSpatialCapabilities;
-import com.android.extensions.xr.space.ShadowSpatialState;
-import com.android.extensions.xr.space.SpatialCapabilities;
-import com.android.extensions.xr.space.SpatialState;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeSpatialState;
 
 import com.google.androidxr.splitengine.SplitEngineSubspaceManager;
 import com.google.ar.imp.view.splitengine.ImpSplitEngineRenderer;
@@ -80,14 +69,14 @@
     private final ImpSplitEngineRenderer mSplitEngineRenderer =
             Mockito.mock(ImpSplitEngineRenderer.class);
 
-    private XrExtensions mXrExtensions;
+    private FakeXrExtensions mFakeExtensions;
     private FakeImpressApi mFakeImpressApi;
     private JxrPlatformAdapter mTestRuntime;
     private ActivitySpace mActivitySpace;
 
     @Before
     public void setUp() {
-        mXrExtensions = XrExtensionsProvider.getXrExtensions();
+        mFakeExtensions = new FakeXrExtensions();
         mFakeImpressApi = new FakeImpressApi();
         when(mPerceptionLibrary.initSession(eq(mActivity), anyInt(), eq(mFakeExecutor)))
                 .thenReturn(immediateFuture(Mockito.mock(Session.class)));
@@ -96,7 +85,7 @@
                 JxrPlatformAdapterAxr.create(
                         mActivity,
                         mFakeExecutor,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mFakeImpressApi,
                         new EntityManager(),
                         mPerceptionLibrary,
@@ -141,36 +130,15 @@
         return (ActivitySpaceImpl) mActivitySpace;
     }
 
-    private SpatialState createSpatialState(Bounds bounds) {
-        boolean isUnbounded =
-                bounds.getWidth() == Float.POSITIVE_INFINITY
-                        && bounds.getHeight() == Float.POSITIVE_INFINITY
-                        && bounds.getDepth() == Float.POSITIVE_INFINITY;
-        SpatialCapabilities capabilities =
-                isUnbounded
-                        ? ShadowSpatialCapabilities.createAll()
-                        : ShadowSpatialCapabilities.create();
-        return ShadowSpatialState.create(
-                /* bounds= */ bounds,
-                /* capabilities= */ capabilities,
-                /* environmentVisibilityState= */ ShadowEnvironmentVisibilityState.create(
-                        /* state= */ EnvironmentVisibilityState.INVISIBLE),
-                /* passthroughVisibilityState= */ ShadowPassthroughVisibilityState.create(
-                        /* state= */ PassthroughVisibilityState.DISABLED, /* opacity= */ 0.0f),
-                /* isEnvironmentInherited= */ false,
-                /* mainWindowSize= */ new Size(100, 100),
-                /* preferredAspectRatio= */ 1.0f);
-    }
-
     @Test
     public void getBounds_returnsBounds() {
         assertThat(mActivitySpace.getBounds().width).isPositiveInfinity();
         assertThat(mActivitySpace.getBounds().height).isPositiveInfinity();
         assertThat(mActivitySpace.getBounds().depth).isPositiveInfinity();
 
-        SpatialState spatialState =
-                createSpatialState(/* bounds= */ new Bounds(100.0f, 200.0f, 300.0f));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, spatialState);
+        FakeSpatialState spatialState = new FakeSpatialState();
+        spatialState.setBounds(new Bounds(100.0f, 200.0f, 300.0f));
+        mFakeExtensions.sendSpatialState(spatialState);
 
         assertThat(mActivitySpace.getBounds().width).isEqualTo(100f);
         assertThat(mActivitySpace.getBounds().height).isEqualTo(200f);
@@ -182,10 +150,10 @@
         JxrPlatformAdapter.ActivitySpace.OnBoundsChangedListener listener =
                 Mockito.mock(JxrPlatformAdapter.ActivitySpace.OnBoundsChangedListener.class);
 
-        SpatialState spatialState =
-                createSpatialState(/* bounds= */ new Bounds(100.0f, 200.0f, 300.0f));
+        FakeSpatialState spatialState = new FakeSpatialState();
+        spatialState.setBounds(new Bounds(100.0f, 200.0f, 300.0f));
         mActivitySpace.addOnBoundsChangedListener(listener);
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, spatialState);
+        mFakeExtensions.sendSpatialState(spatialState);
 
         verify(listener).onBoundsChanged(Mockito.refEq(new Dimensions(100.0f, 200.0f, 300.0f)));
     }
@@ -197,9 +165,9 @@
 
         mActivitySpace.addOnBoundsChangedListener(listener);
         mActivitySpace.removeOnBoundsChangedListener(listener);
-        SpatialState spatialState =
-                createSpatialState(/* bounds= */ new Bounds(100.0f, 200.0f, 300.0f));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, spatialState);
+        FakeSpatialState spatialState = new FakeSpatialState();
+        spatialState.setBounds(new Bounds(100.0f, 200.0f, 300.0f));
+        mFakeExtensions.sendSpatialState(spatialState);
 
         verify(listener, Mockito.never()).onBoundsChanged(Mockito.any());
     }
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/AnchorEntityImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/AnchorEntityImplTest.java
index 1d3fe26..3d478d3 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/AnchorEntityImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/AnchorEntityImplTest.java
@@ -37,6 +37,7 @@
 import android.os.SystemClock;
 
 import androidx.test.rule.GrantPermissionRule;
+import androidx.xr.extensions.node.Node;
 import androidx.xr.runtime.internal.Anchor.PersistenceState;
 import androidx.xr.runtime.internal.TrackingState;
 import androidx.xr.runtime.math.Matrix4;
@@ -51,19 +52,15 @@
 import androidx.xr.scenecore.JxrPlatformAdapter.Dimensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.PlaneSemantic;
 import androidx.xr.scenecore.JxrPlatformAdapter.PlaneType;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.impl.perception.Anchor;
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
 import androidx.xr.scenecore.impl.perception.Plane;
 import androidx.xr.scenecore.impl.perception.Session;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeGltfModelToken;
 import androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.asset.FakeGltfModelToken;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.NodeRepository;
-
 import com.google.common.collect.ImmutableList;
 
 import org.junit.Before;
@@ -145,7 +142,7 @@
     private static final Plane.Label PLANE_LABEL = Plane.Label.WALL;
     private static final long NATIVE_POINTER = 1234567890L;
     private final AndroidXrEntity mActivitySpaceRoot = Mockito.mock(AndroidXrEntity.class);
-    private final XrExtensions mXrExtensions = XrExtensionsProvider.getXrExtensions();
+    private final FakeXrExtensions mFakeExtensions = new FakeXrExtensions();
     private final PerceptionLibrary mPerceptionLibrary = Mockito.mock(PerceptionLibrary.class);
     private final Session mSession = Mockito.mock(Session.class);
     private final Plane mPlane = mock(Plane.class);
@@ -171,13 +168,13 @@
         ActivityController<Activity> activityController = Robolectric.buildActivity(Activity.class);
         Activity activity = activityController.create().start().get();
         when(mPerceptionLibrary.getActivity()).thenReturn(activity);
-        Node taskNode = mXrExtensions.createNode();
+        Node taskNode = mFakeExtensions.createNode();
         mActivitySpace =
                 new ActivitySpaceImpl(
                         taskNode,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mEntityManager,
-                        () -> mXrExtensions.getSpatialState(activity),
+                        () -> mFakeExtensions.fakeSpatialState,
                         mExecutor);
         SystemClock.setCurrentTimeMillis(mCurrentTimeMillis);
 
@@ -225,7 +222,7 @@
 
     /** Creates an AnchorEntityImpl instance with a timeout. */
     private AnchorEntityImpl createAnchorEntityWithTimeout(Duration anchorSearchTimeout) {
-        Node node = mXrExtensions.createNode();
+        Node node = mFakeExtensions.createNode();
         return AnchorEntityImpl.createSemanticAnchor(
                 node,
                 ANCHOR_DIMENSIONS,
@@ -234,7 +231,7 @@
                 anchorSearchTimeout,
                 mActivitySpace,
                 mActivitySpaceRoot,
-                mXrExtensions,
+                mFakeExtensions,
                 mEntityManager,
                 mExecutor,
                 mPerceptionLibrary);
@@ -246,14 +243,14 @@
      */
     private AnchorEntityImpl createPersistedAnchorEntityWithTimeout(
             UUID uuid, Duration anchorSearchTimeout) {
-        Node node = mXrExtensions.createNode();
+        Node node = mFakeExtensions.createNode();
         return AnchorEntityImpl.createPersistedAnchor(
                 node,
                 uuid,
                 anchorSearchTimeout,
                 mActivitySpace,
                 mActivitySpaceRoot,
-                mXrExtensions,
+                mFakeExtensions,
                 mEntityManager,
                 mExecutor,
                 mPerceptionLibrary);
@@ -265,14 +262,14 @@
         when(mSession.createAnchorFromUuid(uuid)).thenReturn(anchor);
         when(anchor.getAnchorToken()).thenReturn(mSharedAnchorToken);
 
-        Node node = mXrExtensions.createNode();
+        Node node = mFakeExtensions.createNode();
         return AnchorEntityImpl.createPersistedAnchor(
                 node,
                 uuid,
                 /* anchorSearchTimeout= */ null,
                 mActivitySpace,
                 mActivitySpaceRoot,
-                mXrExtensions,
+                mFakeExtensions,
                 mEntityManager,
                 mExecutor,
                 mPerceptionLibrary);
@@ -309,7 +306,7 @@
     private AnchorEntityImpl createAnchorEntityFromPlane() {
         when(mAnchor.persist()).thenReturn(UUID.randomUUID());
 
-        Node node = mXrExtensions.createNode();
+        Node node = mFakeExtensions.createNode();
         return AnchorEntityImpl.createAnchorFromPlane(
                 node,
                 mPlane,
@@ -317,7 +314,7 @@
                 MILLISECONDS.toNanos(mCurrentTimeMillis),
                 mActivitySpace,
                 mActivitySpaceRoot,
-                mXrExtensions,
+                mFakeExtensions,
                 mEntityManager,
                 mExecutor,
                 mPerceptionLibrary);
@@ -325,14 +322,14 @@
 
     private AnchorEntityImpl createAnchorEntityFromPerceptionAnchor(
             androidx.xr.arcore.Anchor perceptionAnchor) {
-        Node node = mXrExtensions.createNode();
+        Node node = mFakeExtensions.createNode();
 
         return AnchorEntityImpl.createAnchorFromPerceptionAnchor(
                 node,
                 perceptionAnchor,
                 mActivitySpace,
                 mActivitySpaceRoot,
-                mXrExtensions,
+                mFakeExtensions,
                 mEntityManager,
                 mExecutor,
                 mPerceptionLibrary);
@@ -342,7 +339,8 @@
     private GltfEntityImpl createGltfEntity() {
         FakeGltfModelToken modelToken = new FakeGltfModelToken("model");
         GltfModelResourceImpl model = new GltfModelResourceImpl(modelToken);
-        return new GltfEntityImpl(model, mActivitySpace, mXrExtensions, mEntityManager, mExecutor);
+        return new GltfEntityImpl(
+                model, mActivitySpace, mFakeExtensions, mEntityManager, mExecutor);
     }
 
     @Test
@@ -351,10 +349,9 @@
                 createInitializedPersistedAnchorEntity(mAnchor, UUID.randomUUID());
         assertThat(anchorEntity).isNotNull();
         assertThat(anchorEntity.getState()).isEqualTo(State.ANCHORED);
-        assertThat(new FakeNode(anchorEntity.getNode()).getName())
+        assertThat(((FakeNode) anchorEntity.getNode()).getName())
                 .isEqualTo(AnchorEntityImpl.ANCHOR_NODE_NAME);
-        assertThat(new FakeNode(anchorEntity.getNode()).getAnchorId())
-                .isEqualTo(mSharedAnchorToken);
+        assertThat(((FakeNode) anchorEntity.getNode()).getAnchorId()).isEqualTo(mSharedAnchorToken);
         assertThat(anchorEntity.getPersistState()).isEqualTo(PersistState.PERSISTED);
     }
 
@@ -364,10 +361,9 @@
         AnchorEntityImpl anchorEntity = createInitializedPersistedAnchorEntity(mAnchor, uuid);
         assertThat(anchorEntity).isNotNull();
         assertThat(anchorEntity.getState()).isEqualTo(State.ANCHORED);
-        assertThat(new FakeNode(anchorEntity.getNode()).getName())
+        assertThat(((FakeNode) anchorEntity.getNode()).getName())
                 .isEqualTo(AnchorEntityImpl.ANCHOR_NODE_NAME);
-        assertThat(new FakeNode(anchorEntity.getNode()).getAnchorId())
-                .isEqualTo(mSharedAnchorToken);
+        assertThat(((FakeNode) anchorEntity.getNode()).getAnchorId()).isEqualTo(mSharedAnchorToken);
         assertThat(anchorEntity.getPersistState()).isEqualTo(PersistState.PERSISTED);
 
         UUID returnedUuid = anchorEntity.persist();
@@ -488,7 +484,7 @@
         AnchorEntityImpl anchorEntity = createSemanticAnchorEntity();
         assertThat(anchorEntity).isNotNull();
         assertThat(anchorEntity.getState()).isEqualTo(State.UNANCHORED);
-        assertThat(new FakeNode(anchorEntity.getNode()).getName())
+        assertThat(((FakeNode) anchorEntity.getNode()).getName())
                 .isEqualTo(AnchorEntityImpl.ANCHOR_NODE_NAME);
     }
 
@@ -497,10 +493,9 @@
         AnchorEntityImpl anchorEntity = createAndInitAnchorEntity();
         assertThat(anchorEntity).isNotNull();
         assertThat(anchorEntity.getState()).isEqualTo(State.ANCHORED);
-        assertThat(new FakeNode(anchorEntity.getNode()).getName())
+        assertThat(((FakeNode) anchorEntity.getNode()).getName())
                 .isEqualTo(AnchorEntityImpl.ANCHOR_NODE_NAME);
-        assertThat(new FakeNode(anchorEntity.getNode()).getAnchorId())
-                .isEqualTo(mSharedAnchorToken);
+        assertThat(((FakeNode) anchorEntity.getNode()).getAnchorId()).isEqualTo(mSharedAnchorToken);
     }
 
     @Test
@@ -511,7 +506,7 @@
         AnchorEntityImpl anchorEntity = createSemanticAnchorEntity();
 
         assertThat(anchorEntity.getState()).isEqualTo(State.UNANCHORED);
-        assertThat(new FakeNode(anchorEntity.getNode()).getName())
+        assertThat(((FakeNode) anchorEntity.getNode()).getName())
                 .isEqualTo(AnchorEntityImpl.ANCHOR_NODE_NAME);
     }
 
@@ -531,7 +526,7 @@
         AnchorEntityImpl anchorEntity = createSemanticAnchorEntity();
 
         assertThat(anchorEntity.getState()).isEqualTo(State.UNANCHORED);
-        assertThat(new FakeNode(anchorEntity.getNode()).getName())
+        assertThat(((FakeNode) anchorEntity.getNode()).getName())
                 .isEqualTo(AnchorEntityImpl.ANCHOR_NODE_NAME);
     }
 
@@ -761,12 +756,12 @@
         assertThat(childEntity2.getParent()).isEqualTo(parentEntity);
         assertThat(parentEntity.getChildren()).containsExactly(childEntity1, childEntity2);
 
-        Node parentNode = parentEntity.getNode();
-        Node childNode1 = childEntity1.getNode();
-        Node childNode2 = childEntity2.getNode();
+        FakeNode parentNode = (FakeNode) parentEntity.getNode();
+        FakeNode childNode1 = (FakeNode) childEntity1.getNode();
+        FakeNode childNode2 = (FakeNode) childEntity2.getNode();
 
-        assertThat(NodeRepository.getInstance().getParent(childNode1)).isEqualTo(parentNode);
-        assertThat(NodeRepository.getInstance().getParent(childNode2)).isEqualTo(parentNode);
+        assertThat(childNode1.getParent()).isEqualTo(parentNode);
+        assertThat(childNode2.getParent()).isEqualTo(parentNode);
     }
 
     @Test
@@ -879,7 +874,7 @@
 
     @Test
     public void getPoseInActivitySpace_withNoActivitySpace_throwsException() throws Exception {
-        Node node = mXrExtensions.createNode();
+        Node node = mFakeExtensions.createNode();
         AnchorEntityImpl anchorEntity =
                 AnchorEntityImpl.createSemanticAnchor(
                         node,
@@ -889,7 +884,7 @@
                         /* anchorSearchTimeout= */ null,
                         /* activitySpace= */ null,
                         mActivitySpaceRoot,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mEntityManager,
                         mExecutor,
                         mPerceptionLibrary);
@@ -923,7 +918,7 @@
     @Test
     public void getActivitySpacePose_withNonAndroidXrActivitySpaceRoot_throwsException()
             throws Exception {
-        Node node = mXrExtensions.createNode();
+        Node node = mFakeExtensions.createNode();
         AnchorEntityImpl anchorEntity =
                 AnchorEntityImpl.createSemanticAnchor(
                         node,
@@ -933,7 +928,7 @@
                         /* anchorSearchTimeout= */ null,
                         mActivitySpace,
                         /* activitySpaceRoot= */ null,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mEntityManager,
                         mExecutor,
                         mPerceptionLibrary);
@@ -1002,16 +997,16 @@
         AnchorEntityImpl anchorEntity = createSemanticAnchorEntity();
         assertThat(anchorEntity.getState()).isEqualTo(State.UNANCHORED);
 
-        Node anchorNode = anchorEntity.getNode();
-        Node rootNode = mActivitySpace.getNode();
-        assertThat(NodeRepository.getInstance().getParent(anchorNode)).isNull();
+        FakeNode anchorNode = (FakeNode) anchorEntity.getNode();
+        FakeNode rootNode = (FakeNode) mActivitySpace.getNode();
+        assertThat(anchorNode.getParent()).isNull();
 
         // The anchor starts as unanchored. Advance the executor to wait for it to become anchored
         // and
         // verify that the parent is the root node.
         advanceClock(AnchorEntityImpl.ANCHOR_SEARCH_DELAY);
         assertThat(anchorEntity.getState()).isEqualTo(State.ANCHORED);
-        assertThat(NodeRepository.getInstance().getParent(anchorNode)).isEqualTo(rootNode);
+        assertThat(anchorNode.getParent()).isEqualTo(rootNode);
     }
 
     @Test
@@ -1023,19 +1018,18 @@
         assertThat(anchorEntity.getState()).isEqualTo(State.ANCHORED);
 
         // Verify the parent of the anchor is the root node (ActivitySpace) before disposing it.
-        Node anchorNode = anchorEntity.getNode();
-        Node rootNode = mActivitySpace.getNode();
-        assertThat(NodeRepository.getInstance().getParent(anchorNode)).isEqualTo(rootNode);
-        assertThat(NodeRepository.getInstance().getAnchorId(anchorNode))
-                .isEqualTo(mSharedAnchorToken);
+        FakeNode anchorNode = (FakeNode) anchorEntity.getNode();
+        FakeNode rootNode = (FakeNode) mActivitySpace.getNode();
+        assertThat(anchorNode.getParent()).isEqualTo(rootNode);
+        assertThat(anchorNode.getAnchorId()).isEqualTo(mSharedAnchorToken);
 
         // Dispose the entity and verify that the state was updated.
         anchorEntity.dispose();
 
         verify(mAnchorStateListener).onStateChanged(State.ERROR);
         assertThat(anchorEntity.getState()).isEqualTo(State.ERROR);
-        assertThat(NodeRepository.getInstance().getParent(anchorNode)).isNull();
-        assertThat(NodeRepository.getInstance().getAnchorId(anchorNode)).isNull();
+        assertThat(anchorNode.getParent()).isNull();
+        assertThat(anchorNode.getAnchorId()).isNull();
     }
 
     @Test
@@ -1202,12 +1196,11 @@
 
         assertThat(anchorEntity).isNotNull();
         assertThat(anchorEntity.getState()).isEqualTo(State.ANCHORED);
-        assertThat(NodeRepository.getInstance().getName(anchorEntity.getNode()))
+        assertThat(((FakeNode) anchorEntity.getNode()).getName())
                 .isEqualTo(AnchorEntityImpl.ANCHOR_NODE_NAME);
-        assertThat(NodeRepository.getInstance().getAnchorId(anchorEntity.getNode()))
-                .isEqualTo(mSharedAnchorToken);
+        assertThat(((FakeNode) anchorEntity.getNode()).getAnchorId()).isEqualTo(mSharedAnchorToken);
         assertThat(anchorEntity.getPersistState()).isEqualTo(PersistState.PERSIST_NOT_REQUESTED);
-        assertThat(NodeRepository.getInstance().getParent(anchorEntity.getNode()))
+        assertThat(((FakeNode) anchorEntity.getNode()).getParent())
                 .isEqualTo(mActivitySpace.getNode());
     }
 
@@ -1219,7 +1212,7 @@
         AnchorEntityImpl anchorEntity = createAnchorEntityFromPlane();
         assertThat(anchorEntity).isNotNull();
         assertThat(anchorEntity.getState()).isEqualTo(State.ERROR);
-        assertThat(NodeRepository.getInstance().getParent(anchorEntity.getNode())).isEqualTo(null);
+        assertThat(((FakeNode) anchorEntity.getNode()).getParent()).isEqualTo(null);
     }
 
     @Test
@@ -1258,12 +1251,11 @@
         AnchorEntityImpl anchorEntity = createAnchorEntityFromPerceptionAnchor(perceptionAnchor);
         assertThat(anchorEntity).isNotNull();
         assertThat(anchorEntity.getState()).isEqualTo(State.ANCHORED);
-        assertThat(NodeRepository.getInstance().getName(anchorEntity.getNode()))
+        assertThat(((FakeNode) anchorEntity.getNode()).getName())
                 .isEqualTo(AnchorEntityImpl.ANCHOR_NODE_NAME);
-        assertThat(NodeRepository.getInstance().getAnchorId(anchorEntity.getNode()))
-                .isEqualTo(mSharedAnchorToken);
+        assertThat(((FakeNode) anchorEntity.getNode()).getAnchorId()).isEqualTo(mSharedAnchorToken);
         assertThat(anchorEntity.getPersistState()).isEqualTo(PersistState.PERSIST_NOT_REQUESTED);
-        assertThat(NodeRepository.getInstance().getParent(anchorEntity.getNode()))
+        assertThat(((FakeNode) anchorEntity.getNode()).getParent())
                 .isEqualTo(mActivitySpace.getNode());
     }
 
@@ -1285,6 +1277,6 @@
         AnchorEntityImpl anchorEntity = createAnchorEntityFromPerceptionAnchor(perceptionAnchor);
         assertThat(anchorEntity).isNotNull();
         assertThat(anchorEntity.getState()).isEqualTo(State.ERROR);
-        assertThat(new FakeNode(anchorEntity.getNode()).getParent()).isEqualTo(null);
+        assertThat(((FakeNode) anchorEntity.getNode()).getParent()).isEqualTo(null);
     }
 }
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/AudioTrackExtensionsWrapperImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/AudioTrackExtensionsWrapperImplTest.java
index d360efd..4ac6d31 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/AudioTrackExtensionsWrapperImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/AudioTrackExtensionsWrapperImplTest.java
@@ -23,19 +23,16 @@
 
 import android.media.AudioTrack;
 
+import androidx.xr.extensions.media.PointSourceAttributes;
+import androidx.xr.extensions.media.SoundFieldAttributes;
+import androidx.xr.extensions.media.SpatializerExtensions;
+import androidx.xr.extensions.node.Node;
 import androidx.xr.scenecore.JxrPlatformAdapter;
 import androidx.xr.scenecore.JxrPlatformAdapter.AudioTrackExtensionsWrapper;
 import androidx.xr.scenecore.JxrPlatformAdapter.SpatializerConstants;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
-
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.media.AudioTrackExtensions;
-import com.android.extensions.xr.media.PointSourceAttributes;
-import com.android.extensions.xr.media.ShadowAudioTrackExtensions;
-import com.android.extensions.xr.media.SoundFieldAttributes;
-import com.android.extensions.xr.media.SpatializerExtensions;
-import com.android.extensions.xr.media.XrSpatialAudioExtensions;
-import com.android.extensions.xr.node.Node;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeAudioTrackExtensions;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeSpatialAudioExtensions;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -46,9 +43,9 @@
 @RunWith(RobolectricTestRunner.class)
 public class AudioTrackExtensionsWrapperImplTest {
 
-    XrExtensions mXrExtensions;
-    XrSpatialAudioExtensions mSpatialAudioExtensions;
-    AudioTrackExtensions mAudioTrackExtensions;
+    FakeXrExtensions mFakeXrExtensions;
+    FakeSpatialAudioExtensions mFakeSpatialAudioExtensions;
+    FakeAudioTrackExtensions mFakeAudioTrackExtensions;
 
     private EntityManager mEntityManager;
 
@@ -56,24 +53,18 @@
 
     @Before
     public void setUp() {
-        mXrExtensions = XrExtensionsProvider.getXrExtensions();
-        mSpatialAudioExtensions = mXrExtensions.getXrSpatialAudioExtensions();
-        mAudioTrackExtensions = mSpatialAudioExtensions.getAudioTrackExtensions();
+        mFakeXrExtensions = new FakeXrExtensions();
+        mFakeSpatialAudioExtensions = mFakeXrExtensions.fakeSpatialAudioExtensions;
+        mFakeAudioTrackExtensions = new FakeAudioTrackExtensions();
 
-        // Clear the sound fields before each test.
-        // Because the mAudioTrackExtensions are fetched from the XrExtensions singleton it is
-        // reused
-        // across tests.
-        // TODO(b/401557718): Consider adding a reset method to the XrExtensions shadow.
-        ShadowAudioTrackExtensions.extract(mAudioTrackExtensions).setSoundFieldAttributes(null);
+        mFakeSpatialAudioExtensions.setFakeAudioTrackExtensions(mFakeAudioTrackExtensions);
 
         mEntityManager = new EntityManager();
     }
 
     @Test
     public void setPointSourceAttr_callsExtensionsSetPointSourceAttr() {
-        AudioTrack track = mock(AudioTrack.class);
-        Node fakeNode = mXrExtensions.createNode();
+        Node fakeNode = new FakeXrExtensions().createNode();
         AndroidXrEntity entity = mock(AndroidXrEntity.class);
         when(entity.getNode()).thenReturn(fakeNode);
 
@@ -81,11 +72,11 @@
                 new JxrPlatformAdapter.PointSourceAttributes(entity);
 
         AudioTrackExtensionsWrapper wrapper =
-                new AudioTrackExtensionsWrapperImpl(mAudioTrackExtensions, mEntityManager);
+                new AudioTrackExtensionsWrapperImpl(mFakeAudioTrackExtensions, mEntityManager);
         AudioTrack.Builder actual = wrapper.setPointSourceAttributes(mBuilder, expectedRtAttr);
 
         assertThat(actual).isEqualTo(mBuilder);
-        assertThat(mAudioTrackExtensions.getPointSourceAttributes(track).getNode())
+        assertThat(mFakeAudioTrackExtensions.getPointSourceAttributes().getNode())
                 .isEqualTo(fakeNode);
     }
 
@@ -97,15 +88,12 @@
                         JxrPlatformAdapter.SpatializerConstants.AMBISONICS_ORDER_THIRD_ORDER);
 
         AudioTrackExtensionsWrapper wrapper =
-                new AudioTrackExtensionsWrapperImpl(mAudioTrackExtensions, mEntityManager);
+                new AudioTrackExtensionsWrapperImpl(mFakeAudioTrackExtensions, mEntityManager);
 
         AudioTrack.Builder actual = wrapper.setSoundFieldAttributes(mBuilder, expectedRtAttr);
 
         assertThat(actual).isEqualTo(mBuilder);
-        assertThat(
-                        mAudioTrackExtensions
-                                .getSoundFieldAttributes(mock(AudioTrack.class))
-                                .getAmbisonicsOrder())
+        assertThat(mFakeAudioTrackExtensions.getSoundFieldAttributes().getAmbisonicsOrder())
                 .isEqualTo(expectedAmbisonicOrder);
     }
 
@@ -113,20 +101,18 @@
     public void getPointSourceAttributes_callsExtensionsGetPointSourceAttributes() {
         AudioTrack track = mock(AudioTrack.class);
 
-        Node fakeNode = mXrExtensions.createNode();
+        Node fakeNode = new FakeXrExtensions().createNode();
         AndroidXrEntity entity = mock(AndroidXrEntity.class);
         when(entity.getNode()).thenReturn(fakeNode);
         mEntityManager.setEntityForNode(fakeNode, entity);
 
-        AudioTrack.Builder unused =
-                mAudioTrackExtensions.setPointSourceAttributes(
-                        new AudioTrack.Builder(),
-                        new PointSourceAttributes.Builder().setNode(fakeNode).build());
+        mFakeAudioTrackExtensions.setPointSourceAttributes(
+                new PointSourceAttributes.Builder().setNode(fakeNode).build());
 
         JxrPlatformAdapter.PointSourceAttributes expectedRtAttr =
                 new JxrPlatformAdapter.PointSourceAttributes(entity);
         AudioTrackExtensionsWrapper wrapper =
-                new AudioTrackExtensionsWrapperImpl(mAudioTrackExtensions, mEntityManager);
+                new AudioTrackExtensionsWrapperImpl(mFakeAudioTrackExtensions, mEntityManager);
 
         JxrPlatformAdapter.PointSourceAttributes actual = wrapper.getPointSourceAttributes(track);
 
@@ -138,7 +124,7 @@
         AudioTrack track = mock(AudioTrack.class);
 
         AudioTrackExtensionsWrapper wrapper =
-                new AudioTrackExtensionsWrapperImpl(mAudioTrackExtensions, mEntityManager);
+                new AudioTrackExtensionsWrapperImpl(mFakeAudioTrackExtensions, mEntityManager);
 
         JxrPlatformAdapter.PointSourceAttributes actual = wrapper.getPointSourceAttributes(track);
 
@@ -149,19 +135,16 @@
     public void getSoundFieldAttributes_callsExtensionsGetSoundFieldAttributes() {
         AudioTrack track = mock(AudioTrack.class);
 
-        AudioTrack.Builder unused =
-                mAudioTrackExtensions.setSoundFieldAttributes(
-                        new AudioTrack.Builder(),
-                        new SoundFieldAttributes.Builder()
-                                .setAmbisonicsOrder(
-                                        SpatializerExtensions.AMBISONICS_ORDER_THIRD_ORDER)
-                                .build());
+        mFakeAudioTrackExtensions.setSoundFieldAttributes(
+                new SoundFieldAttributes.Builder()
+                        .setAmbisonicsOrder(SpatializerExtensions.AMBISONICS_ORDER_THIRD_ORDER)
+                        .build());
 
         JxrPlatformAdapter.SoundFieldAttributes expectedRtAttr =
                 new JxrPlatformAdapter.SoundFieldAttributes(
                         SpatializerConstants.AMBISONICS_ORDER_THIRD_ORDER);
         AudioTrackExtensionsWrapper wrapper =
-                new AudioTrackExtensionsWrapperImpl(mAudioTrackExtensions, mEntityManager);
+                new AudioTrackExtensionsWrapperImpl(mFakeAudioTrackExtensions, mEntityManager);
 
         JxrPlatformAdapter.SoundFieldAttributes actual = wrapper.getSoundFieldAttributes(track);
 
@@ -173,7 +156,7 @@
         AudioTrack track = mock(AudioTrack.class);
 
         AudioTrackExtensionsWrapper wrapper =
-                new AudioTrackExtensionsWrapperImpl(mAudioTrackExtensions, mEntityManager);
+                new AudioTrackExtensionsWrapperImpl(mFakeAudioTrackExtensions, mEntityManager);
 
         JxrPlatformAdapter.SoundFieldAttributes actual = wrapper.getSoundFieldAttributes(track);
 
@@ -185,10 +168,10 @@
         AudioTrack track = mock(AudioTrack.class);
 
         int expected = SpatializerConstants.SOURCE_TYPE_SOUND_FIELD;
-        ShadowAudioTrackExtensions.extract(mAudioTrackExtensions).setSourceType(expected);
 
+        mFakeAudioTrackExtensions.setSourceType(expected);
         AudioTrackExtensionsWrapper wrapper =
-                new AudioTrackExtensionsWrapperImpl(mAudioTrackExtensions, mEntityManager);
+                new AudioTrackExtensionsWrapperImpl(mFakeAudioTrackExtensions, mEntityManager);
 
         int actualSourceType = wrapper.getSpatialSourceType(track);
         assertThat(actualSourceType).isEqualTo(expected);
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/CameraViewActivityPoseImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/CameraViewActivityPoseImplTest.java
index cf91ca7..171e604 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/CameraViewActivityPoseImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/CameraViewActivityPoseImplTest.java
@@ -23,8 +23,6 @@
 
 import static org.mockito.Mockito.when;
 
-import android.app.Activity;
-
 import androidx.xr.runtime.math.Matrix4;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Quaternion;
@@ -32,37 +30,32 @@
 import androidx.xr.scenecore.JxrPlatformAdapter.CameraViewActivityPose;
 import androidx.xr.scenecore.JxrPlatformAdapter.CameraViewActivityPose.CameraType;
 import androidx.xr.scenecore.JxrPlatformAdapter.CameraViewActivityPose.Fov;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
 import androidx.xr.scenecore.impl.perception.Session;
 import androidx.xr.scenecore.impl.perception.ViewProjection;
 import androidx.xr.scenecore.impl.perception.ViewProjections;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
-
-import com.android.extensions.xr.XrExtensions;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mockito;
-import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 
 @RunWith(RobolectricTestRunner.class)
 public final class CameraViewActivityPoseImplTest {
 
     private final AndroidXrEntity mActivitySpaceRoot = Mockito.mock(AndroidXrEntity.class);
-    private final XrExtensions mXrExtensions = XrExtensionsProvider.getXrExtensions();
+    private final FakeXrExtensions mFakeExtensions = new FakeXrExtensions();
     private final PerceptionLibrary mPerceptionLibrary = Mockito.mock(PerceptionLibrary.class);
     private final Session mSession = Mockito.mock(Session.class);
     private final FakeScheduledExecutorService mExecutor = new FakeScheduledExecutorService();
-    private final Activity mActivity =
-            Robolectric.buildActivity(Activity.class).create().start().get();
     private final ActivitySpaceImpl mActivitySpace =
             new ActivitySpaceImpl(
-                    mXrExtensions.createNode(),
-                    mXrExtensions,
+                    mFakeExtensions.createNode(),
+                    mFakeExtensions,
                     new EntityManager(),
-                    () -> mXrExtensions.getSpatialState(mActivity),
+                    () -> mFakeExtensions.fakeSpatialState,
                     mExecutor);
 
     /** Creates a CameraViewActivityPoseImpl. */
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/EntityManagerTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/EntityManagerTest.java
index d9eee4a..9cb08b8 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/EntityManagerTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/EntityManagerTest.java
@@ -32,6 +32,7 @@
 import android.view.View;
 import android.view.ViewGroup.LayoutParams;
 
+import androidx.xr.extensions.node.Node;
 import androidx.xr.runtime.math.Matrix4;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.scenecore.JxrPlatformAdapter.ActivityPanelEntity;
@@ -48,14 +49,11 @@
 import androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.PlaneSemantic;
 import androidx.xr.scenecore.JxrPlatformAdapter.PlaneType;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
 import androidx.xr.scenecore.impl.perception.Session;
 import androidx.xr.scenecore.testing.FakeImpressApi;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
-
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.Node;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
 
 import com.google.androidxr.splitengine.SplitEngineSubspaceManager;
 import com.google.ar.imp.view.splitengine.ImpSplitEngineRenderer;
@@ -75,15 +73,15 @@
 
     private static final int VGA_WIDTH = 640;
     private static final int VGA_HEIGHT = 480;
-    private final XrExtensions mXrExtensions = XrExtensionsProvider.getXrExtensions();
+    private final FakeXrExtensions mFakeExtensions = new FakeXrExtensions();
     private final FakeImpressApi mFakeImpressApi = new FakeImpressApi();
     private final FakeScheduledExecutorService mFakeExecutor = new FakeScheduledExecutorService();
     private final PerceptionLibrary mPerceptionLibrary = mock(PerceptionLibrary.class);
     private final Session mSession = mock(Session.class);
     private final AndroidXrEntity mActivitySpaceRoot = mock(AndroidXrEntity.class);
     private final FakeScheduledExecutorService mExecutor = new FakeScheduledExecutorService();
-    private final Node mPanelEntityNode = mXrExtensions.createNode();
-    private final Node mAnchorEntityNode = mXrExtensions.createNode();
+    private final Node mPanelEntityNode = mFakeExtensions.createNode();
+    private final Node mAnchorEntityNode = mFakeExtensions.createNode();
     private final EntityManager mEntityManager = new EntityManager();
     private final SplitEngineSubspaceManager mSplitEngineSubspaceManager =
             Mockito.mock(SplitEngineSubspaceManager.class);
@@ -108,20 +106,20 @@
                 JxrPlatformAdapterAxr.create(
                         mActivity,
                         mFakeExecutor,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mFakeImpressApi,
                         mEntityManager,
                         mPerceptionLibrary,
                         mSplitEngineSubspaceManager,
                         mSplitEngineRenderer,
                         /* useSplitEngine= */ false);
-        Node taskNode = mXrExtensions.createNode();
+        Node taskNode = mFakeExtensions.createNode();
         mActivitySpace =
                 new ActivitySpaceImpl(
                         taskNode,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mEntityManager,
-                        () -> mXrExtensions.getSpatialState(mActivity),
+                        () -> mFakeExtensions.fakeSpatialState,
                         mExecutor);
         long currentTimeMillis = 1000000000L;
         SystemClock.setCurrentTimeMillis(currentTimeMillis);
@@ -163,7 +161,7 @@
         PanelEntity panelEntity = createPanelEntity();
         Entity contentlessEntity = createContentlessEntity();
         AnchorEntity anchorEntity = createAnchorEntity();
-        Node testNode = mXrExtensions.createNode();
+        Node testNode = mFakeExtensions.createNode();
 
         assertThat(mEntityManager.getEntityForNode(mGltfEntityNode)).isEqualTo(gltfEntity);
         assertThat(mEntityManager.getEntityForNode(mPanelEntityNode)).isEqualTo(panelEntity);
@@ -299,7 +297,7 @@
                 new GltfEntityImpl(
                         (GltfModelResourceImpl) model,
                         mActivitySpaceRoot,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mEntityManager,
                         mExecutor);
         mGltfEntityNode = gltfEntity.getNode();
@@ -314,13 +312,13 @@
         view.setLayoutParams(new LayoutParams(VGA_WIDTH, VGA_HEIGHT));
         PanelEntityImpl panelEntity =
                 new PanelEntityImpl(
-                        displayContext,
                         mPanelEntityNode,
                         view,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mEntityManager,
                         new PixelDimensions(VGA_WIDTH, VGA_HEIGHT),
                         "panel",
+                        displayContext,
                         mExecutor);
         mEntityManager.setEntityForNode(mPanelEntityNode, panelEntity);
         return panelEntity;
@@ -345,7 +343,7 @@
                         null,
                         mActivitySpace,
                         mActivitySpaceRoot,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mEntityManager,
                         mExecutor,
                         mPerceptionLibrary);
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/EntityTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/EntityTest.java
deleted file mode 100644
index cc2a981..0000000
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/EntityTest.java
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.xr.scenecore.impl;
-
-import static androidx.xr.runtime.testing.math.MathAssertions.assertPose;
-import static androidx.xr.runtime.testing.math.MathAssertions.assertVector3;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.util.concurrent.Futures.immediateFuture;
-
-import static org.junit.Assert.assertThrows;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import android.app.Activity;
-
-import androidx.xr.runtime.math.Matrix4;
-import androidx.xr.runtime.math.Pose;
-import androidx.xr.runtime.math.Quaternion;
-import androidx.xr.runtime.math.Vector3;
-import androidx.xr.scenecore.JxrPlatformAdapter.Space;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
-import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
-import androidx.xr.scenecore.impl.perception.PerceptionLibraryConstants;
-import androidx.xr.scenecore.impl.perception.Session;
-import androidx.xr.scenecore.testing.FakeImpressApi;
-import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
-
-import com.android.extensions.xr.ShadowXrExtensions;
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.Node;
-
-import com.google.androidxr.splitengine.SplitEngineSubspaceManager;
-import com.google.ar.imp.view.splitengine.ImpSplitEngineRenderer;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-
-import java.util.concurrent.ScheduledExecutorService;
-
-@RunWith(RobolectricTestRunner.class)
-public final class EntityTest {
-    private final XrExtensions mXrExtensions = XrExtensionsProvider.getXrExtensions();
-    private final EntityManager mEntityManager = new EntityManager();
-    private final FakeScheduledExecutorService mFakeScheduledExecutorService =
-            new FakeScheduledExecutorService();
-    private final Pose mTestPose = new Pose(new Vector3(1f, 2f, 3f), Quaternion.Identity);
-    private JxrPlatformAdapterAxr mJxrPlatformAdapterAxr;
-    private TestEntity mEntity;
-
-    static class TestEntity extends AndroidXrEntity {
-        TestEntity(
-                Node node,
-                XrExtensions extensions,
-                EntityManager entityManager,
-                ScheduledExecutorService executor) {
-            super(node, extensions, entityManager, executor);
-        }
-    }
-
-    @Before
-    public void setUp() {
-        Activity activity = Robolectric.buildActivity(Activity.class).create().start().get();
-
-        PerceptionLibrary perceptionLibrary = mock(PerceptionLibrary.class);
-        ShadowXrExtensions.extract(mXrExtensions)
-                .setOpenXrWorldSpaceType(PerceptionLibraryConstants.OPEN_XR_SPACE_TYPE_VIEW);
-        when(perceptionLibrary.initSession(
-                        activity,
-                        PerceptionLibraryConstants.OPEN_XR_SPACE_TYPE_VIEW,
-                        mFakeScheduledExecutorService))
-                .thenReturn(immediateFuture(mock(Session.class)));
-        when(perceptionLibrary.getActivity()).thenReturn(activity);
-        mJxrPlatformAdapterAxr =
-                JxrPlatformAdapterAxr.create(
-                        activity,
-                        mFakeScheduledExecutorService,
-                        mXrExtensions,
-                        new FakeImpressApi(),
-                        mEntityManager,
-                        perceptionLibrary,
-                        mock(SplitEngineSubspaceManager.class),
-                        mock(ImpSplitEngineRenderer.class),
-                        false);
-        mEntity =
-                new TestEntity(
-                        mXrExtensions.createNode(),
-                        mXrExtensions,
-                        mEntityManager,
-                        mFakeScheduledExecutorService);
-        mEntity.setParent(mJxrPlatformAdapterAxr.getActivitySpace());
-    }
-
-    @After
-    public void tearDown() {
-        mJxrPlatformAdapterAxr.dispose();
-        mJxrPlatformAdapterAxr = null;
-    }
-
-    @Test
-    public void getPose_defaultsToPoseInParentSpace() {
-        mEntity.setPose(mTestPose);
-        assertPose(mEntity.getPose(Space.PARENT), mTestPose);
-    }
-
-    @Test
-    public void getPose_parentSpace_returnsParentPose() {
-        ActivitySpaceImpl activitySpace =
-                (ActivitySpaceImpl) mJxrPlatformAdapterAxr.getActivitySpace();
-        activitySpace.setOpenXrReferenceSpacePose(
-                Matrix4.fromTrs(
-                        new Vector3(5f, 6f, 7f),
-                        Quaternion.fromEulerAngles(22f, 33f, 44f),
-                        new Vector3(2f, 2f, 2f)));
-        assertVector3(activitySpace.getScale(Space.PARENT), new Vector3(2f, 2f, 2f));
-
-        mEntity.setPose(mTestPose, Space.PARENT);
-        assertPose(mEntity.getPose(Space.PARENT), mTestPose);
-    }
-
-    @Test
-    public void getPose_activitySpace_returnsActivitySpacePose() {
-        ActivitySpaceImpl activitySpace =
-                (ActivitySpaceImpl) mJxrPlatformAdapterAxr.getActivitySpace();
-        activitySpace.setOpenXrReferenceSpacePose(
-                Matrix4.fromTrs(
-                        new Vector3(5f, 6f, 7f),
-                        Quaternion.fromEulerAngles(22f, 33f, 44f),
-                        new Vector3(2f, 2f, 2f)));
-        assertVector3(activitySpace.getScale(Space.PARENT), new Vector3(2f, 2f, 2f));
-
-        mEntity.setParent(activitySpace);
-        mEntity.setPose(mTestPose, Space.PARENT);
-        assertPose(mEntity.getPose(Space.ACTIVITY), mTestPose);
-    }
-
-    @Test
-    public void getPose_worldSpace_returnsWorldSpacePose() {
-        mEntity.setPose(mTestPose, Space.REAL_WORLD);
-
-        assertPose(mEntity.getPose(Space.REAL_WORLD), mTestPose);
-    }
-
-    @Test
-    public void getPose_invalidSpace_throwsException() {
-        assertThrows(IllegalArgumentException.class, () -> mEntity.getPose(999));
-    }
-
-    @Test
-    public void setPose_parentSpace_setsPoseInParentSpace() {
-        mEntity.setPose(mTestPose, Space.PARENT);
-
-        assertPose(mEntity.getPose(Space.PARENT), mTestPose);
-    }
-
-    @Test
-    public void setPose_activitySpace_setsActivitySpacePose() {
-        mEntity.setPose(mTestPose, Space.PARENT);
-        TestEntity child =
-                new TestEntity(
-                        mXrExtensions.createNode(),
-                        mXrExtensions,
-                        mEntityManager,
-                        mFakeScheduledExecutorService);
-        child.setParent(mEntity);
-        child.setPose(mTestPose, Space.PARENT);
-
-        assertPose(
-                child.getPose(Space.ACTIVITY),
-                new Pose(new Vector3(2.0f, 4.0f, 6.0f), Quaternion.Identity));
-    }
-
-    @Test
-    public void setPose_worldSpace_setsWorldSpacePose() {
-        mEntity.setPose(mTestPose, Space.REAL_WORLD);
-
-        assertPose(mEntity.getPose(Space.REAL_WORLD), mTestPose);
-    }
-
-    @Test
-    public void setPose_invalidSpace_throwsException() {
-        assertThrows(IllegalArgumentException.class, () -> mEntity.setPose(new Pose(), 999));
-    }
-
-    @Test
-    public void getScale_parentSpace_returnsParentScale() {
-        Vector3 scale = new Vector3(1.0f, 2.0f, 3.0f);
-        mEntity.setScale(scale, Space.PARENT);
-
-        assertVector3(mEntity.getScale(Space.PARENT), scale);
-    }
-
-    @Test
-    public void getScale_activitySpace_returnsActivitySpaceScale() {
-        Vector3 scale = new Vector3(1.0f, 2.0f, 3.0f);
-        mEntity.setScale(scale, Space.PARENT);
-
-        assertVector3(mEntity.getScale(Space.PARENT), scale);
-        assertVector3(mEntity.getScale(Space.ACTIVITY), scale);
-    }
-
-    @Test
-    public void getScale_worldSpace_returnsWorldSpaceScale() {
-        ActivitySpaceImpl activitySpace =
-                (ActivitySpaceImpl) mJxrPlatformAdapterAxr.getActivitySpace();
-        activitySpace.mWorldSpaceScale = new Vector3(2.0f, 2.0f, 2.0f);
-        Vector3 scale = new Vector3(1.0f, 2.0f, 3.0f);
-        mEntity.setScale(scale, Space.PARENT);
-
-        assertVector3(
-                mEntity.getScale(Space.REAL_WORLD), scale.times(activitySpace.mWorldSpaceScale));
-    }
-
-    @Test
-    public void getScale_invalidSpace_throwsException() {
-        Vector3 scale = new Vector3(1.0f, 2.0f, 3.0f);
-        mEntity.setScale(scale, Space.PARENT);
-
-        assertThrows(IllegalArgumentException.class, () -> mEntity.getScale(999));
-    }
-
-    @Test
-    public void setScaleActivitySpace_setsActivitySpaceScale() {
-        Vector3 scale = new Vector3(1.0f, 2.0f, 3.0f);
-        mEntity.setScale(scale, Space.PARENT);
-        TestEntity child =
-                new TestEntity(
-                        mXrExtensions.createNode(),
-                        mXrExtensions,
-                        mEntityManager,
-                        mFakeScheduledExecutorService);
-        child.setParent(mEntity);
-        child.setScale(scale, Space.PARENT);
-        assertVector3(child.getScale(Space.ACTIVITY), scale.times(scale));
-    }
-
-    @Test
-    public void setScale_worldSpace_setsWorldSpaceScale() {
-        ActivitySpaceImpl activitySpace =
-                (ActivitySpaceImpl) mJxrPlatformAdapterAxr.getActivitySpace();
-        activitySpace.mWorldSpaceScale = new Vector3(2.0f, 2.0f, 2.0f);
-        Vector3 scale = new Vector3(1.0f, 2.0f, 3.0f);
-        mEntity.setScale(scale, Space.PARENT);
-        TestEntity child =
-                new TestEntity(
-                        mXrExtensions.createNode(),
-                        mXrExtensions,
-                        mEntityManager,
-                        mFakeScheduledExecutorService);
-        child.setParent(mEntity);
-        child.setScale(scale, Space.PARENT);
-
-        assertVector3(
-                child.getScale(Space.REAL_WORLD),
-                scale.times(scale.times(activitySpace.mWorldSpaceScale)));
-    }
-
-    @Test
-    public void getPoseInActivitySpaceWithScale_returnsPose() {
-        mEntity.setPose(mTestPose, Space.PARENT);
-        mEntity.setScale(new Vector3(2f, 2f, 2f), Space.PARENT);
-        TestEntity child =
-                new TestEntity(
-                        mXrExtensions.createNode(),
-                        mXrExtensions,
-                        mEntityManager,
-                        mFakeScheduledExecutorService);
-        child.setPose(mTestPose, Space.PARENT);
-        child.setParent(mEntity);
-        child.setScale(new Vector3(3f, 3f, 3f), Space.PARENT);
-        TestEntity grandchild =
-                new TestEntity(
-                        mXrExtensions.createNode(),
-                        mXrExtensions,
-                        mEntityManager,
-                        mFakeScheduledExecutorService);
-        grandchild.setPose(mTestPose, Space.PARENT);
-        grandchild.setParent(child);
-        ActivitySpaceImpl activitySpace =
-                (ActivitySpaceImpl) mJxrPlatformAdapterAxr.getActivitySpace();
-        activitySpace.setOpenXrReferenceSpacePose(
-                Matrix4.fromTrs(
-                        new Vector3(5f, 6f, 7f),
-                        Quaternion.fromEulerAngles(22f, 33f, 44f),
-                        new Vector3(2f, 2f, 2f)));
-        assertVector3(activitySpace.getScale(Space.PARENT), new Vector3(2f, 2f, 2f));
-
-        assertPose(mEntity.getPose(Space.PARENT), mTestPose);
-        assertPose(mEntity.getPose(Space.ACTIVITY), mTestPose);
-
-        assertPose(child.getPose(Space.PARENT), mTestPose);
-        assertPose(
-                child.getPose(Space.ACTIVITY),
-                new Pose(new Vector3(3f, 6f, 9f), Quaternion.Identity));
-
-        grandchild.setPose(mTestPose, Space.PARENT);
-        assertPose(grandchild.getPose(Space.PARENT), mTestPose);
-        assertPose(
-                grandchild.getPose(Space.ACTIVITY),
-                new Pose(new Vector3(9f, 18f, 27f), Quaternion.Identity));
-    }
-
-    @Test
-    public void setScale_invalidSpace_throwsException() {
-        mEntity.setScale(new Vector3(1.0f, 2.0f, 3.0f), Space.PARENT);
-
-        assertThrows(IllegalArgumentException.class, () -> mEntity.setScale(new Vector3(), 999));
-    }
-
-    @Test
-    public void getAlpha_parentSpace_returnsParentAlpha() {
-        mEntity.setAlpha(0.5f, Space.PARENT);
-
-        assertThat(mEntity.getAlpha(Space.PARENT)).isEqualTo(0.5f);
-    }
-
-    @Test
-    public void getAlpha_activitySpace_returnsActivitySpaceAlpha() {
-        mEntity.setAlpha(0.5f, Space.PARENT);
-
-        assertThat(mEntity.getAlpha(Space.ACTIVITY)).isEqualTo(0.5f);
-    }
-
-    @Test
-    public void getAlpha_worldSpace_returnsWorldSpaceAlpha() {
-        mEntity.setAlpha(0.5f, Space.REAL_WORLD);
-
-        assertThat(mEntity.getAlpha(Space.REAL_WORLD)).isEqualTo(0.5f);
-    }
-
-    @Test
-    public void getAlpha_invalidSpace_throwsException() {
-        mEntity.setAlpha(0.5f, Space.PARENT);
-        assertThrows(IllegalArgumentException.class, () -> mEntity.getAlpha(999));
-    }
-
-    @Test
-    public void setAlpha_setsAlpha() {
-        mEntity.setAlpha(0.5f, Space.PARENT);
-
-        assertThat(mEntity.getAlpha(Space.PARENT)).isEqualTo(0.5f);
-    }
-
-    @Test
-    public void setAlpha_parentSpace_setsParentAlpha() {
-        mEntity.setAlpha(0.5f, Space.PARENT);
-
-        assertThat(mEntity.getAlpha(Space.PARENT)).isEqualTo(0.5f);
-    }
-
-    @Test
-    public void setAlpha_activitySpace_setsActivitySpaceAlpha() {
-        mEntity.setAlpha(0.5f, Space.PARENT);
-        TestEntity child =
-                new TestEntity(
-                        mXrExtensions.createNode(),
-                        mXrExtensions,
-                        mEntityManager,
-                        mFakeScheduledExecutorService);
-        child.setParent(mEntity);
-        child.setAlpha(0.5f, Space.PARENT);
-
-        assertThat(child.getAlpha(Space.ACTIVITY)).isEqualTo(0.25f);
-    }
-
-    @Test
-    public void setAlpha_worldSpace_setsWorldSpaceAlpha() {
-        mJxrPlatformAdapterAxr.getActivitySpace().setAlpha(4f, Space.PARENT);
-        mEntity.setAlpha(0.5f, Space.PARENT);
-        TestEntity child =
-                new TestEntity(
-                        mXrExtensions.createNode(),
-                        mXrExtensions,
-                        mEntityManager,
-                        mFakeScheduledExecutorService);
-        child.setParent(mEntity);
-        child.setAlpha(0.5f, Space.PARENT);
-
-        assertThat(child.getAlpha(Space.REAL_WORLD)).isEqualTo(1f);
-    }
-
-    @Test
-    public void setAlpha_invalidSpace_throwsException() {
-        assertThrows(IllegalArgumentException.class, () -> mEntity.setAlpha(0.5f, 999));
-    }
-}
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/InteractableComponentImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/InteractableComponentImplTest.java
index 83a333a..25ce256 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/InteractableComponentImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/InteractableComponentImplTest.java
@@ -29,22 +29,19 @@
 
 import android.app.Activity;
 
+import androidx.xr.extensions.node.Vec3;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.scenecore.JxrPlatformAdapter.Entity;
 import androidx.xr.scenecore.JxrPlatformAdapter.InputEventListener;
 import androidx.xr.scenecore.JxrPlatformAdapter.InteractableComponent;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
 import androidx.xr.scenecore.impl.perception.Session;
 import androidx.xr.scenecore.testing.FakeImpressApi;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeInputEvent;
 import androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.InputEvent;
-import com.android.extensions.xr.node.ShadowInputEvent;
-import com.android.extensions.xr.node.Vec3;
-
 import com.google.androidxr.splitengine.SplitEngineSubspaceManager;
 import com.google.ar.imp.view.splitengine.ImpSplitEngineRenderer;
 
@@ -66,7 +63,7 @@
     private final Activity mActivity = mActivityController.create().start().get();
     private final FakeScheduledExecutorService mFakeExecutor = new FakeScheduledExecutorService();
     private final PerceptionLibrary mPerceptionLibrary = mock(PerceptionLibrary.class);
-    private final XrExtensions mXrExtensions = XrExtensionsProvider.getXrExtensions();
+    private final FakeXrExtensions mFakeExtensions = new FakeXrExtensions();
     private final FakeImpressApi mFakeImpressApi = new FakeImpressApi();
     private JxrPlatformAdapterAxr mFakeRuntime;
     SplitEngineSubspaceManager mSplitEngineSubspaceManager =
@@ -81,7 +78,7 @@
                 JxrPlatformAdapterAxr.create(
                         mActivity,
                         mFakeExecutor,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mFakeImpressApi,
                         new EntityManager(),
                         mPerceptionLibrary,
@@ -108,14 +105,14 @@
         InteractableComponent interactableComponent =
                 new InteractableComponentImpl(executor, inputEventListener);
         assertThat(entity.addComponent(interactableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
 
         assertThat(node.getListener()).isNotNull();
         assertThat(node.getExecutor()).isEqualTo(mFakeExecutor);
 
-        InputEvent inputEvent =
-                ShadowInputEvent.create(
-                        /* origin= */ new Vec3(0, 0, 0), /* direction= */ new Vec3(1, 1, 1));
+        FakeInputEvent inputEvent = new FakeInputEvent();
+        inputEvent.setOrigin(new Vec3(0, 0, 0));
+        inputEvent.setDirection(new Vec3(1, 1, 1));
         node.sendInputEvent(inputEvent);
         mFakeExecutor.runAll();
 
@@ -131,14 +128,14 @@
         InteractableComponent interactableComponent =
                 new InteractableComponentImpl(executor, inputEventListener);
         assertThat(entity.addComponent(interactableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
 
         assertThat(node.getListener()).isNotNull();
         assertThat(node.getExecutor()).isEqualTo(mFakeExecutor);
 
-        InputEvent inputEvent =
-                ShadowInputEvent.create(
-                        /* origin= */ new Vec3(0, 0, 0), /* direction= */ new Vec3(1, 1, 1));
+        FakeInputEvent inputEvent = new FakeInputEvent();
+        inputEvent.setOrigin(new Vec3(0, 0, 0));
+        inputEvent.setDirection(new Vec3(1, 1, 1));
         node.sendInputEvent(inputEvent);
         mFakeExecutor.runAll();
 
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/JxrPlatformAdapterAxrTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/JxrPlatformAdapterAxrTest.java
index 7bc9d5d..469f8a0 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/JxrPlatformAdapterAxrTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/JxrPlatformAdapterAxrTest.java
@@ -48,6 +48,9 @@
 import androidx.test.rule.GrantPermissionRule;
 import androidx.xr.extensions.environment.EnvironmentVisibilityState;
 import androidx.xr.extensions.environment.PassthroughVisibilityState;
+import androidx.xr.extensions.node.Mat4f;
+import androidx.xr.extensions.node.ReformOptions;
+import androidx.xr.extensions.node.Vec3;
 import androidx.xr.runtime.math.Matrix4;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Quaternion;
@@ -77,12 +80,10 @@
 import androidx.xr.scenecore.JxrPlatformAdapter.PlaneType;
 import androidx.xr.scenecore.JxrPlatformAdapter.PointerCaptureComponent;
 import androidx.xr.scenecore.JxrPlatformAdapter.ResizableComponent;
-import androidx.xr.scenecore.JxrPlatformAdapter.Space;
 import androidx.xr.scenecore.JxrPlatformAdapter.SpatialCapabilities;
 import androidx.xr.scenecore.JxrPlatformAdapter.SpatialEnvironment;
 import androidx.xr.scenecore.JxrPlatformAdapter.SurfaceEntity;
 import androidx.xr.scenecore.JxrPlatformAdapter.TextureResource;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.impl.perception.Anchor;
 import androidx.xr.scenecore.impl.perception.Fov;
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
@@ -93,25 +94,16 @@
 import androidx.xr.scenecore.impl.perception.exceptions.FailedToInitializeException;
 import androidx.xr.scenecore.testing.FakeImpressApi;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeEnvironmentToken;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeEnvironmentVisibilityState;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeGltfModelToken;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeInputEvent;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeInputEvent.FakeHitInfo;
 import androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode;
-
-import com.android.extensions.xr.ShadowXrExtensions;
-import com.android.extensions.xr.ShadowXrExtensions.SpaceMode;
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.asset.FakeEnvironmentToken;
-import com.android.extensions.xr.asset.FakeGltfModelToken;
-import com.android.extensions.xr.environment.ShadowEnvironmentVisibilityState;
-import com.android.extensions.xr.environment.ShadowPassthroughVisibilityState;
-import com.android.extensions.xr.node.InputEvent.HitInfo;
-import com.android.extensions.xr.node.Mat4f;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.NodeRepository;
-import com.android.extensions.xr.node.ReformOptions;
-import com.android.extensions.xr.node.ShadowInputEvent;
-import com.android.extensions.xr.node.Vec3;
-import com.android.extensions.xr.space.ShadowSpatialCapabilities;
-import com.android.extensions.xr.space.ShadowSpatialState;
-import com.android.extensions.xr.space.SpatialState;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakePassthroughVisibilityState;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeSpatialState;
+import androidx.xr.scenecore.testing.FakeXrExtensions.SpaceMode;
 
 import com.google.androidxr.splitengine.SplitEngineSubspaceManager;
 import com.google.androidxr.splitengine.SubspaceNode;
@@ -136,15 +128,16 @@
 import java.util.UUID;
 import java.util.concurrent.Executor;
 import java.util.function.Consumer;
+import java.util.stream.Collectors;
 
 @RunWith(RobolectricTestRunner.class)
 public final class JxrPlatformAdapterAxrTest {
     private static final int OPEN_XR_REFERENCE_SPACE_TYPE = 1;
 
     private static final int SUBSPACE_ID = 5;
-    private final XrExtensions mXrExtensions = XrExtensionsProvider.getXrExtensions();
+    private final FakeXrExtensions mFakeExtensions = new FakeXrExtensions();
     private final FakeImpressApi mFakeImpressApi = new FakeImpressApi();
-    private final Node mSubspaceNode = mXrExtensions.createNode();
+    private final FakeNode mSubspaceNode = (FakeNode) mFakeExtensions.createNode();
     private final SubspaceNode mExpectedSubspace = new SubspaceNode(SUBSPACE_ID, mSubspaceNode);
     private final FakeScheduledExecutorService mFakeExecutor = new FakeScheduledExecutorService();
     private final PerceptionLibrary mPerceptionLibrary = mock(PerceptionLibrary.class);
@@ -168,8 +161,7 @@
     public void setUp() {
         mActivityController = Robolectric.buildActivity(Activity.class);
         mActivity = mActivityController.create().start().get();
-        ShadowXrExtensions.extract(mXrExtensions)
-                .setOpenXrWorldSpaceType(OPEN_XR_REFERENCE_SPACE_TYPE);
+        mFakeExtensions.setOpenXrWorldSpaceType(OPEN_XR_REFERENCE_SPACE_TYPE);
         when(mPerceptionLibrary.initSession(mActivity, OPEN_XR_REFERENCE_SPACE_TYPE, mFakeExecutor))
                 .thenReturn(immediateFuture(mSession));
         when(mPerceptionLibrary.getActivity()).thenReturn(mActivity);
@@ -178,29 +170,19 @@
                 JxrPlatformAdapterAxr.create(
                         mActivity,
                         mFakeExecutor,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mFakeImpressApi,
                         new EntityManager(),
                         mPerceptionLibrary,
                         mSplitEngineSubspaceManager,
                         mSplitEngineRenderer,
                         /* useSplitEngine= */ false);
-        // TODO: b/377554103 - Remove delay once the subscription API are synced with the node
-        // creation.
-        mFakeExecutor.simulateSleepExecutingAllTasks(
-                Duration.ofMillis(SystemSpaceEntityImpl.SUBSCRIPTION_DELAY_MS));
     }
 
     @After
     public void tearDown() {
         // Dispose the runtime between test cases to clean up lingering references.
-        try {
-            mRealityCoreRuntime.dispose();
-        } catch (NullPointerException e) {
-            // Tests which already call dispose will cause a NPE here due to Activity being null
-            // when
-            // detaching from the scene.
-        }
+        mRealityCoreRuntime.dispose();
         mRealityCoreRuntime = null;
 
         if (mRealityCoreRuntimeWithSplitEngine != null) {
@@ -214,8 +196,8 @@
             return;
         }
 
-        Node rootNode = mXrExtensions.createNode();
-        Node taskWindowLeashNode = mXrExtensions.createNode();
+        FakeNode rootNode = (FakeNode) mFakeExtensions.createNode();
+        FakeNode taskWindowLeashNode = (FakeNode) mFakeExtensions.createNode();
         // This is a little unrealistic because it's going to return the same subspace for all the
         // entities created in this test. In practice this is an implementation detail that's
         // irrelevant
@@ -227,7 +209,7 @@
                 JxrPlatformAdapterAxr.create(
                         mActivity,
                         mFakeExecutor,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mFakeImpressApi,
                         new EntityManager(),
                         mPerceptionLibrary,
@@ -269,7 +251,7 @@
         mFakeExecutor.runAll();
         GltfModelResource model = modelFuture.get();
         return mRealityCoreRuntimeWithSplitEngine.createGltfEntity(
-                pose, model, mRealityCoreRuntime.getActivitySpaceRootImpl());
+                pose, model, mRealityCoreRuntimeWithSplitEngine.getActivitySpaceRootImpl());
     }
 
     TextureResource loadTextureSplitEngine() throws Exception {
@@ -298,8 +280,7 @@
         createRuntimeWithSplitEngine();
 
         ListenableFuture<MaterialResource> materialFuture =
-                mRealityCoreRuntimeWithSplitEngine.createWaterMaterial(
-                        /* isAlphaMapVersion= */ false);
+                mRealityCoreRuntimeWithSplitEngine.createWaterMaterial(/* transparent= */ false);
         assertThat(materialFuture).isNotNull();
         // This resolves the transformation of the Future from a SplitEngine token to the JXR
         // Texture.  This is a hidden detail from the API surface's perspective.
@@ -321,11 +302,12 @@
         View view = new View(displayContext);
         view.setLayoutParams(new LayoutParams(640, 480));
         return mRealityCoreRuntime.createPanelEntity(
-                displayContext,
                 pose,
                 view,
                 new PixelDimensions(640, 480),
+                new Dimensions(0.5f, 0.5f, 0.5f),
                 "testPanel",
+                displayContext,
                 mRealityCoreRuntime.getActivitySpaceRootImpl());
     }
 
@@ -350,7 +332,7 @@
                 JxrPlatformAdapterAxr.create(
                         mActivity,
                         mFakeExecutor,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mFakeImpressApi,
                         new EntityManager(),
                         mPerceptionLibrary,
@@ -364,30 +346,15 @@
     }
 
     @Test
-    public void ensureNullSkyboxResourceFuture_nonSplitEngineAssetIsNotNull() {
-        assertThat(((JxrPlatformAdapterAxr) mRealityCoreRuntime).mNullSkyboxResourceFuture)
-                .isNotNull();
-    }
-
-    @Test
-    public void ensureNullSkyboxResourceFutureSplitEngine_splitEngineAssetIsNotNull() {
-        createRuntimeWithSplitEngine();
-        assertThat(((JxrPlatformAdapterAxr) mRealityCoreRuntime).mNullSkyboxResourceFuture)
-                .isNotNull();
-    }
-
-    @Test
     public void requestHomeSpaceMode_callsExtensions() {
         mRealityCoreRuntime.requestHomeSpaceMode();
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getSpaceMode(mActivity))
-                .isEqualTo(SpaceMode.HOME_SPACE);
+        assertThat(mFakeExtensions.getSpaceMode()).isEqualTo(SpaceMode.HOME_SPACE);
     }
 
     @Test
     public void requestFullSpaceMode_callsExtensions() {
         mRealityCoreRuntime.requestFullSpaceMode();
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getSpaceMode(mActivity))
-                .isEqualTo(SpaceMode.FULL_SPACE);
+        assertThat(mFakeExtensions.getSpaceMode()).isEqualTo(SpaceMode.FULL_SPACE);
     }
 
     @Test
@@ -436,12 +403,16 @@
 
     @Test
     public void onSpatialStateChanged_setsSpatialCapabilities() {
-        SpatialState spatialState = ShadowSpatialState.create();
-        ShadowSpatialState.extract(spatialState)
-                .setSpatialCapabilities(
-                        ShadowSpatialCapabilities.create(
-                                androidx.xr.extensions.space.SpatialCapabilities
-                                        .SPATIAL_UI_CAPABLE));
+        FakeSpatialState spatialState = new FakeSpatialState();
+        spatialState.setSpatialCapabilities(
+                new androidx.xr.extensions.space.SpatialCapabilities() {
+                    @Override
+                    public boolean get(int capability) {
+                        return capability
+                                == androidx.xr.extensions.space.SpatialCapabilities
+                                        .SPATIAL_UI_CAPABLE;
+                    }
+                });
         ((JxrPlatformAdapterAxr) mRealityCoreRuntime).onSpatialStateChanged(spatialState);
 
         SpatialCapabilities caps = mRealityCoreRuntime.getSpatialCapabilities();
@@ -462,28 +433,22 @@
         SpatialEnvironment environment = mRealityCoreRuntime.getSpatialEnvironment();
         assertThat(environment.isSpatialEnvironmentPreferenceActive()).isFalse();
 
-        SpatialState state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setEnvironmentVisibilityState(
-                        ShadowEnvironmentVisibilityState.create(
-                                EnvironmentVisibilityState.APP_VISIBLE));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        FakeSpatialState state = new FakeSpatialState();
+        state.setEnvironmentVisibility(
+                new FakeEnvironmentVisibilityState(EnvironmentVisibilityState.APP_VISIBLE));
+        mFakeExtensions.sendSpatialState(state);
         assertThat(environment.isSpatialEnvironmentPreferenceActive()).isTrue();
 
-        state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setEnvironmentVisibilityState(
-                        ShadowEnvironmentVisibilityState.create(
-                                EnvironmentVisibilityState.INVISIBLE));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        state = new FakeSpatialState();
+        state.setEnvironmentVisibility(
+                new FakeEnvironmentVisibilityState(EnvironmentVisibilityState.INVISIBLE));
+        mFakeExtensions.sendSpatialState(state);
         assertThat(environment.isSpatialEnvironmentPreferenceActive()).isFalse();
 
-        state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setEnvironmentVisibilityState(
-                        ShadowEnvironmentVisibilityState.create(
-                                EnvironmentVisibilityState.HOME_VISIBLE));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        state = new FakeSpatialState();
+        state.setEnvironmentVisibility(
+                new FakeEnvironmentVisibilityState(EnvironmentVisibilityState.HOME_VISIBLE));
+        mFakeExtensions.sendSpatialState(state);
         assertThat(environment.isSpatialEnvironmentPreferenceActive()).isFalse();
     }
 
@@ -498,32 +463,26 @@
         assertThat(environment.isSpatialEnvironmentPreferenceActive()).isFalse();
 
         // The first spatial state should always fire the listener
-        SpatialState state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setEnvironmentVisibilityState(
-                        ShadowEnvironmentVisibilityState.create(
-                                EnvironmentVisibilityState.APP_VISIBLE));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        FakeSpatialState state = new FakeSpatialState();
+        state.setEnvironmentVisibility(
+                new FakeEnvironmentVisibilityState(EnvironmentVisibilityState.APP_VISIBLE));
+        mFakeExtensions.sendSpatialState(state);
         verify(listener).accept(true);
 
         // The second spatial state should also fire the listener since it's a different state
-        state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setEnvironmentVisibilityState(
-                        ShadowEnvironmentVisibilityState.create(
-                                EnvironmentVisibilityState.INVISIBLE));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        state = new FakeSpatialState();
+        state.setEnvironmentVisibility(
+                new FakeEnvironmentVisibilityState(EnvironmentVisibilityState.INVISIBLE));
+        mFakeExtensions.sendSpatialState(state);
         assertThat(environment.isSpatialEnvironmentPreferenceActive()).isFalse();
         verify(listener).accept(false);
 
         // The third spatial state should not fire the listener since it is the same as the last
         // state.
-        state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setEnvironmentVisibilityState(
-                        ShadowEnvironmentVisibilityState.create(
-                                EnvironmentVisibilityState.INVISIBLE));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        state = new FakeSpatialState();
+        state.setEnvironmentVisibility(
+                new FakeEnvironmentVisibilityState(EnvironmentVisibilityState.INVISIBLE));
+        mFakeExtensions.sendSpatialState(state);
         assertThat(environment.isSpatialEnvironmentPreferenceActive()).isFalse();
         verify(listener, times(2))
                 .accept(any()); // Verify the listener was not called a third time.
@@ -534,36 +493,28 @@
         SpatialEnvironment environment = mRealityCoreRuntime.getSpatialEnvironment();
         assertThat(environment.getCurrentPassthroughOpacity()).isZero();
 
-        SpatialState state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setPassthroughVisibilityState(
-                        ShadowPassthroughVisibilityState.create(
-                                PassthroughVisibilityState.APP, 0.4f));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        FakeSpatialState state = new FakeSpatialState();
+        state.setPassthroughVisibility(
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.APP, 0.4f));
+        mFakeExtensions.sendSpatialState(state);
         assertThat(environment.getCurrentPassthroughOpacity()).isEqualTo(0.4f);
 
-        state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setPassthroughVisibilityState(
-                        ShadowPassthroughVisibilityState.create(
-                                PassthroughVisibilityState.HOME, 0.5f));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        state = new FakeSpatialState();
+        state.setPassthroughVisibility(
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.HOME, 0.5f));
+        mFakeExtensions.sendSpatialState(state);
         assertThat(environment.getCurrentPassthroughOpacity()).isEqualTo(0.5f);
 
-        state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setPassthroughVisibilityState(
-                        ShadowPassthroughVisibilityState.create(
-                                PassthroughVisibilityState.SYSTEM, 0.9f));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        state = new FakeSpatialState();
+        state.setPassthroughVisibility(
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.SYSTEM, 0.9f));
+        mFakeExtensions.sendSpatialState(state);
         assertThat(environment.getCurrentPassthroughOpacity()).isEqualTo(0.9f);
 
-        state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setPassthroughVisibilityState(
-                        ShadowPassthroughVisibilityState.create(
-                                PassthroughVisibilityState.DISABLED, 0.0f));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        state = new FakeSpatialState();
+        state.setPassthroughVisibility(
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.DISABLED, 0.0f));
+        mFakeExtensions.sendSpatialState(state);
         assertThat(environment.getCurrentPassthroughOpacity()).isZero();
     }
 
@@ -578,43 +529,35 @@
         assertThat(environment.getCurrentPassthroughOpacity()).isZero();
 
         // The first spatial state should always fire the listener
-        SpatialState state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setPassthroughVisibilityState(
-                        ShadowPassthroughVisibilityState.create(
-                                PassthroughVisibilityState.APP, 1.0f));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        FakeSpatialState state = new FakeSpatialState();
+        state.setPassthroughVisibility(
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.APP, 1.0f));
+        mFakeExtensions.sendSpatialState(state);
         verify(listener).accept(1.0f);
 
         // The second spatial state should also fire the listener even if only the opacity changes
-        state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setPassthroughVisibilityState(
-                        ShadowPassthroughVisibilityState.create(
-                                PassthroughVisibilityState.APP, 0.5f));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        state = new FakeSpatialState();
+        state.setPassthroughVisibility(
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.APP, 0.5f));
+        mFakeExtensions.sendSpatialState(state);
         assertThat(environment.getCurrentPassthroughOpacity()).isEqualTo(0.5f);
 
         // The third spatial state should also fire the listener even if only the visibility state
         // changes, but getCurrentPassthroughOpacity() returns the same value as the last state.
-        state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setPassthroughVisibilityState(
-                        ShadowPassthroughVisibilityState.create(
-                                PassthroughVisibilityState.HOME, 0.5f));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        state = new FakeSpatialState();
+        state.setPassthroughVisibility(
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.HOME, 0.5f));
+        mFakeExtensions.sendSpatialState(state);
         assertThat(environment.getCurrentPassthroughOpacity()).isEqualTo(0.5f);
         verify(listener, times(2))
                 .accept(0.5f); // Verify it was called a second time with this value.
 
         // The fourth spatial state should not fire the listener since it is the same as the last
         // state.
-        state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setPassthroughVisibilityState(
-                        ShadowPassthroughVisibilityState.create(
-                                PassthroughVisibilityState.HOME, 0.5f));
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        state = new FakeSpatialState();
+        state.setPassthroughVisibility(
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.HOME, 0.5f));
+        mFakeExtensions.sendSpatialState(state);
         assertThat(environment.getCurrentPassthroughOpacity()).isEqualTo(0.5f);
         verify(listener, times(3))
                 .accept(any()); // Verify the listener was not called a fourth time.
@@ -622,10 +565,8 @@
 
     @Test
     public void currentPassthroughOpacity_isSetDuringRuntimeCreation() {
-        ShadowSpatialState.extract(mXrExtensions.getSpatialState(mActivity))
-                .setPassthroughVisibilityState(
-                        ShadowPassthroughVisibilityState.create(
-                                PassthroughVisibilityState.APP, 0.5f));
+        mFakeExtensions.fakeSpatialState.setPassthroughVisibility(
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.APP, 0.5f));
 
         SpatialEnvironment newEnvironment = mRealityCoreRuntime.getSpatialEnvironment();
         assertThat(newEnvironment.getCurrentPassthroughOpacity()).isEqualTo(0.5f);
@@ -643,18 +584,28 @@
         mRealityCoreRuntime.addSpatialCapabilitiesChangedListener(directExecutor(), listener1);
         mRealityCoreRuntime.addSpatialCapabilitiesChangedListener(directExecutor(), listener2);
 
-        SpatialState state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setSpatialCapabilities(ShadowSpatialCapabilities.createAll());
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        FakeSpatialState state = new FakeSpatialState();
+        state.setSpatialCapabilities(
+                new androidx.xr.extensions.space.SpatialCapabilities() {
+                    @Override
+                    public boolean get(int capability) {
+                        return true;
+                    }
+                });
+        mFakeExtensions.sendSpatialState(state);
         verify(listener1).accept(any());
         verify(listener2).accept(any());
 
-        state = ShadowSpatialState.create();
-        ShadowSpatialState.extract(state)
-                .setSpatialCapabilities(ShadowSpatialCapabilities.create());
+        state = new FakeSpatialState();
+        state.setSpatialCapabilities(
+                new androidx.xr.extensions.space.SpatialCapabilities() {
+                    @Override
+                    public boolean get(int capability) {
+                        return false;
+                    }
+                });
         mRealityCoreRuntime.removeSpatialCapabilitiesChangedListener(listener1);
-        ShadowXrExtensions.extract(mXrExtensions).sendSpatialState(mActivity, state);
+        mFakeExtensions.sendSpatialState(state);
         verify(listener1).accept(any()); // Verify the removed listener was called exactly once
         verify(listener2, times(2)).accept(any()); // Verify the active listener was called twice
     }
@@ -1221,7 +1172,10 @@
         assertThat(panelEntity.getAlpha()).isEqualTo(0.5f);
         assertThat(gltfEntity.getAlpha()).isEqualTo(0.5f);
         assertThat(contentlessEntity.getAlpha()).isEqualTo(0.5f);
-        assertThat(NodeRepository.getInstance().map((metadata) -> metadata.getAlpha()))
+        assertThat(
+                        mFakeExtensions.createdNodes.stream()
+                                .map(FakeNode::getAlpha)
+                                .collect(Collectors.toList()))
                 .containsAtLeast(0.5f, 0.5f, 0.5f);
     }
 
@@ -1231,9 +1185,9 @@
         GltfEntity parent = createGltfEntity();
         Entity entity = createContentlessEntity();
 
-        assertThat(grandparent.getAlpha(Space.ACTIVITY)).isEqualTo(1.0f);
-        assertThat(parent.getAlpha(Space.ACTIVITY)).isEqualTo(1.0f);
-        assertThat(entity.getAlpha(Space.ACTIVITY)).isEqualTo(1.0f);
+        assertThat(grandparent.getActivitySpaceAlpha()).isEqualTo(1.0f);
+        assertThat(parent.getActivitySpaceAlpha()).isEqualTo(1.0f);
+        assertThat(entity.getActivitySpaceAlpha()).isEqualTo(1.0f);
 
         grandparent.setAlpha(0.5f);
         parent.setParent(grandparent);
@@ -1241,10 +1195,13 @@
         entity.setParent(parent);
         entity.setAlpha(0.5f);
 
-        assertThat(grandparent.getAlpha(Space.ACTIVITY)).isEqualTo(0.5f);
-        assertThat(parent.getAlpha(Space.ACTIVITY)).isEqualTo(0.25f);
-        assertThat(entity.getAlpha(Space.ACTIVITY)).isEqualTo(0.125f);
-        assertThat(NodeRepository.getInstance().map((metadata) -> metadata.getAlpha()))
+        assertThat(grandparent.getActivitySpaceAlpha()).isEqualTo(0.5f);
+        assertThat(parent.getActivitySpaceAlpha()).isEqualTo(0.25f);
+        assertThat(entity.getActivitySpaceAlpha()).isEqualTo(0.125f);
+        assertThat(
+                        mFakeExtensions.createdNodes.stream()
+                                .map(FakeNode::getAlpha)
+                                .collect(Collectors.toList()))
                 .containsAtLeast(0.5f, 0.5f, 0.5f);
     }
 
@@ -1342,7 +1299,7 @@
     @Test
     public void setHidden_modifiesReforms() throws Exception {
         PanelEntity testEntity = createPanelEntity();
-        FakeNode testNode = new FakeNode(((AndroidXrEntity) testEntity).getNode());
+        FakeNode testNode = (FakeNode) ((AndroidXrEntity) testEntity).getNode();
 
         assertThat(
                         testEntity.addComponent(
@@ -1353,7 +1310,7 @@
                                         /* shouldDisposeParentAnchor= */ true)))
                 .isTrue();
         testEntity.setHidden(true);
-        assertThat(testNode.getReformOptions()).isNull();
+        assertThat(testNode.getReformOptions().getEnabledReform()).isEqualTo(0);
         testEntity.setHidden(false);
         assertThat(testNode.getReformOptions().getEnabledReform())
                 .isEqualTo(ReformOptions.ALLOW_MOVE);
@@ -1493,37 +1450,6 @@
     }
 
     @Test
-    public void loadExrImageByAssetNameSplitEngine_returnsModel() throws Exception {
-        ListenableFuture<ExrImageResource> imageFuture =
-                mRealityCoreRuntime.loadExrImageByAssetNameSplitEngine("FakeAsset.zip");
-
-        assertThat(imageFuture).isNotNull();
-
-        ExrImageResource image = imageFuture.get();
-        assertThat(image).isNotNull();
-        ExrImageResourceImplSplitEngine imageImpl = (ExrImageResourceImplSplitEngine) image;
-        assertThat(imageImpl).isNotNull();
-        long token = imageImpl.getExtensionImageToken();
-        assertThat(token).isEqualTo(1);
-    }
-
-    @Test
-    public void loadExrImageByByteArraySplitEngine_returnsModel() throws Exception {
-        ListenableFuture<ExrImageResource> imageFuture =
-                mRealityCoreRuntime.loadExrImageByByteArraySplitEngine(
-                        new byte[] {1, 2, 3}, "FakeAsset.zip");
-
-        assertThat(imageFuture).isNotNull();
-
-        ExrImageResource image = imageFuture.get();
-        assertThat(image).isNotNull();
-        ExrImageResourceImplSplitEngine imageImpl = (ExrImageResourceImplSplitEngine) image;
-        assertThat(imageImpl).isNotNull();
-        long token = imageImpl.getExtensionImageToken();
-        assertThat(token).isEqualTo(1);
-    }
-
-    @Test
     public void loadGltfByAssetName_returnsModel() throws Exception {
         ListenableFuture<GltfModelResource> modelFuture =
                 mRealityCoreRuntime.loadGltfByAssetName("FakeAsset.glb");
@@ -1540,36 +1466,6 @@
     }
 
     @Test
-    public void loadGltfByAssetNameSplitEngine_returnsModel() throws Exception {
-        ListenableFuture<GltfModelResource> modelFuture =
-                mRealityCoreRuntime.loadGltfByAssetNameSplitEngine("FakeAsset.glb");
-
-        assertThat(modelFuture).isNotNull();
-
-        GltfModelResource model = modelFuture.get();
-        assertThat(model).isNotNull();
-        GltfModelResourceImplSplitEngine modelImpl = (GltfModelResourceImplSplitEngine) model;
-        assertThat(modelImpl).isNotNull();
-        long token = modelImpl.getExtensionModelToken();
-        assertThat(token).isEqualTo(1);
-    }
-
-    @Test
-    public void loadGltfByByteArray_returnsModel() throws Exception {
-        ListenableFuture<GltfModelResource> modelFuture =
-                mRealityCoreRuntime.loadGltfByByteArray(new byte[] {1, 2, 3}, "FakeAsset.glb");
-
-        assertThat(modelFuture).isNotNull();
-
-        GltfModelResource model = modelFuture.get();
-        assertThat(model).isNotNull();
-        GltfModelResourceImplSplitEngine modelImpl = (GltfModelResourceImplSplitEngine) model;
-        assertThat(modelImpl).isNotNull();
-        long token = modelImpl.getExtensionModelToken();
-        assertThat(token).isEqualTo(1);
-    }
-
-    @Test
     public void createGltfEntity_returnsEntity() throws Exception {
         assertThat(createGltfEntity()).isNotNull();
     }
@@ -1635,9 +1531,8 @@
         assertThat(parentEntity.getChildren()).containsExactly(childEntity);
 
         // Verify that there is an underlying extension node relationship.
-        Node childNode = ((GltfEntityImpl) childEntity).getNode();
-        assertThat(NodeRepository.getInstance().getParent(childNode))
-                .isEqualTo(((GltfEntityImpl) parentEntity).getNode());
+        FakeNode childNode = (FakeNode) ((GltfEntityImpl) childEntity).getNode();
+        assertThat(childNode.getParent()).isEqualTo(((GltfEntityImpl) parentEntity).getNode());
     }
 
     @Test
@@ -1651,16 +1546,14 @@
         assertThat(parentEntity1.getChildren()).containsExactly(childEntity);
         assertThat(parentEntity2.getChildren()).isEmpty();
 
-        Node childNode = ((GltfEntityImpl) childEntity).getNode();
-        assertThat(NodeRepository.getInstance().getParent(childNode))
-                .isEqualTo(((GltfEntityImpl) parentEntity1).getNode());
+        FakeNode childNode = (FakeNode) ((GltfEntityImpl) childEntity).getNode();
+        assertThat(childNode.getParent()).isEqualTo(((GltfEntityImpl) parentEntity1).getNode());
 
         childEntity.setParent(parentEntity2);
         assertThat(childEntity.getParent()).isEqualTo(parentEntity2);
         assertThat(parentEntity2.getChildren()).containsExactly(childEntity);
         assertThat(parentEntity1.getChildren()).isEmpty();
-        assertThat(NodeRepository.getInstance().getParent(childNode))
-                .isEqualTo(((GltfEntityImpl) parentEntity2).getNode());
+        assertThat(childNode.getParent()).isEqualTo(((GltfEntityImpl) parentEntity2).getNode());
     }
 
     @Test
@@ -1679,12 +1572,10 @@
         assertThat(childEntity2.getParent()).isEqualTo(parentEntity);
         assertThat(parentEntity.getChildren()).containsExactly(childEntity1, childEntity2);
 
-        Node childNode1 = ((GltfEntityImpl) childEntity1).getNode();
-        assertThat(NodeRepository.getInstance().getParent(childNode1))
-                .isEqualTo(((GltfEntityImpl) parentEntity).getNode());
-        Node childNode2 = ((GltfEntityImpl) childEntity2).getNode();
-        assertThat(NodeRepository.getInstance().getParent(childNode2))
-                .isEqualTo(((GltfEntityImpl) parentEntity).getNode());
+        FakeNode childNode1 = (FakeNode) ((GltfEntityImpl) childEntity1).getNode();
+        assertThat(childNode1.getParent()).isEqualTo(((GltfEntityImpl) parentEntity).getNode());
+        FakeNode childNode2 = (FakeNode) ((GltfEntityImpl) childEntity2).getNode();
+        assertThat(childNode2.getParent()).isEqualTo(((GltfEntityImpl) parentEntity).getNode());
     }
 
     @Test
@@ -1712,9 +1603,8 @@
         assertThat(parentEntity.getChildren()).containsExactly(childEntity);
 
         // Verify that there is an underlying extension node relationship.
-        Node childNode = ((PanelEntityImpl) childEntity).getNode();
-        assertThat(NodeRepository.getInstance().getParent(childNode))
-                .isEqualTo(((PanelEntityImpl) parentEntity).getNode());
+        FakeNode childNode = (FakeNode) ((PanelEntityImpl) childEntity).getNode();
+        assertThat(childNode.getParent()).isEqualTo(((PanelEntityImpl) parentEntity).getNode());
     }
 
     @Test
@@ -1728,16 +1618,14 @@
         assertThat(parentEntity1.getChildren()).containsExactly(childEntity);
         assertThat(parentEntity2.getChildren()).isEmpty();
 
-        Node childNode = ((PanelEntityImpl) childEntity).getNode();
-        assertThat(NodeRepository.getInstance().getParent(childNode))
-                .isEqualTo(((PanelEntityImpl) parentEntity1).getNode());
+        FakeNode childNode = (FakeNode) ((PanelEntityImpl) childEntity).getNode();
+        assertThat(childNode.getParent()).isEqualTo(((PanelEntityImpl) parentEntity1).getNode());
 
         childEntity.setParent(parentEntity2);
         assertThat(childEntity.getParent()).isEqualTo(parentEntity2);
         assertThat(parentEntity2.getChildren()).containsExactly(childEntity);
         assertThat(parentEntity1.getChildren()).isEmpty();
-        assertThat(NodeRepository.getInstance().getParent(childNode))
-                .isEqualTo(((PanelEntityImpl) parentEntity2).getNode());
+        assertThat(childNode.getParent()).isEqualTo(((PanelEntityImpl) parentEntity2).getNode());
     }
 
     @Test
@@ -1756,12 +1644,10 @@
         assertThat(childEntity2.getParent()).isEqualTo(parentEntity);
         assertThat(parentEntity.getChildren()).containsExactly(childEntity1, childEntity2);
 
-        Node childNode1 = ((PanelEntityImpl) childEntity1).getNode();
-        assertThat(NodeRepository.getInstance().getParent(childNode1))
-                .isEqualTo(((PanelEntityImpl) parentEntity).getNode());
-        Node childNode2 = ((PanelEntityImpl) childEntity2).getNode();
-        assertThat(NodeRepository.getInstance().getParent(childNode2))
-                .isEqualTo(((PanelEntityImpl) parentEntity).getNode());
+        FakeNode childNode1 = (FakeNode) ((PanelEntityImpl) childEntity1).getNode();
+        assertThat(childNode1.getParent()).isEqualTo(((PanelEntityImpl) parentEntity).getNode());
+        FakeNode childNode2 = (FakeNode) ((PanelEntityImpl) childEntity2).getNode();
+        assertThat(childNode2.getParent()).isEqualTo(((PanelEntityImpl) parentEntity).getNode());
     }
 
     @Test
@@ -1800,7 +1686,7 @@
         PanelEntity mainPanel = mRealityCoreRuntime.getMainPanelEntity();
 
         assertThat(((MainPanelEntityImpl) mainPanel).getNode())
-                .isEqualTo(ShadowXrExtensions.extract(mXrExtensions).getMainWindowNode(mActivity));
+                .isEqualTo(mFakeExtensions.getFakeNodeForMainWindow());
     }
 
     @Test
@@ -1809,14 +1695,15 @@
         PanelEntity panelEntity = createPanelEntity();
         Executor executor = directExecutor();
         panelEntity.addInputEventListener(executor, mockConsumer);
-        FakeNode node = new FakeNode(((PanelEntityImpl) panelEntity).getNode());
+        FakeNode node = (FakeNode) ((PanelEntityImpl) panelEntity).getNode();
 
         assertThat(node.getListener()).isNotNull();
         assertThat(node.getExecutor()).isEqualTo(mFakeExecutor);
 
-        com.android.extensions.xr.node.InputEvent inputEvent =
-                ShadowInputEvent.create(
-                        /* origin= */ new Vec3(0, 0, 0), /* direction= */ new Vec3(1, 1, 1));
+        FakeInputEvent inputEvent = new FakeInputEvent();
+        inputEvent.setOrigin(new Vec3(0, 0, 0));
+        inputEvent.setDirection(new Vec3(1, 1, 1));
+
         node.sendInputEvent(inputEvent);
         mFakeExecutor.runAll();
 
@@ -1829,19 +1716,17 @@
         PanelEntity panelEntity = createPanelEntity();
         Executor executor = directExecutor();
         panelEntity.addInputEventListener(executor, mockConsumer);
-        Node node = ((PanelEntityImpl) panelEntity).getNode();
-        FakeNode fakeNode = new FakeNode(node);
-        com.android.extensions.xr.node.InputEvent inputEvent =
-                ShadowInputEvent.create(
-                        /* origin= */ new Vec3(0, 0, 0),
-                        /* direction= */ new Vec3(1, 1, 1),
-                        /* histInfo= */ new HitInfo(
-                                /* subspaceImpressNodeId= */ 0,
-                                /* inputNode= */ node,
-                                /* transform= */ new Mat4f(new float[16]),
-                                /* hitPosition= */ new Vec3(1, 2, 3)),
-                        /* secondaryHitInfo= */ null);
-        fakeNode.sendInputEvent(inputEvent);
+        FakeNode node = (FakeNode) ((PanelEntityImpl) panelEntity).getNode();
+        FakeInputEvent xrInputEvent = new FakeInputEvent();
+        xrInputEvent.setOrigin(new Vec3(0, 0, 0));
+        xrInputEvent.setDirection(new Vec3(1, 1, 1));
+        FakeHitInfo hitInfo = new FakeHitInfo();
+        hitInfo.setInputNode(node);
+        hitInfo.setHitPosition(new Vec3(1, 2, 3));
+        hitInfo.setTransform(new Mat4f(new float[16]));
+        xrInputEvent.setFakeHitInfo(hitInfo);
+
+        node.sendInputEvent(xrInputEvent);
         mFakeExecutor.runAll();
 
         ArgumentCaptor<InputEvent> inputEventCaptor = ArgumentCaptor.forClass(InputEvent.class);
@@ -1857,7 +1742,7 @@
         InputEventListener mockConsumer = mock(InputEventListener.class);
         PanelEntity panelEntity = createPanelEntity();
         panelEntity.addInputEventListener(/* executor= */ null, mockConsumer);
-        FakeNode node = new FakeNode(((PanelEntityImpl) panelEntity).getNode());
+        FakeNode node = (FakeNode) ((PanelEntityImpl) panelEntity).getNode();
 
         assertThat(node.getListener()).isNotNull();
         assertThat(node.getExecutor()).isNotNull();
@@ -1871,10 +1756,11 @@
         Executor executor = directExecutor();
         panelEntity.addInputEventListener(executor, mockConsumer1);
         panelEntity.addInputEventListener(executor, mockConsumer2);
-        FakeNode node = new FakeNode(((PanelEntityImpl) panelEntity).getNode());
-        com.android.extensions.xr.node.InputEvent inputEvent =
-                ShadowInputEvent.create(
-                        /* origin= */ new Vec3(0, 0, 0), /* direction= */ new Vec3(1, 1, 1));
+        FakeNode node = (FakeNode) ((PanelEntityImpl) panelEntity).getNode();
+        FakeInputEvent inputEvent = new FakeInputEvent();
+        inputEvent.setOrigin(new Vec3(0, 0, 0));
+        inputEvent.setDirection(new Vec3(1, 1, 1));
+
         node.sendInputEvent(inputEvent);
         mFakeExecutor.runAll();
 
@@ -1891,10 +1777,10 @@
         FakeScheduledExecutorService executor2 = new FakeScheduledExecutorService();
         panelEntity.addInputEventListener(executor1, mockConsumer1);
         panelEntity.addInputEventListener(executor2, mockConsumer2);
-        FakeNode node = new FakeNode(((PanelEntityImpl) panelEntity).getNode());
-        com.android.extensions.xr.node.InputEvent inputEvent =
-                ShadowInputEvent.create(
-                        /* origin= */ new Vec3(0, 0, 0), /* direction= */ new Vec3(1, 1, 1));
+        FakeNode node = (FakeNode) ((PanelEntityImpl) panelEntity).getNode();
+        FakeInputEvent inputEvent = new FakeInputEvent();
+        inputEvent.setOrigin(new Vec3(0, 0, 0));
+        inputEvent.setDirection(new Vec3(1, 1, 1));
 
         node.sendInputEvent(inputEvent);
         mFakeExecutor.runAll();
@@ -1917,10 +1803,10 @@
         Executor executor = directExecutor();
         panelEntity.addInputEventListener(executor, mockConsumer1);
         panelEntity.addInputEventListener(executor, mockConsumer2);
-        FakeNode node = new FakeNode(((PanelEntityImpl) panelEntity).getNode());
-        com.android.extensions.xr.node.InputEvent inputEvent =
-                ShadowInputEvent.create(
-                        /* origin= */ new Vec3(0, 0, 0), /* direction= */ new Vec3(1, 1, 1));
+        FakeNode node = (FakeNode) ((PanelEntityImpl) panelEntity).getNode();
+        FakeInputEvent inputEvent = new FakeInputEvent();
+        inputEvent.setOrigin(new Vec3(0, 0, 0));
+        inputEvent.setDirection(new Vec3(1, 1, 1));
 
         node.sendInputEvent(inputEvent);
         mFakeExecutor.runAll();
@@ -1942,10 +1828,10 @@
         Executor executor = directExecutor();
         panelEntity.addInputEventListener(executor, mockConsumer1);
         panelEntity.addInputEventListener(executor, mockConsumer2);
-        FakeNode node = new FakeNode(((PanelEntityImpl) panelEntity).getNode());
-        com.android.extensions.xr.node.InputEvent inputEvent =
-                ShadowInputEvent.create(
-                        /* origin= */ new Vec3(0, 0, 0), /* direction= */ new Vec3(1, 1, 1));
+        FakeNode node = (FakeNode) ((PanelEntityImpl) panelEntity).getNode();
+        FakeInputEvent inputEvent = new FakeInputEvent();
+        inputEvent.setOrigin(new Vec3(0, 0, 0));
+        inputEvent.setDirection(new Vec3(1, 1, 1));
 
         node.sendInputEvent(inputEvent);
         mFakeExecutor.runAll();
@@ -1969,10 +1855,10 @@
         Executor executor = directExecutor();
         panelEntity.addInputEventListener(executor, mockConsumer1);
         panelEntity.addInputEventListener(executor, mockConsumer2);
-        FakeNode node = new FakeNode(((PanelEntityImpl) panelEntity).getNode());
-        com.android.extensions.xr.node.InputEvent inputEvent =
-                ShadowInputEvent.create(
-                        /* origin= */ new Vec3(0, 0, 0), /* direction= */ new Vec3(1, 1, 1));
+        FakeNode node = (FakeNode) ((PanelEntityImpl) panelEntity).getNode();
+        FakeInputEvent inputEvent = new FakeInputEvent();
+        inputEvent.setOrigin(new Vec3(0, 0, 0));
+        inputEvent.setDirection(new Vec3(1, 1, 1));
 
         node.sendInputEvent(inputEvent);
         mFakeExecutor.runAll();
@@ -2014,12 +1900,10 @@
         assertThat(childEntity2.getParent()).isEqualTo(parentEntity);
         assertThat(parentEntity.getChildren()).containsExactly(childEntity1, childEntity2);
 
-        Node childNode1 = ((AndroidXrEntity) childEntity1).getNode();
-        assertThat(NodeRepository.getInstance().getParent(childNode1))
-                .isEqualTo(((AndroidXrEntity) parentEntity).getNode());
-        Node childNode2 = ((AndroidXrEntity) childEntity2).getNode();
-        assertThat(NodeRepository.getInstance().getParent(childNode2))
-                .isEqualTo(((AndroidXrEntity) parentEntity).getNode());
+        FakeNode childNode1 = (FakeNode) ((AndroidXrEntity) childEntity1).getNode();
+        assertThat(childNode1.getParent()).isEqualTo(((AndroidXrEntity) parentEntity).getNode());
+        FakeNode childNode2 = (FakeNode) ((AndroidXrEntity) childEntity2).getNode();
+        assertThat(childNode2.getParent()).isEqualTo(((AndroidXrEntity) parentEntity).getNode());
     }
 
     @Test
@@ -2335,14 +2219,14 @@
     @Test
     public void dispose_clearsReformOptions() {
         AndroidXrEntity entity = (AndroidXrEntity) createContentlessEntity();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         ReformOptions reformOptions = entity.getReformOptions();
         assertThat(reformOptions).isNotNull();
-        ReformOptions unused =
-                reformOptions.setEnabledReform(
-                        ReformOptions.ALLOW_MOVE | ReformOptions.ALLOW_RESIZE);
+        reformOptions.setEnabledReform(ReformOptions.ALLOW_MOVE | ReformOptions.ALLOW_RESIZE);
         entity.dispose();
-        assertThat(node.getReformOptions()).isNull();
+        assertThat(node.getReformOptions().getEnabledReform()).isEqualTo(0);
+        assertThat(node.getReformOptions().getEventCallback()).isNull();
+        assertThat(node.getReformOptions().getEventExecutor()).isNull();
     }
 
     @Test
@@ -2372,8 +2256,7 @@
     @Test
     public void setPreferredAspectRatio_callsExtensions() {
         mRealityCoreRuntime.setPreferredAspectRatio(mActivity, 1.23f);
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getPreferredAspectRatio(mActivity))
-                .isEqualTo(1.23f);
+        assertThat(mFakeExtensions.getPreferredAspectRatio()).isEqualTo(1.23f);
     }
 
     @Test
@@ -2497,13 +2380,13 @@
 
     @Test
     public void injectRootNodeAndTaskWindowLeashNode_runtimeImplUsesThoseNodes() {
-        Node rootNode = mXrExtensions.createNode();
-        Node taskWindowLeashNode = mXrExtensions.createNode();
+        FakeNode rootNode = (FakeNode) mFakeExtensions.createNode();
+        FakeNode taskWindowLeashNode = (FakeNode) mFakeExtensions.createNode();
         JxrPlatformAdapterAxr runtime =
                 JxrPlatformAdapterAxr.create(
                         mActivity,
                         mFakeExecutor,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mFakeImpressApi,
                         new EntityManager(),
                         mPerceptionLibrary,
@@ -2523,16 +2406,15 @@
     @Test
     public void dispose_clearsResources() {
         AndroidXrEntity entity = (AndroidXrEntity) createContentlessEntity();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         assertThat(node).isNotNull();
         assertThat(node.getParent()).isNotNull();
 
         mRealityCoreRuntime.dispose();
         assertThat(node.getParent()).isNull();
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getSpatialStateCallback(mActivity))
-                .isNull();
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getMainWindowNode(mActivity)).isNull();
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getTaskNode(mActivity)).isNull();
+        assertThat(mFakeExtensions.getSpatialStateCallback()).isNull();
+        assertThat(mFakeExtensions.getFakeNodeForMainWindow()).isNull();
+        assertThat(mFakeExtensions.getFakeTaskNode()).isNull();
     }
 
     @Test
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MainPanelEntityImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MainPanelEntityImplTest.java
index be075ae..f471035 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MainPanelEntityImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MainPanelEntityImplTest.java
@@ -27,16 +27,13 @@
 
 import androidx.xr.scenecore.JxrPlatformAdapter.Dimensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
 import androidx.xr.scenecore.impl.perception.Session;
 import androidx.xr.scenecore.testing.FakeImpressApi;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
 import androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode;
 
-import com.android.extensions.xr.ShadowXrExtensions;
-import com.android.extensions.xr.XrExtensions;
-
 import com.google.androidxr.splitengine.SplitEngineSubspaceManager;
 import com.google.ar.imp.view.splitengine.ImpSplitEngineRenderer;
 
@@ -51,7 +48,7 @@
 
 @RunWith(RobolectricTestRunner.class)
 public class MainPanelEntityImplTest {
-    private final XrExtensions mXrExtensions = XrExtensionsProvider.getXrExtensions();
+    private final FakeXrExtensions mFakeExtensions = new FakeXrExtensions();
     private final FakeImpressApi mFakeImpressApi = new FakeImpressApi();
     private final ActivityController<Activity> mActivityController =
             Robolectric.buildActivity(Activity.class);
@@ -73,7 +70,7 @@
                 JxrPlatformAdapterAxr.create(
                         mHostActivity,
                         mFakeExecutor,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mFakeImpressApi,
                         new EntityManager(),
                         mPerceptionLibrary,
@@ -96,27 +93,22 @@
     }
 
     @Test
-    public void mainPanelEntitysetSizeInPixels_callsExtensions() {
+    public void mainPanelEntitySetPixelDimensions_callsExtensions() {
         PixelDimensions kTestPixelDimensions = new PixelDimensions(14, 14);
-        mMainPanelEntity.setSizeInPixels(kTestPixelDimensions);
-
-        ShadowXrExtensions shadowXrExtensions = ShadowXrExtensions.extract(mXrExtensions);
-        assertThat(shadowXrExtensions.getMainWindowWidth(mHostActivity))
-                .isEqualTo(kTestPixelDimensions.width);
-        assertThat(shadowXrExtensions.getMainWindowHeight(mHostActivity))
-                .isEqualTo(kTestPixelDimensions.height);
+        mMainPanelEntity.setPixelDimensions(kTestPixelDimensions);
+        assertThat(mFakeExtensions.getMainWindowWidth()).isEqualTo(kTestPixelDimensions.width);
+        assertThat(mFakeExtensions.getMainWindowHeight()).isEqualTo(kTestPixelDimensions.height);
     }
 
     @Test
     public void mainPanelEntitySetSize_callsExtensions() {
+        // TODO(b/352630025): remove this once setSize is removed.
+        // This should have the same effect as setPixelDimensions, except that it has to convert
+        // from Dimensions to PixelDimensions, so it casts float to int.
         Dimensions kTestDimensions = new Dimensions(123.0f, 123.0f, 123.0f);
         mMainPanelEntity.setSize(kTestDimensions);
-
-        ShadowXrExtensions shadowXrExtensions = ShadowXrExtensions.extract(mXrExtensions);
-        assertThat(shadowXrExtensions.getMainWindowWidth(mHostActivity))
-                .isEqualTo((int) kTestDimensions.width);
-        assertThat(shadowXrExtensions.getMainWindowHeight(mHostActivity))
-                .isEqualTo((int) kTestDimensions.height);
+        assertThat(mFakeExtensions.getMainWindowWidth()).isEqualTo((int) kTestDimensions.width);
+        assertThat(mFakeExtensions.getMainWindowWidth()).isEqualTo((int) kTestDimensions.height);
     }
 
     @Test
@@ -124,7 +116,7 @@
         // The (FakeXrExtensions) test default pixel density is 1 pixel per meter. Validate that the
         // corner radius is set to 32dp.
         assertThat(mMainPanelEntity.getCornerRadius()).isEqualTo(32.0f);
-        FakeNode fakeNode = new FakeNode(mMainPanelEntity.getNode());
+        FakeNode fakeNode = (FakeNode) mMainPanelEntity.getNode();
         assertThat(fakeNode.getCornerRadius()).isEqualTo(32.0f);
     }
 }
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MediaPlayerExtensionsWrapperImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MediaPlayerExtensionsWrapperImplTest.java
index d1a42ed..067a7a4 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MediaPlayerExtensionsWrapperImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MediaPlayerExtensionsWrapperImplTest.java
@@ -24,15 +24,12 @@
 import android.media.MediaPlayer;
 
 import androidx.xr.extensions.media.SpatializerExtensions;
+import androidx.xr.extensions.media.XrSpatialAudioExtensions;
+import androidx.xr.extensions.node.Node;
 import androidx.xr.scenecore.JxrPlatformAdapter;
 import androidx.xr.scenecore.JxrPlatformAdapter.MediaPlayerExtensionsWrapper;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
-
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.media.MediaPlayerExtensions;
-import com.android.extensions.xr.media.ShadowMediaPlayerExtensions;
-import com.android.extensions.xr.media.XrSpatialAudioExtensions;
-import com.android.extensions.xr.node.Node;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeMediaPlayerExtensions;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -41,22 +38,23 @@
 
 @RunWith(RobolectricTestRunner.class)
 public class MediaPlayerExtensionsWrapperImplTest {
-    XrExtensions mXrExtensions;
+    FakeXrExtensions mFakeXrExtensions;
     XrSpatialAudioExtensions mSpatialAudioExtensions;
-    MediaPlayerExtensions mMediaPlayerExtensions;
+    FakeMediaPlayerExtensions mFakeMediaPlayerExtensions;
 
     @Before
     public void setUp() {
-        mXrExtensions = XrExtensionsProvider.getXrExtensions();
-        mSpatialAudioExtensions = mXrExtensions.getXrSpatialAudioExtensions();
-        mMediaPlayerExtensions = mSpatialAudioExtensions.getMediaPlayerExtensions();
+        mFakeXrExtensions = new FakeXrExtensions();
+        mSpatialAudioExtensions = mFakeXrExtensions.fakeSpatialAudioExtensions;
+        mFakeMediaPlayerExtensions =
+                (FakeMediaPlayerExtensions) mSpatialAudioExtensions.getMediaPlayerExtensions();
     }
 
     @Test
     public void setPointSourceAttr_callsExtensionsSetPointSourceAttr() {
         MediaPlayer mediaPlayer = new MediaPlayer();
 
-        Node fakeNode = mXrExtensions.createNode();
+        Node fakeNode = new FakeXrExtensions().createNode();
         AndroidXrEntity entity = mock(AndroidXrEntity.class);
         when(entity.getNode()).thenReturn(fakeNode);
 
@@ -64,13 +62,10 @@
                 new JxrPlatformAdapter.PointSourceAttributes(entity);
 
         MediaPlayerExtensionsWrapper wrapper =
-                new MediaPlayerExtensionsWrapperImpl(mMediaPlayerExtensions);
+                new MediaPlayerExtensionsWrapperImpl(mFakeMediaPlayerExtensions);
         wrapper.setPointSourceAttributes(mediaPlayer, expectedRtAttr);
 
-        assertThat(
-                        ShadowMediaPlayerExtensions.extract(mMediaPlayerExtensions)
-                                .getPointSourceAttributes()
-                                .getNode())
+        assertThat(mFakeMediaPlayerExtensions.getPointSourceAttributes().getNode())
                 .isEqualTo(fakeNode);
     }
 
@@ -84,13 +79,10 @@
                         JxrPlatformAdapter.SpatializerConstants.AMBISONICS_ORDER_THIRD_ORDER);
 
         MediaPlayerExtensionsWrapper wrapper =
-                new MediaPlayerExtensionsWrapperImpl(mMediaPlayerExtensions);
+                new MediaPlayerExtensionsWrapperImpl(mFakeMediaPlayerExtensions);
         wrapper.setSoundFieldAttributes(mediaPlayer, expectedRtAttr);
 
-        assertThat(
-                        ShadowMediaPlayerExtensions.extract(mMediaPlayerExtensions)
-                                .getSoundFieldAttributes()
-                                .getAmbisonicsOrder())
+        assertThat(mFakeMediaPlayerExtensions.getSoundFieldAttributes().getAmbisonicsOrder())
                 .isEqualTo(expectedAmbisonicOrder);
     }
 }
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MediaUtilsTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MediaUtilsTest.java
index 832d7ff..213e4b1 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MediaUtilsTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MediaUtilsTest.java
@@ -22,14 +22,13 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import androidx.xr.extensions.media.PointSourceAttributes;
+import androidx.xr.extensions.media.SoundFieldAttributes;
+import androidx.xr.extensions.media.SpatializerExtensions;
+import androidx.xr.extensions.node.Node;
 import androidx.xr.scenecore.JxrPlatformAdapter;
 import androidx.xr.scenecore.JxrPlatformAdapter.SpatializerConstants;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
-
-import com.android.extensions.xr.media.PointSourceAttributes;
-import com.android.extensions.xr.media.SoundFieldAttributes;
-import com.android.extensions.xr.media.SpatializerExtensions;
-import com.android.extensions.xr.node.Node;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -40,7 +39,7 @@
 
     @Test
     public void convertPointSourceAttributes_returnsExtensionsAttributes() {
-        Node expected = XrExtensionsProvider.getXrExtensions().createNode();
+        Node expected = new FakeXrExtensions().createNode();
 
         AndroidXrEntity entity = mock(AndroidXrEntity.class);
         when(entity.getNode()).thenReturn(expected);
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MovableComponentImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MovableComponentImplTest.java
index 0ea2d9b..31dfe14 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MovableComponentImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/MovableComponentImplTest.java
@@ -42,9 +42,12 @@
 
 import androidx.annotation.NonNull;
 import androidx.test.rule.GrantPermissionRule;
-import androidx.xr.extensions.node.NodeTypeConverter;
+import androidx.xr.extensions.node.Mat4f;
+import androidx.xr.extensions.node.Node;
+import androidx.xr.extensions.node.Quatf;
 import androidx.xr.extensions.node.ReformEvent;
 import androidx.xr.extensions.node.ReformOptions;
+import androidx.xr.extensions.node.Vec3;
 import androidx.xr.runtime.math.Matrix4;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Quaternion;
@@ -61,7 +64,6 @@
 import androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.PlaneSemantic;
 import androidx.xr.scenecore.JxrPlatformAdapter.PlaneType;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.impl.perception.Anchor;
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
 import androidx.xr.scenecore.impl.perception.Plane;
@@ -69,16 +71,10 @@
 import androidx.xr.scenecore.impl.perception.Session;
 import androidx.xr.scenecore.testing.FakeImpressApi;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
 import androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode;
-
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.Mat4f;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.NodeTransform;
-import com.android.extensions.xr.node.Quatf;
-import com.android.extensions.xr.node.ShadowNodeTransform;
-import com.android.extensions.xr.node.ShadowReformEvent;
-import com.android.extensions.xr.node.Vec3;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeNodeTransform;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeReformEvent;
 
 import com.google.androidxr.splitengine.SplitEngineSubspaceManager;
 import com.google.ar.imp.view.splitengine.ImpSplitEngineRenderer;
@@ -97,8 +93,6 @@
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.android.controller.ActivityController;
 
-import java.time.Duration;
-
 @RunWith(RobolectricTestRunner.class)
 public class MovableComponentImplTest {
     private final ActivityController<Activity> mActivityController =
@@ -106,7 +100,7 @@
     private final Activity mActivity = mActivityController.create().start().get();
     private final FakeScheduledExecutorService mFakeExecutor = new FakeScheduledExecutorService();
     private final PerceptionLibrary mPerceptionLibrary = mock(PerceptionLibrary.class);
-    private final XrExtensions mXrExtensions = XrExtensionsProvider.getXrExtensions();
+    private final FakeXrExtensions mFakeExtensions = new FakeXrExtensions();
     private final FakeImpressApi mFakeImpressApi = new FakeImpressApi();
     private final EntityManager mEntityManager = new EntityManager();
 
@@ -137,7 +131,7 @@
                 JxrPlatformAdapterAxr.create(
                         mActivity,
                         mFakeExecutor,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mFakeImpressApi,
                         mEntityManager,
                         mPerceptionLibrary,
@@ -148,10 +142,6 @@
         mActivitySpaceNode = mActivitySpaceImpl.getNode();
         mPerceptionSpaceActivityPose =
                 (PerceptionSpaceActivityPoseImpl) mFakeRuntime.getPerceptionSpaceActivityPose();
-        // TODO: b/377554103 - Remove delay once the subscription API are synced with the node
-        // creation.
-        mFakeExecutor.simulateSleepExecutingAllTasks(
-                Duration.ofMillis(SystemSpaceEntityImpl.SUBSCRIPTION_DELAY_MS));
     }
 
     @After
@@ -169,17 +159,17 @@
         Context displayContext = mActivity.createDisplayContext(display);
         View view = new View(displayContext);
         view.setLayoutParams(new LayoutParams(640, 480));
-        Node node = mXrExtensions.createNode();
+        Node node = mFakeExtensions.createNode();
 
         PanelEntityImpl panelEntity =
                 new PanelEntityImpl(
-                        displayContext,
                         node,
                         view,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mEntityManager,
                         new PixelDimensions(10, 10),
                         "panelShadow",
+                        displayContext,
                         mFakeExecutor);
         panelEntity.setParent(mActivitySpaceImpl);
         return panelEntity;
@@ -190,9 +180,9 @@
         Matrix4 scaleMatrix = Matrix4.fromScale(scale);
         Matrix4 scaledPoseMatrix = poseMatrix.times(scaleMatrix);
         Mat4f mat4f = new Mat4f(scaledPoseMatrix.getData());
-        NodeTransform nodeTransformEvent = ShadowNodeTransform.create(mat4f);
+        FakeNodeTransform nodeTransformEvent = new FakeNodeTransform(mat4f);
 
-        new FakeNode(mActivitySpaceNode).sendTransformEvent(nodeTransformEvent);
+        ((FakeNode) mActivitySpaceNode).sendTransformEvent(nodeTransformEvent);
         mFakeExecutor.runAll();
     }
 
@@ -213,7 +203,7 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -222,7 +212,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
 
         assertThat(node.getReformOptions().getEnabledReform()).isEqualTo(ReformOptions.ALLOW_MOVE);
         assertThat(node.getReformOptions().getFlags())
@@ -241,7 +231,7 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -250,7 +240,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
 
         assertThat(node.getReformOptions().getEnabledReform()).isEqualTo(ReformOptions.ALLOW_MOVE);
         assertThat(node.getReformOptions().getFlags())
@@ -269,7 +259,7 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -278,7 +268,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
 
         assertThat(node.getReformOptions().getEnabledReform()).isEqualTo(ReformOptions.ALLOW_MOVE);
         assertThat(node.getReformOptions().getFlags())
@@ -297,7 +287,7 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -306,7 +296,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
 
         assertThat(node.getReformOptions().getEnabledReform()).isEqualTo(ReformOptions.ALLOW_MOVE);
         assertThat(node.getReformOptions().getFlags())
@@ -326,7 +316,7 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -341,16 +331,12 @@
         entity.setPose(new Pose(new Vector3(1f, 1f, 1f), new Quaternion(0f, 0f, 0f, 1f)));
         entity.setScale(new Vector3(1f, 1f, 1f));
 
-        FakeNode node = new FakeNode(entity.getNode());
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE, /* state= */ 0, /* id= */ 0);
-        ShadowReformEvent shadowReformEvent = ShadowReformEvent.extract(realReformEvent);
-        shadowReformEvent.setProposedPosition(new Vec3(2f, 2f, 2f));
-        shadowReformEvent.setProposedOrientation(new Quatf(0.5f, 0.5f, 0.5f, 0.5f));
-        shadowReformEvent.setProposedScale(new Vec3(1.2f, 1.2f, 1.2f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeNode node = (FakeNode) entity.getNode();
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setProposedPosition(new Vec3(2f, 2f, 2f));
+        reformEvent.setProposedOrientation(new Quatf(0.5f, 0.5f, 0.5f, 0.5f));
+        reformEvent.setProposedScale(new Vec3(1.2f, 1.2f, 1.2f));
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -371,7 +357,7 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -384,16 +370,12 @@
         entity.setPose(new Pose(new Vector3(1f, 1f, 1f), new Quaternion(0f, 0f, 0f, 1f)));
         entity.setScale(new Vector3(1f, 1f, 1f));
 
-        FakeNode node = new FakeNode(entity.getNode());
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE, /* state= */ 0, /* id= */ 0);
-        ShadowReformEvent shadowReformEvent = ShadowReformEvent.extract(realReformEvent);
-        shadowReformEvent.setProposedPosition(new Vec3(2f, 2f, 2f));
-        shadowReformEvent.setProposedOrientation(new Quatf(0.5f, 0.5f, 0.5f, 0.5f));
-        shadowReformEvent.setProposedScale(new Vec3(1.2f, 1.2f, 1.2f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeNode node = (FakeNode) entity.getNode();
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setProposedPosition(new Vec3(2f, 2f, 2f));
+        reformEvent.setProposedOrientation(new Quatf(0.5f, 0.5f, 0.5f, 0.5f));
+        reformEvent.setProposedScale(new Vec3(1.2f, 1.2f, 1.2f));
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -414,7 +396,7 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -423,7 +405,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
 
         movableComponent.setSize(new Dimensions(2f, 2f, 2f));
         assertThat(node.getReformOptions().getCurrentSize().x).isEqualTo(2f);
@@ -441,14 +423,14 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
                         mEntityManager,
                         mPanelShadowRenderer,
                         mFakeExecutor);
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
 
         // Default value for scaleWithDistanceMode is DEFAULT.
         assertThat(movableComponent.getScaleWithDistanceMode())
@@ -468,14 +450,14 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
                         mEntityManager,
                         mPanelShadowRenderer,
                         mFakeExecutor);
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         assertThat(entity.addComponent(movableComponent)).isTrue();
 
         movableComponent.setScaleWithDistanceMode(MovableComponent.ScaleWithDistanceMode.DMM);
@@ -496,7 +478,7 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -509,7 +491,7 @@
         movableComponent.addMoveEventListener(directExecutor(), mockMoveEventListener);
         assertThat(movableComponent.mReformEventConsumer).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
 
         assertThat(node.getReformOptions().getCurrentSize().x).isEqualTo(2f);
         assertThat(node.getReformOptions().getCurrentSize().y).isEqualTo(2f);
@@ -533,7 +515,7 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -542,7 +524,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         MoveEventListener mockMoveEventListener = mock(MoveEventListener.class);
 
         movableComponent.addMoveEventListener(directExecutor(), mockMoveEventListener);
@@ -550,27 +532,19 @@
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
         assertThat(entity.mReformEventConsumerMap).isNotEmpty();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE, /* state= */ 0, /* id= */ 0);
-
-        final ReformEvent resizeReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_RESIZE);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(
-                        () -> node.getReformOptions().getEventCallback().accept(resizeReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         verify(mockMoveEventListener, never()).onMoveEvent(any());
 
-        realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE, /* state= */ 0, /* id= */ 0);
-
-        final ReformEvent moveReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(() -> node.getReformOptions().getEventCallback().accept(moveReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         ArgumentCaptor<MoveEvent> moveEventCaptor = ArgumentCaptor.forClass(MoveEvent.class);
@@ -590,7 +564,7 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -599,7 +573,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         MoveEventListener mockMoveEventListener = mock(MoveEventListener.class);
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -607,11 +581,8 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE, /* state= */ 0, /* id= */ 0);
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -632,7 +603,7 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -640,18 +611,15 @@
                         mPanelShadowRenderer,
                         mFakeExecutor);
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         MoveEventListener mockMoveEventListener1 = mock(MoveEventListener.class);
         MoveEventListener mockMoveEventListener2 = mock(MoveEventListener.class);
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
         movableComponent.addMoveEventListener(executorService, mockMoveEventListener1);
         movableComponent.addMoveEventListener(executorService, mockMoveEventListener2);
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE, /* state= */ 0, /* id= */ 0);
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -674,7 +642,7 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -682,18 +650,15 @@
                         mPanelShadowRenderer,
                         mFakeExecutor);
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         MoveEventListener mockMoveEventListener1 = mock(MoveEventListener.class);
         MoveEventListener mockMoveEventListener2 = mock(MoveEventListener.class);
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
         movableComponent.addMoveEventListener(executorService, mockMoveEventListener1);
         movableComponent.addMoveEventListener(executorService, mockMoveEventListener2);
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE, /* state= */ 0, /* id= */ 0);
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -728,7 +693,7 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -737,7 +702,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         MoveEventListener mockMoveEventListener = mock(MoveEventListener.class);
 
         movableComponent.addMoveEventListener(directExecutor(), mockMoveEventListener);
@@ -745,7 +710,13 @@
         assertThat(((AndroidXrEntity) entity).mReformEventConsumerMap).isNotEmpty();
 
         entity.removeComponent(movableComponent);
-        assertThat(node.getReformOptions()).isNull();
+        assertThat(node.getReformOptions().getEnabledReform() & ReformOptions.ALLOW_MOVE)
+                .isEqualTo(0);
+        assertThat(
+                        node.getReformOptions().getFlags()
+                                & (ReformOptions.FLAG_SCALE_WITH_DISTANCE
+                                        | ReformOptions.FLAG_ALLOW_SYSTEM_MOVEMENT))
+                .isEqualTo(0);
         assertThat(movableComponent.mReformEventConsumer).isNull();
         assertThat(((AndroidXrEntity) entity).mReformEventConsumerMap).isEmpty();
     }
@@ -761,7 +732,7 @@
                         /* anchorPlacement= */ ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -805,7 +776,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -814,7 +785,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -824,17 +795,13 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_ONGOING,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 1  above the origin. so it would need to move up 1 unit to
         // be on the plane.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1f, 1f, 1f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 1f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_ONGOING);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -894,7 +861,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -903,7 +870,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -913,17 +880,13 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_ONGOING,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 1  above the origin. so it would need to move up 1 unit to
         // be on the plane.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1f, 1f, 1f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 1f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_ONGOING);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -977,7 +940,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -986,7 +949,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -997,17 +960,13 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_ONGOING,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 1  above the origin. so it would need to move up 1 unit to
         // be on the plane.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1f, 1f, 1f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 1f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_ONGOING);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -1070,7 +1029,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -1079,7 +1038,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -1090,17 +1049,13 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_ONGOING,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 1  above the origin. so it would need to move up 1 unit to
         // be on the plane.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1f, 1f, 1f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 1f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_ONGOING);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -1156,7 +1111,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -1165,7 +1120,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -1176,17 +1131,13 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_ONGOING,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 1  above the origin. so it would need to move up 1 unit to
         // be on the plane. This needs to be divided by the scale of the activity space.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(.5f, .5f, .5f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(.5f, .5f, .5f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_ONGOING);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -1241,7 +1192,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -1250,7 +1201,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -1262,17 +1213,13 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 1  above the origin. so it would need to move up 1 unit to
         // be on the plane.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1f, 1f, 1f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 1f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -1332,7 +1279,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -1341,7 +1288,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -1353,20 +1300,15 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 2 + half the MIN_PLANE_ANCHOR_DISTANCE above the origin. So
         // it
         // would be right above the plane.
-        ShadowReformEvent.extract(realReformEvent)
-                .setProposedPosition(
-                        new Vec3(1f, 3f + MovableComponentImpl.MIN_PLANE_ANCHOR_DISTANCE / 2f, 1f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(
+                new Vec3(1f, 3f + MovableComponentImpl.MIN_PLANE_ANCHOR_DISTANCE / 2f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -1432,7 +1374,7 @@
                         anchorPlacementSet,
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -1441,7 +1383,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -1453,17 +1395,13 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 1  above the origin. so it would need to move up 1 unit to
         // be on the plane.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1f, 1f, 1f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 1f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -1525,7 +1463,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -1534,7 +1472,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -1546,17 +1484,13 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 1  above the origin. so it would need to move up 1 unit to
         // be on the plane. This needs to be divided by the scale of the activity space.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(.5f, .5f, .5f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(.5f, .5f, .5f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -1600,7 +1534,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -1609,7 +1543,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -1620,12 +1554,10 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE, /* state= */ 0, /* id= */ 0);
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1f, 1f, 1f));
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 1f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -1661,7 +1593,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -1670,7 +1602,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -1681,12 +1613,10 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE, /* state= */ 0, /* id= */ 0);
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1f, 1f, 1f));
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 1f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -1734,7 +1664,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -1743,7 +1673,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -1754,12 +1684,10 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE, /* state= */ 0, /* id= */ 0);
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1f, 1f, 1f));
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 1f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -1811,7 +1739,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -1820,7 +1748,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -1832,17 +1760,13 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 1  above the origin. so it would need to move up 1 unit to
         // be on the plane.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1f, 1f, 1f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 1f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -1866,21 +1790,14 @@
         assertThat(moveEventListener.mLastMoveEvent.updatedParent).isInstanceOf(AnchorEntity.class);
         assertThat(moveEventListener.mLastMoveEvent.updatedParent).isEqualTo(entity.getParent());
 
-        realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
-
         // Put the proposed position at 4 above the origin so it would be off the plane. It should
         // reset to the activity space pose and rotation.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1f, 4f, 1f));
-
-        final ReformEvent secondReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 4f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(
-                        () -> node.getReformOptions().getEventCallback().accept(secondReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         assertThat(executorService.hasNext()).isTrue();
@@ -1939,7 +1856,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -1948,7 +1865,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -1960,17 +1877,13 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 1  above the origin. so it would need to move up 1 unit to
         // be on the plane. This needs to be divided by the scale of the activity space.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(.5f, .5f, .5f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(.5f, .5f, .5f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -1997,21 +1910,14 @@
         assertThat(moveEventListener.mLastMoveEvent.updatedParent).isEqualTo(entity.getParent());
         assertVector3(entity.getWorldSpaceScale(), entityScale.times(activityScale));
 
-        realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
-
         // Put the proposed position at 4 above the activity space so it would be off the plane. It
         // should reset to the activity space pose and rotation.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1f, 4f, 1f));
-
-        final ReformEvent secondReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 4f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(
-                        () -> node.getReformOptions().getEventCallback().accept(secondReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         assertThat(executorService.hasNext()).isTrue();
@@ -2072,7 +1978,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -2081,7 +1987,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -2093,18 +1999,14 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 1 above the origin. It would need to move up 1 unit to be on
         // the
         // plane.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1.0f, 1.0f, 1.0f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 1f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -2128,21 +2030,14 @@
         assertThat(moveEventListener.mLastMoveEvent.updatedParent).isInstanceOf(AnchorEntity.class);
         assertThat(moveEventListener.mLastMoveEvent.updatedParent).isEqualTo(entity.getParent());
 
-        realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
-
         // Put the proposed position at 4 above the origin so it would be off the plane. It should
         // reset to the activity space pose and rotation.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1f, 4f, 1f));
-
-        final ReformEvent secondReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 4f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(
-                        () -> node.getReformOptions().getEventCallback().accept(secondReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         assertThat(executorService.hasNext()).isTrue();
@@ -2196,7 +2091,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ true,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -2205,7 +2100,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -2217,17 +2112,13 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 1  above the origin. so it would need to move up 1 unit to
         // be on the plane.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1.0f, 1.0f, 1.0f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 1f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -2253,21 +2144,14 @@
         // Cache the anchor entity.
         Entity anchorEntity = moveEventListener.mLastMoveEvent.updatedParent;
 
-        realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
-
         // Put the proposed position at 4 above the origin so it would be off the plane. It should
         // reset to the activity space pose and rotation.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1f, 4f, 1f));
-
-        final ReformEvent secondReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 4f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(
-                        () -> node.getReformOptions().getEventCallback().accept(secondReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         assertThat(executorService.hasNext()).isTrue();
@@ -2325,7 +2209,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ true,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -2334,7 +2218,7 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
         TestMoveEventListener moveEventListener = new TestMoveEventListener();
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -2346,17 +2230,13 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 1  above the origin. so it would need to move up 1 unit to
         // be on the plane.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1.0f, 1.0f, 1.0f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 1f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -2385,20 +2265,14 @@
         Entity child = createTestEntity();
         anchorEntity.addChild(child);
 
-        realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
-
         // Put the proposed position at 4 above the origin so it would be off the plane. It should
         // reset to the activity space pose and rotation.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1.0f, 4.0f, 1.0f));
-        final ReformEvent secondReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 4f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(
-                        () -> node.getReformOptions().getEventCallback().accept(secondReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         assertThat(executorService.hasNext()).isTrue();
@@ -2452,7 +2326,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -2461,19 +2335,15 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_ONGOING,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 1 above the origin. so it would need to move up 1 unit to
         // be on the plane.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1.0f, 1.0f, 1.0f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 1f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_ONGOING);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -2519,7 +2389,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -2528,18 +2398,14 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_ONGOING,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Put the proposed position at 5 above the origin. so it is far away from the plane.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1.0f, 5.0f, 1.0f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 5f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_ONGOING);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
@@ -2581,7 +2447,7 @@
                         createAnyAnchorPlacement(),
                         /* shouldDisposeParentAnchor= */ false,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -2590,18 +2456,14 @@
                         mFakeExecutor);
         assertThat(movableComponent).isNotNull();
         assertThat(entity.addComponent(movableComponent)).isTrue();
-        FakeNode node = new FakeNode(((AndroidXrEntity) entity).getNode());
+        FakeNode node = (FakeNode) ((AndroidXrEntity) entity).getNode();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
+        FakeReformEvent reformEvent = new FakeReformEvent();
 
         // Set the reform state to end so that the plane shadow gets destroyed.
-        ShadowReformEvent.extract(realReformEvent).setProposedPosition(new Vec3(1.0f, 1.0f, 1.0f));
-
-        final ReformEvent reformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setProposedPosition(new Vec3(1f, 1f, 1f));
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
                 .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/OpenXrActivityPoseTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/OpenXrActivityPoseTest.java
index d6cfb33..de44d6d7 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/OpenXrActivityPoseTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/OpenXrActivityPoseTest.java
@@ -22,24 +22,20 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import android.app.Activity;
-
 import androidx.xr.runtime.math.Matrix4;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Quaternion;
 import androidx.xr.runtime.math.Vector3;
 import androidx.xr.scenecore.JxrPlatformAdapter.CameraViewActivityPose;
 import androidx.xr.scenecore.common.BaseActivityPose;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.impl.perception.Fov;
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
 import androidx.xr.scenecore.impl.perception.Session;
 import androidx.xr.scenecore.impl.perception.ViewProjection;
 import androidx.xr.scenecore.impl.perception.ViewProjections;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
-
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.asset.FakeGltfModelToken;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeGltfModelToken;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -47,7 +43,6 @@
 import org.robolectric.ParameterizedRobolectricTestRunner;
 import org.robolectric.ParameterizedRobolectricTestRunner.Parameter;
 import org.robolectric.ParameterizedRobolectricTestRunner.Parameters;
-import org.robolectric.Robolectric;
 
 import java.util.Arrays;
 import java.util.List;
@@ -56,19 +51,17 @@
 @RunWith(ParameterizedRobolectricTestRunner.class)
 public final class OpenXrActivityPoseTest {
     private final AndroidXrEntity mActivitySpaceRoot = mock(AndroidXrEntity.class);
-    private final XrExtensions mXrExtensions = XrExtensionsProvider.getXrExtensions();
+    private final FakeXrExtensions mFakeExtensions = new FakeXrExtensions();
     private final PerceptionLibrary mPerceptionLibrary = mock(PerceptionLibrary.class);
     private final Session mSession = mock(Session.class);
     private final FakeScheduledExecutorService mExecutor = new FakeScheduledExecutorService();
     private final EntityManager mEntityManager = new EntityManager();
-    private final Activity mActivity =
-            Robolectric.buildActivity(Activity.class).create().start().get();
     private final ActivitySpaceImpl mActivitySpace =
             new ActivitySpaceImpl(
-                    mXrExtensions.createNode(),
-                    mXrExtensions,
+                    mFakeExtensions.createNode(),
+                    mFakeExtensions,
                     mEntityManager,
-                    () -> mXrExtensions.getSpatialState(mActivity),
+                    () -> mFakeExtensions.fakeSpatialState,
                     mExecutor);
 
     enum OpenXrActivityPoseType {
@@ -159,7 +152,8 @@
     private GltfEntityImpl createGltfEntity() {
         FakeGltfModelToken modelToken = new FakeGltfModelToken("model");
         GltfModelResourceImpl model = new GltfModelResourceImpl(modelToken);
-        return new GltfEntityImpl(model, mActivitySpace, mXrExtensions, mEntityManager, mExecutor);
+        return new GltfEntityImpl(
+                model, mActivitySpace, mFakeExtensions, mEntityManager, mExecutor);
     }
 
     @Test
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/PanelEntityImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/PanelEntityImplTest.java
index 7bc82a6..348c330 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/PanelEntityImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/PanelEntityImplTest.java
@@ -31,18 +31,16 @@
 import android.view.View;
 import android.view.ViewGroup.LayoutParams;
 
+import androidx.xr.extensions.node.Node;
 import androidx.xr.scenecore.JxrPlatformAdapter.Dimensions;
 import androidx.xr.scenecore.JxrPlatformAdapter.PixelDimensions;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
 import androidx.xr.scenecore.impl.perception.Session;
 import androidx.xr.scenecore.testing.FakeImpressApi;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
 import androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.Node;
-
 import com.google.androidxr.splitengine.SplitEngineSubspaceManager;
 import com.google.ar.imp.view.splitengine.ImpSplitEngineRenderer;
 
@@ -59,7 +57,7 @@
 public class PanelEntityImplTest {
     private static final Dimensions kVgaResolutionPx = new Dimensions(640f, 480f, 0f);
     private static final Dimensions kHdResolutionPx = new Dimensions(1280f, 720f, 0f);
-    private final XrExtensions mXrExtensions = XrExtensionsProvider.getXrExtensions();
+    private final FakeXrExtensions mFakeExtensions = new FakeXrExtensions();
     FakeImpressApi mFakeImpressApi = new FakeImpressApi();
     private final ActivityController<Activity> mActivityController =
             Robolectric.buildActivity(Activity.class);
@@ -83,7 +81,7 @@
                 JxrPlatformAdapterAxr.create(
                         mActivity,
                         mMakeFakeExecutor,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mFakeImpressApi,
                         new EntityManager(),
                         mPerceptionLibrary,
@@ -103,18 +101,18 @@
         Context displayContext = mActivity.createDisplayContext(display);
         View view = new View(displayContext);
         view.setLayoutParams(new LayoutParams(640, 480));
-        Node node = mXrExtensions.createNode();
+        Node node = mFakeExtensions.createNode();
 
         PanelEntityImpl panelEntity =
                 new PanelEntityImpl(
-                        displayContext,
                         node,
                         view,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mEntityManager,
                         new PixelDimensions(
                                 (int) surfaceDimensionsPx.width, (int) surfaceDimensionsPx.height),
                         "panel",
+                        displayContext,
                         mMakeFakeExecutor);
 
         // TODO(b/352829122): introduce a TestRootEntity which can serve as a parent
@@ -163,8 +161,8 @@
         assertThat(panelEntity.getSize().height).isEqualTo(480f);
         assertThat(panelEntity.getSize().depth).isEqualTo(0f);
 
-        assertThat(panelEntity.getSizeInPixels().width).isEqualTo(640);
-        assertThat(panelEntity.getSizeInPixels().height).isEqualTo(480);
+        assertThat(panelEntity.getPixelDimensions().width).isEqualTo(640);
+        assertThat(panelEntity.getPixelDimensions().height).isEqualTo(480);
     }
 
     @Test
@@ -174,7 +172,7 @@
         // The (FakeXrExtensions) test default pixel density is 1 pixel per meter.
         // Validate that the corner radius is set to 32dp.
         assertThat(panelEntity.getCornerRadius()).isEqualTo(32.0f);
-        FakeNode fakeNode = new FakeNode(panelEntity.getNode());
+        FakeNode fakeNode = (FakeNode) panelEntity.getNode();
         assertThat(fakeNode.getCornerRadius()).isEqualTo(32.0f);
     }
 
@@ -185,7 +183,7 @@
         // The (FakeXrExtensions) test default pixel density is 1 pixel per meter.
         // Validate that the corner radius is set to 32dp.
         assertThat(panelEntity.getCornerRadius()).isEqualTo(20f);
-        FakeNode fakeNode = new FakeNode(panelEntity.getNode());
+        FakeNode fakeNode = (FakeNode) panelEntity.getNode();
         assertThat(fakeNode.getCornerRadius()).isEqualTo(20f);
     }
 
@@ -196,7 +194,7 @@
         // The (FakeXrExtensions) test default pixel density is 1 pixel per meter.
         // Validate that the corner radius is set to 32dp.
         assertThat(panelEntity.getCornerRadius()).isEqualTo(20f);
-        FakeNode fakeNode = new FakeNode(panelEntity.getNode());
+        FakeNode fakeNode = (FakeNode) panelEntity.getNode();
         assertThat(fakeNode.getCornerRadius()).isEqualTo(20f);
     }
 }
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/PerceptionSpaceActivityPoseImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/PerceptionSpaceActivityPoseImplTest.java
index b80f290..95d3e56 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/PerceptionSpaceActivityPoseImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/PerceptionSpaceActivityPoseImplTest.java
@@ -19,68 +19,56 @@
 import static androidx.xr.runtime.testing.math.MathAssertions.assertPose;
 import static androidx.xr.runtime.testing.math.MathAssertions.assertVector3;
 
-import android.app.Activity;
-
+import androidx.xr.extensions.node.Mat4f;
 import androidx.xr.runtime.math.Matrix4;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Quaternion;
 import androidx.xr.runtime.math.Vector3;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeGltfModelToken;
 import androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode;
-
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.asset.FakeGltfModelToken;
-import com.android.extensions.xr.node.Mat4f;
-import com.android.extensions.xr.node.ShadowNodeTransform;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeNodeTransform;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mockito;
-import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 
-import java.time.Duration;
-
 @RunWith(RobolectricTestRunner.class)
 public final class PerceptionSpaceActivityPoseImplTest {
 
     private final AndroidXrEntity mActivitySpaceRoot = Mockito.mock(AndroidXrEntity.class);
-    private final XrExtensions mXrExtensions = XrExtensionsProvider.getXrExtensions();
+    private final FakeXrExtensions mFakeExtensions = new FakeXrExtensions();
     private final FakeScheduledExecutorService mExecutor = new FakeScheduledExecutorService();
     private final EntityManager mEntityManager = new EntityManager();
-    private final Activity mActivity =
-            Robolectric.buildActivity(Activity.class).create().start().get();
     private final ActivitySpaceImpl mActivitySpace =
             new ActivitySpaceImpl(
-                    mXrExtensions.createNode(),
-                    mXrExtensions,
+                    mFakeExtensions.createNode(),
+                    mFakeExtensions,
                     mEntityManager,
-                    () -> mXrExtensions.getSpatialState(mActivity),
+                    () -> mFakeExtensions.fakeSpatialState,
                     mExecutor);
 
     private PerceptionSpaceActivityPoseImpl mPerceptionSpaceActivityPose;
 
     private FakeNode getActivitySpaceNode() {
-        return new FakeNode(mActivitySpace.getNode());
+        return (FakeNode) mActivitySpace.getNode();
     }
 
     /** Creates a generic glTF entity. */
     private GltfEntityImpl createGltfEntity() {
         FakeGltfModelToken modelToken = new FakeGltfModelToken("model");
         GltfModelResourceImpl model = new GltfModelResourceImpl(modelToken);
-        return new GltfEntityImpl(model, mActivitySpace, mXrExtensions, mEntityManager, mExecutor);
+        return new GltfEntityImpl(
+                model, mActivitySpace, mFakeExtensions, mEntityManager, mExecutor);
     }
 
     @Before
     public void setUp() {
         mPerceptionSpaceActivityPose =
                 new PerceptionSpaceActivityPoseImpl(mActivitySpace, mActivitySpaceRoot);
-        // TODO: b/377554103 - Remove delay once the subscription API are synced with the node
-        // creation.
-        mExecutor.simulateSleepExecutingAllTasks(
-                Duration.ofMillis(SystemSpaceEntityImpl.SUBSCRIPTION_DELAY_MS));
     }
 
     @Test
@@ -92,7 +80,7 @@
                         new Vector3(1.0f, 1.0f, 1.0f));
         getActivitySpaceNode()
                 .sendTransformEvent(
-                        ShadowNodeTransform.create(new Mat4f(activitySpaceMatrix.getData())));
+                        new FakeNodeTransform(new Mat4f(activitySpaceMatrix.getData())));
         mExecutor.runAll();
 
         Pose poseInActivitySpace = mPerceptionSpaceActivityPose.getPoseInActivitySpace();
@@ -110,7 +98,7 @@
                         new Vector3(1.0f, 1.0f, 1.0f));
         getActivitySpaceNode()
                 .sendTransformEvent(
-                        ShadowNodeTransform.create(new Mat4f(activitySpaceMatrix.getData())));
+                        new FakeNodeTransform(new Mat4f(activitySpaceMatrix.getData())));
         mExecutor.runAll();
 
         Pose transformedPose =
@@ -129,7 +117,7 @@
                         new Vector3(1.0f, 1.0f, 1.0f));
         getActivitySpaceNode()
                 .sendTransformEvent(
-                        ShadowNodeTransform.create(new Mat4f(activitySpaceMatrix.getData())));
+                        new FakeNodeTransform(new Mat4f(activitySpaceMatrix.getData())));
         mExecutor.runAll();
         GltfEntityImpl gltfEntity = createGltfEntity();
         gltfEntity.setScale(new Vector3(2.0f, 2.0f, 2.0f));
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/PointerCaptureComponentImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/PointerCaptureComponentImplTest.java
index ee9b1a7..cabaef6 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/PointerCaptureComponentImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/PointerCaptureComponentImplTest.java
@@ -16,30 +16,23 @@
 
 package androidx.xr.scenecore.impl;
 
-import static com.android.extensions.xr.node.InputEvent.ACTION_MOVE;
-import static com.android.extensions.xr.node.InputEvent.DISPATCH_FLAG_NONE;
-import static com.android.extensions.xr.node.InputEvent.POINTER_TYPE_DEFAULT;
-import static com.android.extensions.xr.node.InputEvent.SOURCE_UNKNOWN;
-
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
 
 import androidx.annotation.NonNull;
+import androidx.xr.extensions.node.InputEvent;
+import androidx.xr.extensions.node.Node;
+import androidx.xr.extensions.node.Vec3;
 import androidx.xr.scenecore.JxrPlatformAdapter;
 import androidx.xr.scenecore.JxrPlatformAdapter.Entity;
 import androidx.xr.scenecore.JxrPlatformAdapter.InputEventListener;
 import androidx.xr.scenecore.JxrPlatformAdapter.PointerCaptureComponent;
 import androidx.xr.scenecore.JxrPlatformAdapter.PointerCaptureComponent.StateListener;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeInputEvent;
 import androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode;
 
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.InputEvent;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.ShadowInputEvent;
-import com.android.extensions.xr.node.Vec3;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -70,13 +63,12 @@
 
     private final FakeInputEventListener mInputListener = new FakeInputEventListener();
 
-    private final XrExtensions mXrExtensions = XrExtensionsProvider.getXrExtensions();
+    private final FakeXrExtensions mFakeExtensions = new FakeXrExtensions();
     private final FakeScheduledExecutorService mFakeScheduler = new FakeScheduledExecutorService();
-    private final Node mNode = mXrExtensions.createNode();
-    private final FakeNode mFakeNode = new FakeNode(mNode);
+    private final FakeNode mFakeNode = (FakeNode) mFakeExtensions.createNode();
 
     private final Entity mEntity =
-            new AndroidXrEntity(mNode, mXrExtensions, new EntityManager(), mFakeScheduler) {};
+            new AndroidXrEntity(mFakeNode, mFakeExtensions, new EntityManager(), mFakeScheduler) {};
 
     @Test
     public void onAttach_enablesPointerCapture() {
@@ -94,15 +86,10 @@
                 new PointerCaptureComponentImpl(directExecutor(), mStateListener, mInputListener);
         assertThat(component.onAttach(mEntity)).isTrue();
 
-        InputEvent fakeInput =
-                ShadowInputEvent.create(
-                        SOURCE_UNKNOWN,
-                        POINTER_TYPE_DEFAULT,
-                        /* timestamp= */ 0,
-                        /* origin= */ new Vec3(0, 0, 0),
-                        /* direction= */ new Vec3(1, 1, 1),
-                        InputEvent.DISPATCH_FLAG_CAPTURED_POINTER,
-                        ACTION_MOVE);
+        FakeInputEvent fakeInput = new FakeInputEvent();
+        fakeInput.setDispatchFlags(InputEvent.DISPATCH_FLAG_CAPTURED_POINTER);
+        fakeInput.setOrigin(new Vec3(0, 0, 0));
+        fakeInput.setDirection(new Vec3(1, 1, 1));
         mFakeNode.sendInputEvent(fakeInput);
         mFakeScheduler.runAll();
 
@@ -118,25 +105,16 @@
                 new PointerCaptureComponentImpl(directExecutor(), mStateListener, mInputListener);
         assertThat(component.onAttach(mEntity)).isTrue();
 
-        InputEvent fakeCapturedInput =
-                ShadowInputEvent.create(
-                        SOURCE_UNKNOWN,
-                        POINTER_TYPE_DEFAULT,
-                        /* timestamp= */ 100,
-                        /* origin= */ new Vec3(0, 0, 0),
-                        /* direction= */ new Vec3(1, 1, 1),
-                        InputEvent.DISPATCH_FLAG_CAPTURED_POINTER,
-                        ACTION_MOVE);
+        FakeInputEvent fakeCapturedInput = new FakeInputEvent();
+        fakeCapturedInput.setDispatchFlags(InputEvent.DISPATCH_FLAG_CAPTURED_POINTER);
+        fakeCapturedInput.setTimestamp(100);
+        fakeCapturedInput.setOrigin(new Vec3(0, 0, 0));
+        fakeCapturedInput.setDirection(new Vec3(1, 1, 1));
 
-        InputEvent fakeInput =
-                ShadowInputEvent.create(
-                        SOURCE_UNKNOWN,
-                        POINTER_TYPE_DEFAULT,
-                        /* timestamp= */ 200,
-                        /* origin= */ new Vec3(0, 0, 0),
-                        /* direction= */ new Vec3(1, 1, 1),
-                        DISPATCH_FLAG_NONE,
-                        ACTION_MOVE);
+        FakeInputEvent fakeInput = new FakeInputEvent();
+        fakeInput.setTimestamp(200);
+        fakeInput.setOrigin(new Vec3(0, 0, 0));
+        fakeInput.setDirection(new Vec3(1, 1, 1));
 
         mFakeNode.sendInputEvent(fakeCapturedInput);
         mFakeNode.sendInputEvent(fakeInput);
@@ -155,15 +133,11 @@
                         propagationExecutor, mStateListener, mInputListener);
         assertThat(component.onAttach(mEntity)).isTrue();
 
-        InputEvent fakeCapturedInput =
-                ShadowInputEvent.create(
-                        SOURCE_UNKNOWN,
-                        POINTER_TYPE_DEFAULT,
-                        /* timestamp= */ 100,
-                        /* origin= */ new Vec3(0, 0, 0),
-                        /* direction= */ new Vec3(1, 1, 1),
-                        InputEvent.DISPATCH_FLAG_CAPTURED_POINTER,
-                        ACTION_MOVE);
+        FakeInputEvent fakeCapturedInput = new FakeInputEvent();
+        fakeCapturedInput.setDispatchFlags(InputEvent.DISPATCH_FLAG_CAPTURED_POINTER);
+        fakeCapturedInput.setTimestamp(100);
+        fakeCapturedInput.setOrigin(new Vec3(0, 0, 0));
+        fakeCapturedInput.setDirection(new Vec3(1, 1, 1));
 
         mFakeNode.sendInputEvent(fakeCapturedInput);
 
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/ResizableComponentImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/ResizableComponentImplTest.java
index e57e7f5..e8107d9 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/ResizableComponentImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/ResizableComponentImplTest.java
@@ -31,9 +31,10 @@
 
 import android.app.Activity;
 
-import androidx.xr.extensions.node.NodeTypeConverter;
+import androidx.xr.extensions.node.Node;
 import androidx.xr.extensions.node.ReformEvent;
 import androidx.xr.extensions.node.ReformOptions;
+import androidx.xr.extensions.node.Vec3;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.scenecore.JxrPlatformAdapter;
 import androidx.xr.scenecore.JxrPlatformAdapter.Dimensions;
@@ -41,17 +42,13 @@
 import androidx.xr.scenecore.JxrPlatformAdapter.MoveEventListener;
 import androidx.xr.scenecore.JxrPlatformAdapter.ResizeEvent;
 import androidx.xr.scenecore.JxrPlatformAdapter.ResizeEventListener;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.impl.perception.PerceptionLibrary;
 import androidx.xr.scenecore.impl.perception.Session;
 import androidx.xr.scenecore.testing.FakeImpressApi;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
 import androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode;
-
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.ShadowReformEvent;
-import com.android.extensions.xr.node.Vec3;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeReformEvent;
 
 import com.google.androidxr.splitengine.SplitEngineSubspaceManager;
 import com.google.ar.imp.view.splitengine.ImpSplitEngineRenderer;
@@ -76,16 +73,16 @@
     private final Activity mActivity = mActivityController.create().start().get();
     private final FakeScheduledExecutorService mFakeExecutor = new FakeScheduledExecutorService();
     private final PerceptionLibrary mPerceptionLibrary = mock(PerceptionLibrary.class);
-    private final XrExtensions mXrExtensions = XrExtensionsProvider.getXrExtensions();
+    private final FakeXrExtensions mFakeExtensions = new FakeXrExtensions();
     private final FakeImpressApi mFakeImpressApiImpl = new FakeImpressApi();
     private final EntityManager mEntityManager = new EntityManager();
-    private final Node mActivitySpaceNode = mXrExtensions.createNode();
+    private final Node mActivitySpaceNode = mFakeExtensions.createNode();
     private final ActivitySpaceImpl mActivitySpaceImpl =
             new ActivitySpaceImpl(
                     mActivitySpaceNode,
-                    mXrExtensions,
+                    mFakeExtensions,
                     mEntityManager,
-                    () -> mXrExtensions.getSpatialState(mActivity),
+                    () -> mFakeExtensions.fakeSpatialState,
                     mFakeExecutor);
     private final AndroidXrEntity mActivitySpaceRoot = Mockito.mock(AndroidXrEntity.class);
     private final PerceptionSpaceActivityPoseImpl mPerceptionSpaceActivityPose =
@@ -107,7 +104,7 @@
                 JxrPlatformAdapterAxr.create(
                         mActivity,
                         mFakeExecutor,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mFakeImpressApiImpl,
                         mEntityManager,
                         mPerceptionLibrary,
@@ -132,7 +129,7 @@
         Entity entity2 = createTestEntity();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
         assertThat(entity1.addComponent(resizableComponent)).isTrue();
         assertThat(entity2.addComponent(resizableComponent)).isFalse();
@@ -144,12 +141,12 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
 
         assertThat(entity.addComponent(resizableComponent)).isTrue();
 
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         assertThat(node.getReformOptions().getEnabledReform())
                 .isEqualTo(ReformOptions.ALLOW_RESIZE);
         assertThat(node.getReformOptions().getMinimumSize().x).isEqualTo(kMinDimensions.width);
@@ -166,11 +163,11 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
 
         assertThat(entity.addComponent(resizableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
 
         resizableComponent.setSize(kMaxDimensions);
         assertThat(node.getReformOptions().getCurrentSize().x).isEqualTo(kMaxDimensions.width);
@@ -184,11 +181,11 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
 
         assertThat(entity.addComponent(resizableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
 
         resizableComponent.setMinimumSize(kMaxDimensions);
         assertThat(node.getReformOptions().getMinimumSize().x).isEqualTo(kMaxDimensions.width);
@@ -202,11 +199,11 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
 
         assertThat(entity.addComponent(resizableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
 
         resizableComponent.setMaximumSize(kMinDimensions);
         assertThat(node.getReformOptions().getMaximumSize().x).isEqualTo(kMinDimensions.width);
@@ -220,11 +217,11 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
 
         assertThat(entity.addComponent(resizableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
 
         resizableComponent.setFixedAspectRatio(2.0f);
         assertThat(node.getReformOptions().getFixedAspectRatio()).isEqualTo(2.0f);
@@ -241,11 +238,11 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
 
         assertThat(entity.addComponent(resizableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
 
         resizableComponent.setForceShowResizeOverlay(true);
         assertThat(node.getReformOptions().getForceShowResizeOverlay()).isTrue();
@@ -257,7 +254,7 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
         Dimensions testSize = new Dimensions(1f, 1f, 1f);
         Dimensions testMinSize = new Dimensions(0.25f, 0.25f, 0.25f);
@@ -268,7 +265,7 @@
 
         assertThat(entity.addComponent(resizableComponent)).isTrue();
 
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         assertThat(node.getReformOptions().getEnabledReform())
                 .isEqualTo(ReformOptions.ALLOW_RESIZE);
         assertThat(node.getReformOptions().getCurrentSize().x).isEqualTo(testSize.width);
@@ -288,10 +285,10 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
         assertThat(entity.addComponent(resizableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         ResizeEventListener mockResizeEventListener = mock(ResizeEventListener.class);
 
         resizableComponent.addResizeEventListener(directExecutor(), mockResizeEventListener);
@@ -299,26 +296,19 @@
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
         assertThat(entity.mReformEventConsumerMap).isNotEmpty();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE, /* state= */ 0, /* id= */ 0);
-
-        final ReformEvent moveReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(() -> node.getReformOptions().getEventCallback().accept(moveReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         verify(mockResizeEventListener, never()).onResizeEvent(any());
 
-        realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE, /* state= */ 0, /* id= */ 0);
-        final ReformEvent resizeReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setType(ReformEvent.REFORM_TYPE_RESIZE);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(
-                        () -> node.getReformOptions().getEventCallback().accept(resizeReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         verify(mockResizeEventListener).onResizeEvent(any());
@@ -330,10 +320,10 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
         assertThat(entity.addComponent(resizableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         ResizeEventListener mockResizeEventListener = mock(ResizeEventListener.class);
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
 
@@ -341,15 +331,11 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE, /* state= */ 0, /* id= */ 0);
-
-        final ReformEvent resizeReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_RESIZE);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(
-                        () -> node.getReformOptions().getEventCallback().accept(resizeReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         assertThat(executorService.hasNext()).isTrue();
@@ -363,10 +349,10 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
         assertThat(entity.addComponent(resizableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         ResizeEventListener mockResizeEventListener1 = mock(ResizeEventListener.class);
         ResizeEventListener mockResizeEventListener2 = mock(ResizeEventListener.class);
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
@@ -376,15 +362,11 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE, /* state= */ 0, /* id= */ 0);
-
-        final ReformEvent resizeReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_RESIZE);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(
-                        () -> node.getReformOptions().getEventCallback().accept(resizeReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         assertThat(executorService.hasNext()).isTrue();
@@ -399,10 +381,10 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
         assertThat(entity.addComponent(resizableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         ResizeEventListener mockResizeEventListener1 = mock(ResizeEventListener.class);
         ResizeEventListener mockResizeEventListener2 = mock(ResizeEventListener.class);
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
@@ -412,15 +394,11 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE, /* state= */ 0, /* id= */ 0);
-
-        final ReformEvent resizeReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_RESIZE);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(
-                        () -> node.getReformOptions().getEventCallback().accept(resizeReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         assertThat(executorService.hasNext()).isTrue();
@@ -429,8 +407,7 @@
         resizableComponent.removeResizeEventListener(mockResizeEventListener1);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(
-                        () -> node.getReformOptions().getEventCallback().accept(resizeReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         assertThat(executorService.hasNext()).isTrue();
@@ -445,10 +422,10 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
         assertThat(entity.addComponent(resizableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         ResizeEventListener mockResizeEventListener1 = mock(ResizeEventListener.class);
         ResizeEventListener mockResizeEventListener2 = mock(ResizeEventListener.class);
         FakeScheduledExecutorService executorService = new FakeScheduledExecutorService();
@@ -458,15 +435,11 @@
         assertThat(node.getReformOptions().getEventCallback()).isNotNull();
         assertThat(node.getReformOptions().getEventExecutor()).isNotNull();
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE, /* state= */ 0, /* id= */ 0);
-
-        final ReformEvent resizeReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_RESIZE);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(
-                        () -> node.getReformOptions().getEventCallback().accept(resizeReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         assertThat(executorService.hasNext()).isTrue();
@@ -486,17 +459,18 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
         assertThat(entity.addComponent(resizableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         ResizeEventListener mockResizeEventListener = mock(ResizeEventListener.class);
 
         resizableComponent.addResizeEventListener(directExecutor(), mockResizeEventListener);
         assertThat(resizableComponent.mReformEventConsumer).isNotNull();
 
         entity.removeComponent(resizableComponent);
-        assertThat(node.getReformOptions()).isNull();
+        assertThat(node.getReformOptions().getEnabledReform() & ReformOptions.ALLOW_RESIZE)
+                .isEqualTo(0);
         assertThat(entity.mReformEventConsumerMap).isEmpty();
     }
 
@@ -511,7 +485,7 @@
                         ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ true,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -521,12 +495,12 @@
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
                         mFakeExecutor,
-                        mXrExtensions,
+                        mFakeExtensions,
                         new Dimensions(0f, 0f, 0f),
                         new Dimensions(5f, 5f, 5f));
         assertThat(entity.addComponent(movableComponent)).isTrue();
         assertThat(entity.addComponent(resizableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         assertThat(node.getReformOptions().getEnabledReform())
                 .isEqualTo(ReformOptions.ALLOW_MOVE | ReformOptions.ALLOW_RESIZE);
     }
@@ -542,7 +516,7 @@
                         ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ true,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -552,7 +526,7 @@
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
                         mFakeExecutor,
-                        mXrExtensions,
+                        mFakeExtensions,
                         new Dimensions(0f, 0f, 0f),
                         new Dimensions(5f, 5f, 5f));
         assertThat(entity.addComponent(movableComponent)).isTrue();
@@ -561,7 +535,7 @@
         movableComponent.addMoveEventListener(directExecutor(), moveEventListener);
         ResizeEventListener resizeEventListener = mock(ResizeEventListener.class);
         resizableComponent.addResizeEventListener(directExecutor(), resizeEventListener);
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         assertThat(node.getReformOptions().getEnabledReform())
                 .isEqualTo(ReformOptions.ALLOW_MOVE | ReformOptions.ALLOW_RESIZE);
 
@@ -569,27 +543,19 @@
         assertThat(node.getReformOptions().getEnabledReform())
                 .isEqualTo(ReformOptions.ALLOW_RESIZE);
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE, /* state= */ 0, /* id= */ 0);
-
-        final ReformEvent resizeReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_RESIZE);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(
-                        () -> node.getReformOptions().getEventCallback().accept(resizeReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         verify(resizeEventListener).onResizeEvent(any());
 
-        realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE, /* state= */ 0, /* id= */ 0);
-
-        final ReformEvent moveReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(() -> node.getReformOptions().getEventCallback().accept(moveReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         verify(moveEventListener, never()).onMoveEvent(any());
@@ -606,7 +572,7 @@
                         ImmutableSet.of(),
                         /* shouldDisposeParentAnchor= */ true,
                         mPerceptionLibrary,
-                        mXrExtensions,
+                        mFakeExtensions,
                         mActivitySpaceImpl,
                         mActivitySpaceRoot,
                         mPerceptionSpaceActivityPose,
@@ -616,7 +582,7 @@
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
                         mFakeExecutor,
-                        mXrExtensions,
+                        mFakeExtensions,
                         new Dimensions(0f, 0f, 0f),
                         new Dimensions(5f, 5f, 5f));
         assertThat(entity.addComponent(movableComponent)).isTrue();
@@ -625,34 +591,26 @@
         movableComponent.addMoveEventListener(directExecutor(), moveEventListener);
         ResizeEventListener resizeEventListener = mock(ResizeEventListener.class);
         resizableComponent.addResizeEventListener(directExecutor(), resizeEventListener);
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         assertThat(node.getReformOptions().getEnabledReform())
                 .isEqualTo(ReformOptions.ALLOW_MOVE | ReformOptions.ALLOW_RESIZE);
 
         entity.removeComponent(resizableComponent);
         assertThat(node.getReformOptions().getEnabledReform()).isEqualTo(ReformOptions.ALLOW_MOVE);
 
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_MOVE, /* state= */ 0, /* id= */ 0);
-
-        final ReformEvent moveReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_MOVE);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(() -> node.getReformOptions().getEventCallback().accept(moveReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         verify(moveEventListener).onMoveEvent(any());
 
-        realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE, /* state= */ 0, /* id= */ 0);
-
-        final ReformEvent resizeReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setType(ReformEvent.REFORM_TYPE_RESIZE);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(
-                        () -> node.getReformOptions().getEventCallback().accept(resizeReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         verify(resizeEventListener, never()).onResizeEvent(any());
@@ -664,7 +622,7 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
         assertThat(entity.addComponent(resizableComponent)).isTrue();
         entity.removeComponent(resizableComponent);
@@ -677,12 +635,12 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
         assertThat(entity.addComponent(resizableComponent)).isTrue();
         entity.setAlpha(0.9f);
         assertThat(entity.getAlpha()).isEqualTo(0.9f);
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         ResizeEventListener mockResizeEventListener = mock(ResizeEventListener.class);
 
         resizableComponent.addResizeEventListener(directExecutor(), mockResizeEventListener);
@@ -691,16 +649,12 @@
         assertThat(entity.mReformEventConsumerMap).isNotEmpty();
 
         // Start the resize.
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE,
-                        /* state= */ ReformEvent.REFORM_STATE_START,
-                        /* id= */ 0);
-
-        final ReformEvent startReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_RESIZE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_START);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(() -> node.getReformOptions().getEventCallback().accept(startReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         ArgumentCaptor<ResizeEvent> resizeEventCaptor = ArgumentCaptor.forClass(ResizeEvent.class);
@@ -710,16 +664,10 @@
         assertThat(node.getAlpha()).isEqualTo(0.0f);
 
         // End the resize.
-        realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
-
-        final ReformEvent endReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(() -> node.getReformOptions().getEventCallback().accept(endReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         verify(mockResizeEventListener, times(2)).onResizeEvent(resizeEventCaptor.capture());
@@ -734,12 +682,12 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
         assertThat(entity.addComponent(resizableComponent)).isTrue();
         entity.setAlpha(0.9f);
         assertThat(entity.getAlpha()).isEqualTo(0.9f);
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         ResizeEventListener mockResizeEventListener = mock(ResizeEventListener.class);
 
         resizableComponent.setAutoHideContent(false);
@@ -749,16 +697,12 @@
         assertThat(entity.mReformEventConsumerMap).isNotEmpty();
 
         // Start the resize.
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE,
-                        /* state= */ ReformEvent.REFORM_STATE_START,
-                        /* id= */ 0);
-
-        final ReformEvent startReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_RESIZE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_START);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(() -> node.getReformOptions().getEventCallback().accept(startReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         ArgumentCaptor<ResizeEvent> resizeEventCaptor = ArgumentCaptor.forClass(ResizeEvent.class);
@@ -768,16 +712,10 @@
         assertThat(node.getAlpha()).isEqualTo(0.9f);
 
         // End the resize.
-        realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
-
-        final ReformEvent endReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(() -> node.getReformOptions().getEventCallback().accept(endReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         verify(mockResizeEventListener, times(2)).onResizeEvent(resizeEventCaptor.capture());
@@ -792,10 +730,10 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
         assertThat(entity.addComponent(resizableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         resizableComponent.setSize(new Dimensions(1.0f, 2.0f, 3.0f));
         assertThat(node.getReformOptions().getCurrentSize().x).isEqualTo(1.0f);
         assertThat(node.getReformOptions().getCurrentSize().y).isEqualTo(2.0f);
@@ -808,16 +746,12 @@
         assertThat(entity.mReformEventConsumerMap).isNotEmpty();
 
         // Start the resize.
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE,
-                        /* state= */ ReformEvent.REFORM_STATE_START,
-                        /* id= */ 0);
-
-        final ReformEvent startReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_RESIZE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_START);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(() -> node.getReformOptions().getEventCallback().accept(startReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         ArgumentCaptor<ResizeEvent> resizeEventCaptor = ArgumentCaptor.forClass(ResizeEvent.class);
@@ -826,17 +760,11 @@
         assertThat(resizeEvent.resizeState).isEqualTo(ResizeEvent.RESIZE_STATE_START);
 
         // End the resize.
-        realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
-        ShadowReformEvent.extract(realReformEvent).setProposedSize(new Vec3(4.0f, 5.0f, 6.0f));
-
-        final ReformEvent endReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
+        reformEvent.setProposedSize(new Vec3(4.0f, 5.0f, 6.0f));
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(() -> node.getReformOptions().getEventCallback().accept(endReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         verify(mockResizeEventListener, times(2)).onResizeEvent(resizeEventCaptor.capture());
@@ -854,10 +782,10 @@
         assertThat(entity).isNotNull();
         ResizableComponentImpl resizableComponent =
                 new ResizableComponentImpl(
-                        mFakeExecutor, mXrExtensions, kMinDimensions, kMaxDimensions);
+                        mFakeExecutor, mFakeExtensions, kMinDimensions, kMaxDimensions);
         assertThat(resizableComponent).isNotNull();
         assertThat(entity.addComponent(resizableComponent)).isTrue();
-        FakeNode node = new FakeNode(entity.getNode());
+        FakeNode node = (FakeNode) entity.getNode();
         resizableComponent.setAutoUpdateSize(false);
         resizableComponent.setSize(new Dimensions(1.0f, 2.0f, 3.0f));
         assertThat(node.getReformOptions().getCurrentSize().x).isEqualTo(1.0f);
@@ -871,16 +799,12 @@
         assertThat(entity.mReformEventConsumerMap).isNotEmpty();
 
         // Start the resize.
-        com.android.extensions.xr.node.ReformEvent realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE,
-                        /* state= */ ReformEvent.REFORM_STATE_START,
-                        /* id= */ 0);
-
-        final ReformEvent startReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        FakeReformEvent reformEvent = new FakeReformEvent();
+        reformEvent.setType(ReformEvent.REFORM_TYPE_RESIZE);
+        reformEvent.setState(ReformEvent.REFORM_STATE_START);
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(() -> node.getReformOptions().getEventCallback().accept(startReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         ArgumentCaptor<ResizeEvent> resizeEventCaptor = ArgumentCaptor.forClass(ResizeEvent.class);
@@ -889,17 +813,11 @@
         assertThat(resizeEvent.resizeState).isEqualTo(ResizeEvent.RESIZE_STATE_START);
 
         // End the resize.
-        realReformEvent =
-                ShadowReformEvent.create(
-                        /* type= */ ReformEvent.REFORM_TYPE_RESIZE,
-                        /* state= */ ReformEvent.REFORM_STATE_END,
-                        /* id= */ 0);
-        ShadowReformEvent.extract(realReformEvent).setProposedSize(new Vec3(4.0f, 5.0f, 6.0f));
-
-        final ReformEvent endReformEvent = NodeTypeConverter.toLibrary(realReformEvent);
+        reformEvent.setState(ReformEvent.REFORM_STATE_END);
+        reformEvent.setProposedSize(new Vec3(4.0f, 5.0f, 6.0f));
         node.getReformOptions()
                 .getEventExecutor()
-                .execute(() -> node.getReformOptions().getEventCallback().accept(endReformEvent));
+                .execute(() -> node.getReformOptions().getEventCallback().accept(reformEvent));
         assertThat(mFakeExecutor.hasNext()).isTrue();
         mFakeExecutor.runAll();
         verify(mockResizeEventListener, times(2)).onResizeEvent(resizeEventCaptor.capture());
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/RuntimeUtilsTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/RuntimeUtilsTest.java
index ed4b94f..c8d8f88 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/RuntimeUtilsTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/RuntimeUtilsTest.java
@@ -24,6 +24,10 @@
 
 import android.util.Log;
 
+import androidx.xr.extensions.environment.EnvironmentVisibilityState;
+import androidx.xr.extensions.environment.PassthroughVisibilityState;
+import androidx.xr.extensions.node.Mat4f;
+import androidx.xr.extensions.node.ReformEvent;
 import androidx.xr.runtime.math.Matrix4;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Quaternion;
@@ -34,13 +38,7 @@
 import androidx.xr.scenecore.JxrPlatformAdapter.ResizeEvent;
 import androidx.xr.scenecore.JxrPlatformAdapter.SpatialCapabilities;
 import androidx.xr.scenecore.impl.perception.Plane;
-
-import com.android.extensions.xr.environment.EnvironmentVisibilityState;
-import com.android.extensions.xr.environment.PassthroughVisibilityState;
-import com.android.extensions.xr.environment.ShadowPassthroughVisibilityState;
-import com.android.extensions.xr.node.Mat4f;
-import com.android.extensions.xr.node.ReformEvent;
-import com.android.extensions.xr.space.ShadowSpatialCapabilities;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakePassthroughVisibilityState;
 
 import org.junit.Rule;
 import org.junit.Test;
@@ -175,10 +173,27 @@
         assertThat(RuntimeUtils.poseToPerceptionPose(pose)).isEqualTo(expectedPerceptionPose);
     }
 
+    private static final int CAPS_ALL = -1;
+    private static final int CAPS_NONE = -2;
+
+    private androidx.xr.extensions.space.SpatialCapabilities getCapabilities(int... caps) {
+        return new androidx.xr.extensions.space.SpatialCapabilities() {
+            @Override
+            public boolean get(int capQuery) {
+                for (int cap : caps) {
+                    if (cap == CAPS_ALL || cap == capQuery) {
+                        return true;
+                    }
+                }
+                return false;
+            }
+        };
+    }
+
     @Test
     public void convertSpatialCapabilities_noCapabilities() {
-        com.android.extensions.xr.space.SpatialCapabilities extensionCapabilities =
-                ShadowSpatialCapabilities.create();
+        androidx.xr.extensions.space.SpatialCapabilities extensionCapabilities =
+                getCapabilities(CAPS_NONE);
         SpatialCapabilities caps = RuntimeUtils.convertSpatialCapabilities(extensionCapabilities);
         assertThat(caps.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_UI)).isFalse();
         assertThat(caps.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT)).isFalse();
@@ -194,8 +209,8 @@
 
     @Test
     public void convertSpatialCapabilities_allCapabilities() {
-        com.android.extensions.xr.space.SpatialCapabilities extensionCapabilities =
-                ShadowSpatialCapabilities.createAll();
+        androidx.xr.extensions.space.SpatialCapabilities extensionCapabilities =
+                getCapabilities(CAPS_ALL);
         SpatialCapabilities caps = RuntimeUtils.convertSpatialCapabilities(extensionCapabilities);
         assertThat(caps.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_UI)).isTrue();
         assertThat(caps.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT)).isTrue();
@@ -213,8 +228,8 @@
     public void convertSpatialCapabilities_singleCapability() {
         // check conversions of a few different instances of the extensions SpatialCapabilities that
         // each have exactly one capability.
-        com.android.extensions.xr.space.SpatialCapabilities extensionCapabilities =
-                ShadowSpatialCapabilities.create(
+        androidx.xr.extensions.space.SpatialCapabilities extensionCapabilities =
+                getCapabilities(
                         androidx.xr.extensions.space.SpatialCapabilities.SPATIAL_UI_CAPABLE);
         SpatialCapabilities caps = RuntimeUtils.convertSpatialCapabilities(extensionCapabilities);
         assertThat(caps.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_UI)).isTrue();
@@ -229,7 +244,7 @@
                 .isFalse();
 
         extensionCapabilities =
-                ShadowSpatialCapabilities.create(
+                getCapabilities(
                         androidx.xr.extensions.space.SpatialCapabilities
                                 .SPATIAL_3D_CONTENTS_CAPABLE);
         caps = RuntimeUtils.convertSpatialCapabilities(extensionCapabilities);
@@ -245,7 +260,7 @@
                 .isFalse();
 
         extensionCapabilities =
-                ShadowSpatialCapabilities.create(
+                getCapabilities(
                         androidx.xr.extensions.space.SpatialCapabilities.SPATIAL_AUDIO_CAPABLE);
         caps = RuntimeUtils.convertSpatialCapabilities(extensionCapabilities);
         assertThat(caps.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_UI)).isFalse();
@@ -263,8 +278,8 @@
     @Test
     public void convertSpatialCapabilities_mixedCapabilities() {
         // Check conversions for a couple of different combinations of capabilities.
-        com.android.extensions.xr.space.SpatialCapabilities extensionCapabilities =
-                ShadowSpatialCapabilities.create(
+        androidx.xr.extensions.space.SpatialCapabilities extensionCapabilities =
+                getCapabilities(
                         androidx.xr.extensions.space.SpatialCapabilities.SPATIAL_AUDIO_CAPABLE,
                         androidx.xr.extensions.space.SpatialCapabilities
                                 .SPATIAL_3D_CONTENTS_CAPABLE);
@@ -282,7 +297,7 @@
 
         extensionCapabilities =
                 extensionCapabilities =
-                        ShadowSpatialCapabilities.create(
+                        getCapabilities(
                                 androidx.xr.extensions.space.SpatialCapabilities.SPATIAL_UI_CAPABLE,
                                 androidx.xr.extensions.space.SpatialCapabilities
                                         .PASSTHROUGH_CONTROL_CAPABLE,
@@ -324,42 +339,41 @@
     @Test
     public void getPassthroughOpacity_returnsZeroFromDisabledExtensionState() {
         PassthroughVisibilityState passthroughVisibilityState =
-                ShadowPassthroughVisibilityState.create(PassthroughVisibilityState.DISABLED, 0.0f);
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.DISABLED, 0.0f);
         assertThat(RuntimeUtils.getPassthroughOpacity(passthroughVisibilityState)).isEqualTo(0.0f);
 
         passthroughVisibilityState =
-                ShadowPassthroughVisibilityState.create(PassthroughVisibilityState.DISABLED, 1.0f);
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.DISABLED, 1.0f);
         assertThat(RuntimeUtils.getPassthroughOpacity(passthroughVisibilityState)).isEqualTo(0.0f);
     }
 
     @Test
     public void getPassthroughOpacity_convertsValidValuesFromExtensionState() {
         PassthroughVisibilityState passthroughVisibilityState =
-                ShadowPassthroughVisibilityState.create(PassthroughVisibilityState.HOME, 0.5f);
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.HOME, 0.5f);
         assertThat(RuntimeUtils.getPassthroughOpacity(passthroughVisibilityState)).isEqualTo(0.5f);
 
         passthroughVisibilityState =
-                ShadowPassthroughVisibilityState.create(PassthroughVisibilityState.APP, 0.75f);
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.APP, 0.75f);
         assertThat(RuntimeUtils.getPassthroughOpacity(passthroughVisibilityState)).isEqualTo(0.75f);
 
         passthroughVisibilityState =
-                ShadowPassthroughVisibilityState.create(PassthroughVisibilityState.SYSTEM, 1.0f);
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.SYSTEM, 1.0f);
         assertThat(RuntimeUtils.getPassthroughOpacity(passthroughVisibilityState)).isEqualTo(1.0f);
     }
 
     @Test
     public void getPassthroughOpacity_convertsInvalidValuesFromExtensionStateToOneAndLogsError() {
         PassthroughVisibilityState passthroughVisibilityState =
-                ShadowPassthroughVisibilityState.create(PassthroughVisibilityState.HOME, 0.0f);
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.HOME, 0.0f);
         assertThat(RuntimeUtils.getPassthroughOpacity(passthroughVisibilityState)).isEqualTo(1.0f);
 
         passthroughVisibilityState =
-                ShadowPassthroughVisibilityState.create(
-                        PassthroughVisibilityState.APP, -0.0000001f);
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.APP, -0.0000001f);
         assertThat(RuntimeUtils.getPassthroughOpacity(passthroughVisibilityState)).isEqualTo(1.0f);
 
         passthroughVisibilityState =
-                ShadowPassthroughVisibilityState.create(PassthroughVisibilityState.SYSTEM, -1.0f);
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.SYSTEM, -1.0f);
         assertThat(RuntimeUtils.getPassthroughOpacity(passthroughVisibilityState)).isEqualTo(1.0f);
 
         expectedLogMessagesRule.expectLogMessagePattern(
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/SoundPoolExtensionsWrapperImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/SoundPoolExtensionsWrapperImplTest.java
index a1801b6..c382ee6 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/SoundPoolExtensionsWrapperImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/SoundPoolExtensionsWrapperImplTest.java
@@ -23,16 +23,13 @@
 
 import android.media.SoundPool;
 
+import androidx.xr.extensions.node.Node;
 import androidx.xr.scenecore.JxrPlatformAdapter;
 import androidx.xr.scenecore.JxrPlatformAdapter.SoundPoolExtensionsWrapper;
 import androidx.xr.scenecore.JxrPlatformAdapter.SpatializerConstants;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
-
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.media.ShadowSoundPoolExtensions;
-import com.android.extensions.xr.media.SoundPoolExtensions;
-import com.android.extensions.xr.media.XrSpatialAudioExtensions;
-import com.android.extensions.xr.node.Node;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeSoundPoolExtensions;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeSpatialAudioExtensions;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -48,22 +45,22 @@
     private static final int TEST_LOOP = 0;
     private static final float TEST_RATE = 0F;
 
-    XrExtensions mXrExtensions;
-    XrSpatialAudioExtensions mSpatialAudioExtensions;
-    SoundPoolExtensions mSoundPoolExtensions;
+    FakeXrExtensions mFakeXrExtensions;
+    FakeSpatialAudioExtensions mFakeSpatialAudioExtensions;
+    FakeSoundPoolExtensions mFakeSoundPoolExtensions;
 
     @Before
     public void setUp() {
-        mXrExtensions = XrExtensionsProvider.getXrExtensions();
-        mSpatialAudioExtensions = mXrExtensions.getXrSpatialAudioExtensions();
-        mSoundPoolExtensions = mSpatialAudioExtensions.getSoundPoolExtensions();
+        mFakeXrExtensions = new FakeXrExtensions();
+        mFakeSpatialAudioExtensions = mFakeXrExtensions.fakeSpatialAudioExtensions;
+        mFakeSoundPoolExtensions = mFakeSpatialAudioExtensions.soundPoolExtensions;
     }
 
     @Test
     public void playWithPointSource_callsExtensionsPlayWithPointSource() {
         int expected = 123;
 
-        Node fakeNode = mXrExtensions.createNode();
+        Node fakeNode = new FakeXrExtensions().createNode();
         AndroidXrEntity entity = mock(AndroidXrEntity.class);
         when(entity.getNode()).thenReturn(fakeNode);
         JxrPlatformAdapter.PointSourceAttributes rtAttributes =
@@ -71,10 +68,9 @@
 
         SoundPool soundPool = new SoundPool.Builder().build();
 
-        ShadowSoundPoolExtensions.extract(mSoundPoolExtensions)
-                .setPlayAsPointSourceResult(expected);
+        mFakeSoundPoolExtensions.setPlayAsPointSourceResult(expected);
         SoundPoolExtensionsWrapper wrapper =
-                new SoundPoolExtensionsWrapperImpl(mSoundPoolExtensions);
+                new SoundPoolExtensionsWrapperImpl(mFakeSoundPoolExtensions);
         int actual =
                 wrapper.play(
                         soundPool,
@@ -94,9 +90,9 @@
 
         SoundPool soundPool = new SoundPool.Builder().build();
 
-        ShadowSoundPoolExtensions.extract(mSoundPoolExtensions).setPlayAsSoundFieldResult(expected);
+        mFakeSoundPoolExtensions.setPlayAsSoundFieldResult(expected);
         SoundPoolExtensionsWrapper wrapper =
-                new SoundPoolExtensionsWrapperImpl(mSoundPoolExtensions);
+                new SoundPoolExtensionsWrapperImpl(mFakeSoundPoolExtensions);
         JxrPlatformAdapter.SoundFieldAttributes attributes =
                 new JxrPlatformAdapter.SoundFieldAttributes(
                         JxrPlatformAdapter.SpatializerConstants.AMBISONICS_ORDER_THIRD_ORDER);
@@ -119,9 +115,9 @@
         int expected = SpatializerConstants.SOURCE_TYPE_SOUND_FIELD;
         SoundPool soundPool = new SoundPool.Builder().build();
 
-        ShadowSoundPoolExtensions.extract(mSoundPoolExtensions).setSourceType(expected);
+        mFakeSoundPoolExtensions.setSourceType(expected);
         SoundPoolExtensionsWrapper wrapper =
-                new SoundPoolExtensionsWrapperImpl(mSoundPoolExtensions);
+                new SoundPoolExtensionsWrapperImpl(mFakeSoundPoolExtensions);
         int actualSourceType = wrapper.getSpatialSourceType(soundPool, /* streamId= */ 0);
         assertThat(actualSourceType).isEqualTo(SpatializerConstants.SOURCE_TYPE_SOUND_FIELD);
     }
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/SpatialEnvironmentImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/SpatialEnvironmentImplTest.java
index 8188032..2090d27 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/SpatialEnvironmentImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/SpatialEnvironmentImplTest.java
@@ -18,7 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.junit.Assert.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyString;
@@ -31,27 +30,18 @@
 
 import androidx.xr.extensions.environment.EnvironmentVisibilityState;
 import androidx.xr.extensions.environment.PassthroughVisibilityState;
+import androidx.xr.extensions.space.SpatialState;
 import androidx.xr.scenecore.JxrPlatformAdapter.ExrImageResource;
-import androidx.xr.scenecore.JxrPlatformAdapter.MaterialResource;
 import androidx.xr.scenecore.JxrPlatformAdapter.SpatialEnvironment.SetPassthroughOpacityPreferenceResult;
 import androidx.xr.scenecore.JxrPlatformAdapter.SpatialEnvironment.SetSpatialEnvironmentPreferenceResult;
 import androidx.xr.scenecore.JxrPlatformAdapter.SpatialEnvironment.SpatialEnvironmentPreference;
-import androidx.xr.scenecore.impl.extensions.XrExtensionsProvider;
 import androidx.xr.scenecore.testing.FakeImpressApi;
-import androidx.xr.scenecore.testing.FakeImpressApi.MaterialData;
-
-import com.android.extensions.xr.ShadowXrExtensions;
-import com.android.extensions.xr.XrExtensions;
-import com.android.extensions.xr.asset.EnvironmentToken;
-import com.android.extensions.xr.asset.FakeEnvironmentToken;
-import com.android.extensions.xr.asset.GltfModelToken;
-import com.android.extensions.xr.environment.ShadowEnvironmentVisibilityState;
-import com.android.extensions.xr.environment.ShadowPassthroughVisibilityState;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.NodeRepository;
-import com.android.extensions.xr.space.ShadowSpatialCapabilities;
-import com.android.extensions.xr.space.ShadowSpatialState;
-import com.android.extensions.xr.space.SpatialState;
+import androidx.xr.scenecore.testing.FakeXrExtensions;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeEnvironmentToken;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeEnvironmentVisibilityState;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakePassthroughVisibilityState;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeSpatialState;
 
 import com.google.androidxr.splitengine.SplitEngineSubspaceManager;
 import com.google.androidxr.splitengine.SubspaceNode;
@@ -67,7 +57,6 @@
 import org.robolectric.android.controller.ActivityController;
 
 import java.util.List;
-import java.util.Map;
 import java.util.function.Consumer;
 
 // Technically this doesn't need to be a Robolectric test, since it doesn't directly depend on
@@ -82,20 +71,15 @@
 @SuppressWarnings({"deprecation", "UnnecessarilyFullyQualified"}) // TODO(b/373435470): Remove
 public final class SpatialEnvironmentImplTest {
     private static final int SUBSPACE_ID = 5;
-    private static final int INVALID_SPLIT_ENGINE_ID = -1;
-    private static final long WATER_MATERIAL_ID = 1;
     private final FakeImpressApi mFakeImpressApi = new FakeImpressApi();
     private ActivityController<Activity> mActivityController;
     private Activity mActivity;
-    private XrExtensions mXrExtensions = null;
-    private Node mSubspaceNode;
+    private FakeXrExtensions mFakeExtensions = null;
+    private FakeNode mSubspaceNode;
     private SubspaceNode mExpectedSubspace;
     private SpatialEnvironmentImpl mEnvironment = null;
     private SplitEngineSubspaceManager mSplitEngineSubspaceManager;
-    private NodeRepository mNodeRepository = NodeRepository.getInstance();
-    EnvironmentToken mNullSkyboxToken =
-            new FakeEnvironmentToken(
-                    /* url= */ "nullSkyboxToken", /* textureWidth= */ 1, /* textureHeight= */ 1);
+    FakeEnvironmentToken mNullSkyboxToken = new FakeEnvironmentToken("nullSkyboxToken");
     ListenableFuture<ExrImageResource> mNullSkyboxResourceFuture =
             Futures.immediateFuture(new ExrImageResourceImpl(mNullSkyboxToken));
 
@@ -104,9 +88,9 @@
         mActivityController = Robolectric.buildActivity(Activity.class);
         mActivity = mActivityController.create().start().get();
         // Reset our state.
-        mXrExtensions = XrExtensionsProvider.getXrExtensions();
-        Node sceneRootNode = mXrExtensions.createNode();
-        mSubspaceNode = mXrExtensions.createNode();
+        mFakeExtensions = new FakeXrExtensions();
+        FakeNode fakeSceneRootNode = (FakeNode) mFakeExtensions.createNode();
+        mSubspaceNode = (FakeNode) mFakeExtensions.createNode();
         mExpectedSubspace = new SubspaceNode(SUBSPACE_ID, mSubspaceNode);
 
         mSplitEngineSubspaceManager = Mockito.mock(SplitEngineSubspaceManager.class);
@@ -114,22 +98,16 @@
         mEnvironment =
                 new SpatialEnvironmentImpl(
                         mActivity,
-                        mXrExtensions,
-                        sceneRootNode,
+                        mFakeExtensions,
+                        fakeSceneRootNode,
                         this::getSpatialState,
+                        mNullSkyboxResourceFuture,
                         /* useSplitEngine= */ false);
         mEnvironment.onSplitEngineReady(mSplitEngineSubspaceManager, mFakeImpressApi);
-        try {
-            mEnvironment.onNullSkyboxResourceReady(mNullSkyboxResourceFuture.get());
-        } catch (Exception e) {
-            if (e instanceof InterruptedException) {
-                Thread.currentThread().interrupt();
-            }
-        }
     }
 
     private void setupSplitEngineEnvironmentImpl() {
-        Node sceneRootNode = mXrExtensions.createNode();
+        FakeNode fakeSceneRootNode = (FakeNode) mFakeExtensions.createNode();
 
         when(mSplitEngineSubspaceManager.createSubspace(anyString(), anyInt()))
                 .thenReturn(mExpectedSubspace);
@@ -137,24 +115,18 @@
         mEnvironment =
                 new SpatialEnvironmentImpl(
                         mActivity,
-                        mXrExtensions,
-                        sceneRootNode,
+                        mFakeExtensions,
+                        fakeSceneRootNode,
                         this::getSpatialState,
+                        mNullSkyboxResourceFuture,
                         /* useSplitEngine= */ true);
         mEnvironment.onSplitEngineReady(mSplitEngineSubspaceManager, mFakeImpressApi);
-        try {
-            mEnvironment.onNullSkyboxResourceReady(mNullSkyboxResourceFuture.get());
-        } catch (Exception e) {
-            if (e instanceof InterruptedException) {
-                Thread.currentThread().interrupt();
-            }
-        }
     }
 
     @SuppressWarnings({"FutureReturnValueIgnored", "AndroidJdkLibsChecker"})
-    private EnvironmentToken fakeLoadEnvironment(String name) {
+    private androidx.xr.extensions.asset.EnvironmentToken fakeLoadEnvironment(String name) {
         try {
-            return mXrExtensions.loadEnvironment(null, 0, 0, name).get();
+            return mFakeExtensions.loadEnvironment(null, 0, 0, name).get();
         } catch (Exception e) {
             if (e instanceof InterruptedException) {
                 Thread.currentThread().interrupt();
@@ -164,21 +136,9 @@
     }
 
     @SuppressWarnings({"FutureReturnValueIgnored", "AndroidJdkLibsChecker"})
-    private long fakeLoadEnvironmentSplitEngine(String name) {
+    private androidx.xr.extensions.asset.GltfModelToken fakeLoadGltfModel(String name) {
         try {
-            return mFakeImpressApi.loadImageBasedLightingAsset(name).get();
-        } catch (Exception e) {
-            if (e instanceof InterruptedException) {
-                Thread.currentThread().interrupt();
-            }
-            return INVALID_SPLIT_ENGINE_ID;
-        }
-    }
-
-    @SuppressWarnings({"FutureReturnValueIgnored", "AndroidJdkLibsChecker"})
-    private GltfModelToken fakeLoadGltfModel(String name) {
-        try {
-            return mXrExtensions.loadGltfModel(null, 0, 0, name).get();
+            return mFakeExtensions.loadGltfModel(null, 0, 0, name).get();
         } catch (Exception e) {
             if (e instanceof InterruptedException) {
                 Thread.currentThread().interrupt();
@@ -195,25 +155,12 @@
             if (e instanceof InterruptedException) {
                 Thread.currentThread().interrupt();
             }
-            return INVALID_SPLIT_ENGINE_ID;
-        }
-    }
-
-    @SuppressWarnings({"FutureReturnValueIgnored", "AndroidJdkLibsChecker"})
-    private MaterialResource fakeLoadMaterialSplitEngine(boolean isAlphaMapVersion) {
-        try {
-            return new MaterialResourceImpl(
-                    mFakeImpressApi.createWaterMaterial(isAlphaMapVersion).get().getNativeHandle());
-        } catch (Exception e) {
-            if (e instanceof InterruptedException) {
-                Thread.currentThread().interrupt();
-            }
-            return null;
+            return -1;
         }
     }
 
     private SpatialState getSpatialState() {
-        return mXrExtensions.getSpatialState(mActivity);
+        return mFakeExtensions.fakeSpatialState;
     }
 
     @Test
@@ -249,14 +196,11 @@
     public void setPassthroughOpacityPreference_returnsAccordingToSpatialCapabilities() {
         // Change should be applied if the spatial capabilities allow it, otherwise should be
         // pending.
-        SpatialState state = mXrExtensions.getSpatialState(mActivity);
-        ShadowSpatialState.extract(state)
-                .setSpatialCapabilities(ShadowSpatialCapabilities.createAll());
+        mFakeExtensions.fakeSpatialState.setAllSpatialCapabilities(true);
         assertThat(mEnvironment.setPassthroughOpacityPreference(0.5f))
                 .isEqualTo(SetPassthroughOpacityPreferenceResult.CHANGE_APPLIED);
 
-        ShadowSpatialState.extract(state)
-                .setSpatialCapabilities(ShadowSpatialCapabilities.create());
+        mFakeExtensions.fakeSpatialState.setAllSpatialCapabilities(false);
         assertThat(mEnvironment.setPassthroughOpacityPreference(0.6f))
                 .isEqualTo(SetPassthroughOpacityPreferenceResult.CHANGE_PENDING);
     }
@@ -296,68 +240,51 @@
 
     @Test
     public void setSpatialEnvironmentPreference_returnsAppliedWhenCapable() {
-        setupSplitEngineEnvironmentImpl();
         // Change should be applied if the spatial capabilities allow it, otherwise should be
         // pending.
-        SpatialState state = mXrExtensions.getSpatialState(mActivity);
-        ShadowSpatialState.extract(state)
-                .setSpatialCapabilities(ShadowSpatialCapabilities.createAll());
+        mFakeExtensions.fakeSpatialState.setAllSpatialCapabilities(true);
         SpatialEnvironmentPreference preference = mock(SpatialEnvironmentPreference.class);
         assertThat(mEnvironment.setSpatialEnvironmentPreference(preference))
                 .isEqualTo(SetSpatialEnvironmentPreferenceResult.CHANGE_APPLIED);
 
-        ShadowSpatialState.extract(state)
-                .setSpatialCapabilities(ShadowSpatialCapabilities.create());
+        mFakeExtensions.fakeSpatialState.setAllSpatialCapabilities(false);
         preference = mock(SpatialEnvironmentPreference.class);
         assertThat(mEnvironment.setSpatialEnvironmentPreference(preference))
                 .isEqualTo(SetSpatialEnvironmentPreferenceResult.CHANGE_PENDING);
     }
 
-    private Node getNodeWithEnvironmentToken(EnvironmentToken token) {
-        return mNodeRepository.findNode(
-                (NodeRepository.NodeMetadata metadata) ->
-                        token.equals(metadata.getEnvironmentToken()));
-    }
-
-    private Node getNodeWithGltfToken(GltfModelToken token) {
-        return mNodeRepository.findNode(
-                (NodeRepository.NodeMetadata metadata) ->
-                        token.equals(metadata.getGltfModelToken()));
-    }
-
     @Test
     public void setSpatialEnvironmentPreferenceNull_removesEnvironment() {
-        EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
-        GltfModelToken gltf = fakeLoadGltfModel("fakeGltfModel");
+        androidx.xr.extensions.asset.EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
+        androidx.xr.extensions.asset.GltfModelToken gltf = fakeLoadGltfModel("fakeGltfModel");
 
         // Ensure that an environment is set.
         mEnvironment.setSpatialEnvironmentPreference(
                 new SpatialEnvironmentPreference(
                         new ExrImageResourceImpl(exr), new GltfModelResourceImpl(gltf)));
 
-        Node skyboxNode = getNodeWithEnvironmentToken(exr);
-        Node geometryNode = getNodeWithGltfToken(gltf);
+        FakeNode skyboxNode = mFakeExtensions.testGetNodeWithEnvironmentToken(exr);
+        FakeNode geometryNode = mFakeExtensions.testGetNodeWithGltfToken(gltf);
 
         assertThat(skyboxNode).isNotNull();
         assertThat(geometryNode).isNotNull();
 
-        assertThat(mNodeRepository.getParent(skyboxNode)).isNotNull();
-        assertThat(mNodeRepository.getParent(geometryNode)).isNotNull();
+        assertThat(skyboxNode.getParent()).isNotNull();
+        assertThat(geometryNode.getParent()).isNotNull();
 
         // Ensure environment is removed
         mEnvironment.setSpatialEnvironmentPreference(null);
 
-        assertThat(mNodeRepository.getParent(skyboxNode)).isNull();
-        assertThat(mNodeRepository.getParent(geometryNode)).isNull();
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getEnvironmentNode(mActivity))
-                .isNull();
+        assertThat(skyboxNode.getParent()).isNull();
+        assertThat(geometryNode.getParent()).isNull();
+        assertThat(mFakeExtensions.getFakeEnvironmentNode()).isNull();
     }
 
     @Test
-    public void setSpatialEnvironmentPreferenceNullWithGeometrySplitEngine_removesEnvironment() {
+    public void setSpatialEnvironmentPreferenceNullWithSplitEngine_removesEnvironment() {
         setupSplitEngineEnvironmentImpl();
 
-        EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
+        androidx.xr.extensions.asset.EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
         long gltf = fakeLoadGltfModelSplitEngine("fakeGltfModel");
 
         // Ensure that an environment is set.
@@ -365,101 +292,60 @@
                 new SpatialEnvironmentPreference(
                         new ExrImageResourceImpl(exr), new GltfModelResourceImplSplitEngine(gltf)));
 
-        Node skyboxNode = getNodeWithEnvironmentToken(exr);
+        FakeNode skyboxNode = mFakeExtensions.testGetNodeWithEnvironmentToken(exr);
         List<Integer> geometryNodes = mFakeImpressApi.getImpressNodesForToken(gltf);
-        Map<Long, MaterialData> materials = mFakeImpressApi.getMaterials();
-        int animatingNodes = mFakeImpressApi.impressNodeAnimatingSize();
-        int loopingAnimatingNodes = mFakeImpressApi.impressNodeLoopAnimatingSize();
 
         assertThat(skyboxNode).isNotNull();
         assertThat(geometryNodes).isNotEmpty();
-        assertThat(materials).isEmpty();
-        assertThat(animatingNodes).isEqualTo(0);
-        assertThat(loopingAnimatingNodes).isEqualTo(0);
 
-        assertThat(mNodeRepository.getParent(skyboxNode)).isNotNull();
+        assertThat(skyboxNode.getParent()).isNotNull();
         assertThat(mFakeImpressApi.impressNodeHasParent(geometryNodes.get(0))).isTrue();
 
         // Ensure environment is removed
         mEnvironment.setSpatialEnvironmentPreference(null);
 
-        assertThat(mNodeRepository.getParent(skyboxNode)).isNull();
+        assertThat(skyboxNode.getParent()).isNull();
         // TODO: b/354711945 - Uncomment when we can test the SetGeometrySplitEngine(null) path.
         // assertThat(fakeImpressApi.impressNodeHasParent(geometryNodes.get(0))).isFalse();
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getEnvironmentNode(mActivity))
-                .isNull();
-    }
-
-    @Test
-    public void
-            setSpatialEnvironmentPreferenceNullWithSkyboxAndGeometrySplitEngine_removesEnvironment() {
-        setupSplitEngineEnvironmentImpl();
-
-        long exr = fakeLoadEnvironmentSplitEngine("fakeEnvironment");
-        long gltf = fakeLoadGltfModelSplitEngine("fakeGltfModel");
-
-        // Ensure that an environment is set.
-        mEnvironment.setSpatialEnvironmentPreference(
-                new SpatialEnvironmentPreference(
-                        new ExrImageResourceImplSplitEngine(exr),
-                        new GltfModelResourceImplSplitEngine(gltf)));
-
-        long initialSkybox = mFakeImpressApi.getCurrentEnvironmentLight();
-        List<Integer> geometryNodes = mFakeImpressApi.getImpressNodesForToken(gltf);
-
-        assertThat(initialSkybox).isNotEqualTo(INVALID_SPLIT_ENGINE_ID);
-        assertThat(geometryNodes).isNotEmpty();
-        assertThat(mFakeImpressApi.impressNodeHasParent(geometryNodes.get(0))).isTrue();
-
-        // Ensure environment is removed
-        mEnvironment.setSpatialEnvironmentPreference(null);
-
-        long finalSkybox = mFakeImpressApi.getCurrentEnvironmentLight();
-        assertThat(finalSkybox).isEqualTo(INVALID_SPLIT_ENGINE_ID);
-        // TODO: b/354711945 - Uncomment when we can test the SetGeometrySplitEngine(null) path.
-        // assertThat(fakeImpressApi.impressNodeHasParent(geometryNodes.get(0))).isFalse();
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getEnvironmentNode(mActivity))
-                .isNull();
+        assertThat(mFakeExtensions.getFakeEnvironmentNode()).isNull();
     }
 
     @Test
     public void
             setSpatialEnvironmentPreferenceWithNullSkyboxAndGeometry_doesNotDetachEnvironment() {
-        EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
-        GltfModelToken gltf = fakeLoadGltfModel("fakeGltfModel");
+        androidx.xr.extensions.asset.EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
+        androidx.xr.extensions.asset.GltfModelToken gltf = fakeLoadGltfModel("fakeGltfModel");
 
         // Ensure that an environment is set.
         mEnvironment.setSpatialEnvironmentPreference(
                 new SpatialEnvironmentPreference(
                         new ExrImageResourceImpl(exr), new GltfModelResourceImpl(gltf)));
 
-        Node skyboxNode = getNodeWithEnvironmentToken(exr);
-        Node geometryNode = getNodeWithGltfToken(gltf);
+        FakeNode skyboxNode = mFakeExtensions.testGetNodeWithEnvironmentToken(exr);
+        FakeNode geometryNode = mFakeExtensions.testGetNodeWithGltfToken(gltf);
 
         assertThat(skyboxNode).isNotNull();
         assertThat(geometryNode).isNotNull();
 
-        assertThat(mNodeRepository.getParent(skyboxNode)).isNotNull();
-        assertThat(mNodeRepository.getParent(geometryNode)).isNotNull();
+        assertThat(skyboxNode.getParent()).isNotNull();
+        assertThat(geometryNode.getParent()).isNotNull();
 
         // Ensure environment is not removed if both skybox and geometry are updated to null.
         mEnvironment.setSpatialEnvironmentPreference(new SpatialEnvironmentPreference(null, null));
 
-        assertThat(mNodeRepository.getParent(skyboxNode))
-                .isNull(); // Skybox should be set to a black skybox node.
-        assertThat(mNodeRepository.getParent(geometryNode)).isNull();
+        assertThat(skyboxNode.getParent()).isNull(); // Skybox should be set to a black skybox node.
+        assertThat(geometryNode.getParent()).isNull();
 
         // The skybox should be set to a black skybox node. This isn't relevant for end users but it
         // confirms the environment implementation is working as designed.
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getEnvironmentNode(mActivity))
-                .isNotNull();
+        assertThat(mFakeExtensions.getFakeEnvironmentNode()).isNotNull();
     }
 
     @Test
     public void
-            setSpatialEnvironmentPreferenceWithNullSkyboxExtensionAndNullGeometrySplitEngine_doesNotDetachEnvironment() {
+            setSpatialEnvironmentPreferenceWithNullSkyboxAndGeometrySplitEngine_doesNotDetachEnvironment() {
         setupSplitEngineEnvironmentImpl();
-        EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
+        androidx.xr.extensions.asset.EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
         long gltf = fakeLoadGltfModelSplitEngine("fakeGltfModel");
 
         // Ensure that an environment is set.
@@ -467,115 +353,26 @@
                 new SpatialEnvironmentPreference(
                         new ExrImageResourceImpl(exr), new GltfModelResourceImplSplitEngine(gltf)));
 
-        Node skyboxNode = getNodeWithEnvironmentToken(exr);
+        FakeNode skyboxNode = mFakeExtensions.testGetNodeWithEnvironmentToken(exr);
         List<Integer> geometryNodes = mFakeImpressApi.getImpressNodesForToken(gltf);
 
         assertThat(skyboxNode).isNotNull();
         assertThat(geometryNodes).isNotEmpty();
 
-        assertThat(mNodeRepository.getParent(skyboxNode)).isNotNull();
+        assertThat(skyboxNode.getParent()).isNotNull();
         assertThat(mFakeImpressApi.impressNodeHasParent(geometryNodes.get(0))).isTrue();
 
         // Ensure environment is not removed if both skybox and geometry are updated to null.
         mEnvironment.setSpatialEnvironmentPreference(new SpatialEnvironmentPreference(null, null));
-        skyboxNode = getNodeWithEnvironmentToken(mNullSkyboxToken);
+        skyboxNode = mFakeExtensions.testGetNodeWithEnvironmentToken(mNullSkyboxToken);
         assertThat(skyboxNode).isNotNull(); // Skybox should be set to a black skybox node.
-        assertThat(mNodeRepository.getParent(skyboxNode)).isNotNull();
+        assertThat(skyboxNode.getParent()).isNotNull();
         // TODO: b/354711945 - Uncomment when we can test the SetGeometrySplitEngine(null) path.
         // assertThat(fakeImpressApi.impressNodeHasParent(geometryNodes.get(0))).isFalse();
 
         // The skybox should be set to a black skybox node. This isn't relevant for end users but it
         // confirms the environment implementation is working as designed.
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getEnvironmentNode(mActivity))
-                .isNotNull();
-    }
-
-    @Test
-    public void
-            setSpatialEnvironmentPreferenceWithNullSkyboxSplitEngineAndNullGeometrySplitEngine_doesNotDetachEnvironment() {
-        setupSplitEngineEnvironmentImpl();
-        long exr = fakeLoadEnvironmentSplitEngine("fakeEnvironment");
-        long gltf = fakeLoadGltfModelSplitEngine("fakeGltfModel");
-
-        // Ensure that an environment is set.
-        mEnvironment.setSpatialEnvironmentPreference(
-                new SpatialEnvironmentPreference(
-                        new ExrImageResourceImplSplitEngine(exr),
-                        new GltfModelResourceImplSplitEngine(gltf)));
-
-        long initialSkybox = mFakeImpressApi.getCurrentEnvironmentLight();
-        List<Integer> geometryNodes = mFakeImpressApi.getImpressNodesForToken(gltf);
-
-        assertThat(initialSkybox).isNotEqualTo(INVALID_SPLIT_ENGINE_ID);
-        assertThat(geometryNodes).isNotEmpty();
-        assertThat(mFakeImpressApi.impressNodeHasParent(geometryNodes.get(0))).isTrue();
-
-        // Ensure environment is not removed if both skybox and geometry are updated to null.
-        mEnvironment.setSpatialEnvironmentPreference(new SpatialEnvironmentPreference(null, null));
-
-        long finalSkybox = mFakeImpressApi.getCurrentEnvironmentLight();
-        assertThat(finalSkybox)
-                .isNotEqualTo(
-                        INVALID_SPLIT_ENGINE_ID); // Skybox should be set to a black skybox node.
-        // TODO: b/354711945 - Uncomment when we can test the SetGeometrySplitEngine(null) path.
-        // assertThat(fakeImpressApi.impressNodeHasParent(geometryNodes.get(0))).isFalse();
-
-        // The skybox should be set to a black skybox node. This isn't relevant for end users but it
-        // confirms the environment implementation is working as designed.
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getEnvironmentNode(mActivity))
-                .isNotNull();
-    }
-
-    @Test
-    public void
-            setSpatialEnvironmentPreferenceWithSkyboxSplitEngineAndGeometryWithMeshAndAnimationSplitEngine_doesNotDetachEnvironment() {
-        setupSplitEngineEnvironmentImpl();
-        long exr = fakeLoadEnvironmentSplitEngine("fakeEnvironment");
-        long gltf = fakeLoadGltfModelSplitEngine("fakeGltfModel");
-        // Create dummy regular version of the water material.
-        MaterialResource material = fakeLoadMaterialSplitEngine(false);
-        String meshName = "fakeMesh";
-        String animationName = "fakeAnimation";
-
-        // Ensure that an environment is set.
-        mEnvironment.setSpatialEnvironmentPreference(
-                new SpatialEnvironmentPreference(
-                        new ExrImageResourceImplSplitEngine(exr),
-                        new GltfModelResourceImplSplitEngine(gltf),
-                        material,
-                        meshName,
-                        animationName));
-
-        long initialSkybox = mFakeImpressApi.getCurrentEnvironmentLight();
-        List<Integer> geometryNodes = mFakeImpressApi.getImpressNodesForToken(gltf);
-        Map<Long, MaterialData> materials = mFakeImpressApi.getMaterials();
-        int animatingNodes = mFakeImpressApi.impressNodeAnimatingSize();
-        int loopingAnimatingNodes = mFakeImpressApi.impressNodeLoopAnimatingSize();
-
-        assertThat(initialSkybox).isNotEqualTo(INVALID_SPLIT_ENGINE_ID);
-        assertThat(geometryNodes).isNotEmpty();
-        assertThat(mFakeImpressApi.impressNodeHasParent(geometryNodes.get(0))).isTrue();
-        assertThat(materials).isNotEmpty();
-        assertThat(materials.keySet().toArray()[0]).isEqualTo(WATER_MATERIAL_ID);
-        assertThat(materials.get(WATER_MATERIAL_ID).type).isEqualTo(MaterialData.Type.WATER);
-        assertThat(animatingNodes).isEqualTo(0);
-        assertThat(loopingAnimatingNodes).isEqualTo(1);
-
-        // Ensure environment is not removed if both skybox and geometry are updated to null.
-        mEnvironment.setSpatialEnvironmentPreference(
-                new SpatialEnvironmentPreference(null, null, null, null, null));
-
-        long finalSkybox = mFakeImpressApi.getCurrentEnvironmentLight();
-        assertThat(finalSkybox)
-                .isNotEqualTo(
-                        INVALID_SPLIT_ENGINE_ID); // Skybox should be set to a black skybox node.
-        // TODO: b/354711945 - Uncomment when we can test the SetGeometrySplitEngine(null) path.
-        // assertThat(fakeImpressApi.impressNodeHasParent(geometryNodes.get(0))).isFalse();
-
-        // The skybox should be set to a black skybox node. This isn't relevant for end users but it
-        // confirms the environment implementation is working as designed.
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getEnvironmentNode(mActivity))
-                .isNotNull();
+        assertThat(mFakeExtensions.getFakeEnvironmentNode()).isNotNull();
     }
 
     @Test
@@ -584,24 +381,22 @@
         setupSplitEngineEnvironmentImpl();
         // Ensure environment is attached if both skybox and geometry are set to null at start.
         mEnvironment.setSpatialEnvironmentPreference(new SpatialEnvironmentPreference(null, null));
-        Node skyboxNode = getNodeWithEnvironmentToken(mNullSkyboxToken);
+        FakeNode skyboxNode = mFakeExtensions.testGetNodeWithEnvironmentToken(mNullSkyboxToken);
         assertThat(skyboxNode).isNotNull();
-        assertThat(mNodeRepository.getParent(skyboxNode)).isNotNull();
+        assertThat(skyboxNode.getParent()).isNotNull();
 
         // The skybox should be set to a black skybox node. This isn't relevant for end users but it
         // confirms the environment implementation is working as designed.
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getEnvironmentNode(mActivity))
-                .isNotNull();
+        assertThat(mFakeExtensions.getFakeEnvironmentNode()).isNotNull();
     }
 
     @Test
     public void
             setSpatialEnvironmentPreferenceWithNullSkyboxAndGeometryButMisingResource_doesntAttachEnvironment() {
         // Reset our state and setup environment with null skybox resource.
-        ShadowXrExtensions.extract(mXrExtensions).removeStateFor(mActivity);
-
-        Node sceneRootNode = mXrExtensions.createNode();
-        mSubspaceNode = mXrExtensions.createNode();
+        mFakeExtensions = new FakeXrExtensions();
+        FakeNode fakeSceneRootNode = (FakeNode) mFakeExtensions.createNode();
+        mSubspaceNode = (FakeNode) mFakeExtensions.createNode();
         mExpectedSubspace = new SubspaceNode(SUBSPACE_ID, mSubspaceNode);
         mSplitEngineSubspaceManager = Mockito.mock(SplitEngineSubspaceManager.class);
         when(mSplitEngineSubspaceManager.createSubspace(anyString(), anyInt()))
@@ -609,32 +404,31 @@
         mEnvironment =
                 new SpatialEnvironmentImpl(
                         mActivity,
-                        mXrExtensions,
-                        sceneRootNode,
+                        mFakeExtensions,
+                        fakeSceneRootNode,
                         this::getSpatialState,
+                        /* nullSkyboxResourceFuture= */ null,
                         /* useSplitEngine= */ true);
         mEnvironment.onSplitEngineReady(mSplitEngineSubspaceManager, mFakeImpressApi);
-        mEnvironment.onNullSkyboxResourceReady(null);
 
         // If the skybox resource is missing, we don't attach anything to the environment.
         mEnvironment.setSpatialEnvironmentPreference(new SpatialEnvironmentPreference(null, null));
-        Node skyboxNode = getNodeWithEnvironmentToken(mNullSkyboxToken);
+        FakeNode skyboxNode = mFakeExtensions.testGetNodeWithEnvironmentToken(mNullSkyboxToken);
         assertThat(skyboxNode).isNull();
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getEnvironmentNode(mActivity))
-                .isNull();
+        assertThat(mFakeExtensions.getFakeEnvironmentNode()).isNull();
     }
 
     @Test
     public void
             setSpatialEnvironmentPreferenceFromNullPreferenceToNullSkyboxAndGeometrySplitEngine_doesNotDetachEnvironment() {
         setupSplitEngineEnvironmentImpl();
-        EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
+        androidx.xr.extensions.asset.EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
         long gltf = fakeLoadGltfModelSplitEngine("fakeGltfModel");
 
         // Ensure that an environment is set.
         mEnvironment.setSpatialEnvironmentPreference(null);
 
-        Node skyboxNode = getNodeWithEnvironmentToken(exr);
+        FakeNode skyboxNode = mFakeExtensions.testGetNodeWithEnvironmentToken(exr);
         List<Integer> geometryNodes = mFakeImpressApi.getImpressNodesForToken(gltf);
 
         assertThat(skyboxNode).isNull();
@@ -642,40 +436,40 @@
 
         // Ensure environment is not removed if both skybox and geometry are updated to null.
         mEnvironment.setSpatialEnvironmentPreference(new SpatialEnvironmentPreference(null, null));
-        skyboxNode = getNodeWithEnvironmentToken(mNullSkyboxToken);
+        skyboxNode = mFakeExtensions.testGetNodeWithEnvironmentToken(mNullSkyboxToken);
         assertThat(skyboxNode).isNotNull(); // Skybox should be set to a black skybox node.
-        assertThat(mNodeRepository.getParent(skyboxNode)).isNotNull();
+        assertThat(skyboxNode.getParent()).isNotNull();
         // TODO: b/354711945 - Uncomment when we can test the SetGeometrySplitEngine(null) path.
         // assertThat(fakeImpressApi.impressNodeHasParent(geometryNodes.get(0))).isFalse();
 
         // The skybox should be set to a black skybox node. This isn't relevant for end users but it
         // confirms the environment implementation is working as designed.
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getEnvironmentNode(mActivity))
-                .isNotNull();
+        assertThat(mFakeExtensions.getFakeEnvironmentNode()).isNotNull();
     }
 
     @Test
     public void setNewSpatialEnvironmentPreference_replacesOldSpatialEnvironmentPreference() {
-        EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
-        EnvironmentToken newExr = fakeLoadEnvironment("newFakeEnvironment");
-        GltfModelToken gltf = fakeLoadGltfModel("fakeGltfModel");
-        GltfModelToken newGltf = fakeLoadGltfModel("newFakeGltfModel");
+        androidx.xr.extensions.asset.EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
+        androidx.xr.extensions.asset.EnvironmentToken newExr =
+                fakeLoadEnvironment("newFakeEnvironment");
+        androidx.xr.extensions.asset.GltfModelToken gltf = fakeLoadGltfModel("fakeGltfModel");
+        androidx.xr.extensions.asset.GltfModelToken newGltf = fakeLoadGltfModel("newFakeGltfModel");
 
         // Ensure that an environment is set a first time.
         mEnvironment.setSpatialEnvironmentPreference(
                 new SpatialEnvironmentPreference(
                         new ExrImageResourceImpl(exr), new GltfModelResourceImpl(gltf)));
 
-        Node skyboxNode = getNodeWithEnvironmentToken(exr);
-        Node geometryNode = getNodeWithGltfToken(gltf);
+        FakeNode skyboxNode = mFakeExtensions.testGetNodeWithEnvironmentToken(exr);
+        FakeNode geometryNode = mFakeExtensions.testGetNodeWithGltfToken(gltf);
 
         // Ensure that an environment is set a second time.
         mEnvironment.setSpatialEnvironmentPreference(
                 new SpatialEnvironmentPreference(
                         new ExrImageResourceImpl(newExr), new GltfModelResourceImpl(newGltf)));
 
-        Node newSkyboxNode = getNodeWithEnvironmentToken(newExr);
-        Node newGeometryNode = getNodeWithGltfToken(newGltf);
+        FakeNode newSkyboxNode = mFakeExtensions.testGetNodeWithEnvironmentToken(newExr);
+        FakeNode newGeometryNode = mFakeExtensions.testGetNodeWithGltfToken(newGltf);
 
         // None of the nodes should be null.
         assertThat(skyboxNode).isNotNull();
@@ -684,36 +478,30 @@
         assertThat(newGeometryNode).isNotNull();
 
         // Only the new nodes should have a parent.
-        assertThat(mNodeRepository.getParent(skyboxNode)).isNull();
-        assertThat(mNodeRepository.getParent(geometryNode)).isNull();
-        assertThat(mNodeRepository.getParent(newSkyboxNode)).isNotNull();
-        assertThat(mNodeRepository.getParent(newGeometryNode)).isNotNull();
+        assertThat(skyboxNode.getParent()).isNull();
+        assertThat(geometryNode.getParent()).isNull();
+        assertThat(newSkyboxNode.getParent()).isNotNull();
+        assertThat(newGeometryNode.getParent()).isNotNull();
 
         // The names should be the same, but the resources should be different.
-        assertThat(mNodeRepository.getEnvironmentToken(skyboxNode))
-                .isNotEqualTo(mNodeRepository.getEnvironmentToken(newSkyboxNode));
-        assertThat(mNodeRepository.getName(skyboxNode))
-                .isEqualTo(SpatialEnvironmentImpl.SKYBOX_NODE_NAME);
-        assertThat(mNodeRepository.getName(newSkyboxNode))
-                .isEqualTo(SpatialEnvironmentImpl.SKYBOX_NODE_NAME);
-        assertThat(mNodeRepository.getGltfModelToken(geometryNode))
-                .isNotEqualTo(mNodeRepository.getGltfModelToken(newGeometryNode));
-        assertThat(mNodeRepository.getName(geometryNode))
-                .isEqualTo(SpatialEnvironmentImpl.GEOMETRY_NODE_NAME);
-        assertThat(mNodeRepository.getName(newGeometryNode))
-                .isEqualTo(SpatialEnvironmentImpl.GEOMETRY_NODE_NAME);
+        assertThat(skyboxNode.getEnvironment()).isNotEqualTo(newSkyboxNode.getEnvironment());
+        assertThat(skyboxNode.getName()).isEqualTo(SpatialEnvironmentImpl.SKYBOX_NODE_NAME);
+        assertThat(newSkyboxNode.getName()).isEqualTo(SpatialEnvironmentImpl.SKYBOX_NODE_NAME);
+        assertThat(geometryNode.getGltfModel()).isNotEqualTo(newGeometryNode.getGltfModel());
+        assertThat(geometryNode.getName()).isEqualTo(SpatialEnvironmentImpl.GEOMETRY_NODE_NAME);
+        assertThat(newGeometryNode.getName()).isEqualTo(SpatialEnvironmentImpl.GEOMETRY_NODE_NAME);
 
         // The environment node should still be attached.
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getEnvironmentNode(mActivity))
-                .isNotNull();
+        assertThat(mFakeExtensions.getFakeEnvironmentNode()).isNotNull();
     }
 
     @Test
     public void
             setNewSpatialEnvironmentPreferenceSplitEngine_replacesOldSpatialEnvironmentPreference() {
         setupSplitEngineEnvironmentImpl();
-        EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
-        EnvironmentToken newExr = fakeLoadEnvironment("newFakeEnvironment");
+        androidx.xr.extensions.asset.EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
+        androidx.xr.extensions.asset.EnvironmentToken newExr =
+                fakeLoadEnvironment("newFakeEnvironment");
         long gltf = fakeLoadGltfModelSplitEngine("fakeGltfModel");
         long newGltf = fakeLoadGltfModelSplitEngine("newFakeGltfModel");
 
@@ -722,7 +510,7 @@
                 new SpatialEnvironmentPreference(
                         new ExrImageResourceImpl(exr), new GltfModelResourceImplSplitEngine(gltf)));
 
-        Node skyboxNode = getNodeWithEnvironmentToken(exr);
+        FakeNode skyboxNode = mFakeExtensions.testGetNodeWithEnvironmentToken(exr);
         List<Integer> geometryNodes = mFakeImpressApi.getImpressNodesForToken(gltf);
 
         // Ensure that an environment is set a second time.
@@ -731,7 +519,7 @@
                         new ExrImageResourceImpl(newExr),
                         new GltfModelResourceImplSplitEngine(newGltf)));
 
-        Node newSkyboxNode = getNodeWithEnvironmentToken(newExr);
+        FakeNode newSkyboxNode = mFakeExtensions.testGetNodeWithEnvironmentToken(newExr);
         List<Integer> newGeometryNodes = mFakeImpressApi.getImpressNodesForToken(newGltf);
 
         // None of the nodes should be null.
@@ -741,160 +529,20 @@
         assertThat(newGeometryNodes).isNotEmpty();
 
         // Only the new nodes should have a parent.
-        assertThat(mNodeRepository.getParent(skyboxNode)).isNull();
+        assertThat(skyboxNode.getParent()).isNull();
         // TODO: b/354711945 - Uncomment when we can test the SetGeometrySplitEngine(null) path.
         // assertThat(fakeImpressApi.impressNodeHasParent(geometryNodes.get(0))).isFalse();
-        assertThat(mNodeRepository.getParent(newSkyboxNode)).isNotNull();
+        assertThat(newSkyboxNode.getParent()).isNotNull();
         assertThat(mFakeImpressApi.impressNodeHasParent(newGeometryNodes.get(0))).isTrue();
 
         // The resources should be different.
-        assertThat(mNodeRepository.getEnvironmentToken(skyboxNode))
-                .isNotEqualTo(mNodeRepository.getEnvironmentToken(newSkyboxNode));
-        assertThat(mNodeRepository.getName(skyboxNode))
-                .isEqualTo(SpatialEnvironmentImpl.SKYBOX_NODE_NAME);
-        assertThat(mNodeRepository.getName(newSkyboxNode))
-                .isEqualTo(SpatialEnvironmentImpl.SKYBOX_NODE_NAME);
+        assertThat(skyboxNode.getEnvironment()).isNotEqualTo(newSkyboxNode.getEnvironment());
+        assertThat(skyboxNode.getName()).isEqualTo(SpatialEnvironmentImpl.SKYBOX_NODE_NAME);
+        assertThat(newSkyboxNode.getName()).isEqualTo(SpatialEnvironmentImpl.SKYBOX_NODE_NAME);
         assertThat(geometryNodes.get(0)).isNotEqualTo(newGeometryNodes.get(0));
 
         // The environment node should still be attached.
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getEnvironmentNode(mActivity))
-                .isNotNull();
-    }
-
-    @Test
-    public void
-            setSpatialEnvironmentPreferenceWithSplitEngineAndGeometryWithMaterialAndMeshNameSplitEngine_materialIsOverriden() {
-        setupSplitEngineEnvironmentImpl();
-        long exr = fakeLoadEnvironmentSplitEngine("fakeEnvironment");
-        long gltf = fakeLoadGltfModelSplitEngine("fakeGltfModel");
-        // Create dummy regular version of the water material.
-        MaterialResource material = fakeLoadMaterialSplitEngine(false);
-        String meshName = "fakeMesh";
-        String animationName = "fakeAnimation";
-
-        // Ensure that an environment is set.
-        mEnvironment.setSpatialEnvironmentPreference(
-                new SpatialEnvironmentPreference(
-                        new ExrImageResourceImplSplitEngine(exr),
-                        new GltfModelResourceImplSplitEngine(gltf),
-                        material,
-                        meshName,
-                        animationName));
-
-        Map<Long, MaterialData> materials = mFakeImpressApi.getMaterials();
-        int loopingAnimatingNodes = mFakeImpressApi.impressNodeLoopAnimatingSize();
-
-        assertThat(
-                        mFakeImpressApi.getImpressNodes().keySet().stream()
-                                .filter(
-                                        node ->
-                                                node.materialOverride != null
-                                                        && node.materialOverride.type
-                                                                == MaterialData.Type.WATER)
-                                .toArray())
-                .hasLength(1); // 1 glTF node that should be overridden with the water material.
-
-        assertThat(materials).isNotEmpty();
-        assertThat(materials.keySet().toArray()[0]).isEqualTo(WATER_MATERIAL_ID);
-        assertThat(materials.get(WATER_MATERIAL_ID).type).isEqualTo(MaterialData.Type.WATER);
-        assertThat(loopingAnimatingNodes).isEqualTo(1);
-    }
-
-    @Test
-    public void
-            setSpatialEnvironmentPreferenceWithSplitEngineAndGeometryWithMaterialAndNoMeshNameSplitEngine_materialIsNotOverriden() {
-        setupSplitEngineEnvironmentImpl();
-        long exr = fakeLoadEnvironmentSplitEngine("fakeEnvironment");
-        long gltf = fakeLoadGltfModelSplitEngine("fakeGltfModel");
-        // Create dummy regular version of the water material.
-        MaterialResource material = fakeLoadMaterialSplitEngine(false);
-        String animationName = "fakeAnimation";
-
-        // Ensure that an environment is set.
-        mEnvironment.setSpatialEnvironmentPreference(
-                new SpatialEnvironmentPreference(
-                        new ExrImageResourceImplSplitEngine(exr),
-                        new GltfModelResourceImplSplitEngine(gltf),
-                        material,
-                        null,
-                        animationName));
-
-        Map<Long, MaterialData> materials = mFakeImpressApi.getMaterials();
-
-        assertThat(
-                        mFakeImpressApi.getImpressNodes().keySet().stream()
-                                .filter(node -> node.materialOverride == null)
-                                .toArray())
-                .hasLength(2); // 2 nodes are subspace (parent) and glTF (child) used for the
-        // environment. Both
-        // have no material override so we expect the length of the filter to be 2.
-
-        assertThat(materials).isNotEmpty();
-        assertThat(materials.keySet().toArray()[0]).isEqualTo(WATER_MATERIAL_ID);
-        assertThat(materials.get(WATER_MATERIAL_ID).type).isEqualTo(MaterialData.Type.WATER);
-    }
-
-    @Test
-    public void
-            setSpatialEnvironmentPreferenceWithSplitEngineAndGeometryWithNoMaterialAndMeshNameSplitEngine_materialIsNotOverriden() {
-        setupSplitEngineEnvironmentImpl();
-        long exr = fakeLoadEnvironmentSplitEngine("fakeEnvironment");
-        long gltf = fakeLoadGltfModelSplitEngine("fakeGltfModel");
-        String meshName = "fakeMesh";
-        String animationName = "fakeAnimation";
-
-        // Ensure that an environment is set.
-        mEnvironment.setSpatialEnvironmentPreference(
-                new SpatialEnvironmentPreference(
-                        new ExrImageResourceImplSplitEngine(exr),
-                        new GltfModelResourceImplSplitEngine(gltf),
-                        null,
-                        meshName,
-                        animationName));
-
-        Map<Long, MaterialData> materials = mFakeImpressApi.getMaterials();
-
-        assertThat(
-                        mFakeImpressApi.getImpressNodes().keySet().stream()
-                                .filter(node -> node.materialOverride == null)
-                                .toArray())
-                .hasLength(2); // 2 nodes are subspace (parent) and glTF (child) used for the
-        // environment. Both
-        // have no material override so we expect the length of the filter to be 2.
-
-        assertThat(materials).isEmpty();
-    }
-
-    @Test
-    public void
-            setSpatialEnvironmentPreferenceWithSplitEngineAndGeometryWithNoAnimationNameSplitEngine_geometryIsNotAnimating() {
-        setupSplitEngineEnvironmentImpl();
-        long exr = fakeLoadEnvironmentSplitEngine("fakeEnvironment");
-        long gltf = fakeLoadGltfModelSplitEngine("fakeGltfModel");
-        String animationName = "fakeAnimation";
-
-        // Ensure that an environment is set.
-        mEnvironment.setSpatialEnvironmentPreference(
-                new SpatialEnvironmentPreference(
-                        new ExrImageResourceImplSplitEngine(exr),
-                        new GltfModelResourceImplSplitEngine(gltf),
-                        null,
-                        null,
-                        animationName));
-
-        int loopingAnimatingNodes = mFakeImpressApi.impressNodeLoopAnimatingSize();
-        Map<Long, MaterialData> materials = mFakeImpressApi.getMaterials();
-
-        assertThat(loopingAnimatingNodes).isEqualTo(1);
-
-        assertThat(
-                        mFakeImpressApi.getImpressNodes().keySet().stream()
-                                .filter(node -> node.materialOverride == null)
-                                .toArray())
-                .hasLength(2); // 2 nodes are subspace (parent) and glTF (child) used for the
-        // environment. Both
-        // have no material override so we expect the length of the filter to be 2.
-        assertThat(materials).isEmpty();
+        assertThat(mFakeExtensions.getFakeEnvironmentNode()).isNotNull();
     }
 
     @Test
@@ -955,38 +603,25 @@
     @Test
     public void dispose_clearsNullSkyboxResource() {
         mEnvironment.setSpatialEnvironmentPreference(new SpatialEnvironmentPreference(null, null));
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getEnvironmentNode(mActivity))
-                .isNotNull();
+        assertThat(mFakeExtensions.getFakeEnvironmentNode()).isNotNull();
 
         // Ensure null skybox resource is cleared and doesn't re-attach the environment after a
         // dispose.
         mEnvironment.dispose();
-        // TODO(b/401587057): Follow up on this assertThrows which is new behaviour.
-        Exception thrown =
-                assertThrows(
-                        NullPointerException.class,
-                        () ->
-                                mEnvironment.setSpatialEnvironmentPreference(
-                                        new SpatialEnvironmentPreference(null, null)));
-        assertThat(thrown).hasMessageThat().contains("Activity cannot be null");
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getEnvironmentNode(mActivity))
-                .isNull();
+        mEnvironment.setSpatialEnvironmentPreference(new SpatialEnvironmentPreference(null, null));
+        assertThat(mFakeExtensions.getFakeEnvironmentNode()).isNull();
     }
 
     @Test
     public void dispose_clearsResources() {
-        EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
-        GltfModelToken gltf = fakeLoadGltfModel("fakeGltfModel");
-        SpatialState spatialState = ShadowSpatialState.create();
-        ShadowSpatialState.extract(spatialState)
-                .setEnvironmentVisibilityState(
-                        /* environmentVisibilityState= */ ShadowEnvironmentVisibilityState.create(
-                                EnvironmentVisibilityState.APP_VISIBLE));
-        ShadowSpatialState.extract(spatialState)
-                .setPassthroughVisibilityState(
-                        /* passthroughVisibilityState= */ ShadowPassthroughVisibilityState.create(
-                                PassthroughVisibilityState.APP, 0.5f));
+        androidx.xr.extensions.asset.EnvironmentToken exr = fakeLoadEnvironment("fakeEnvironment");
+        androidx.xr.extensions.asset.GltfModelToken gltf = fakeLoadGltfModel("fakeGltfModel");
+        FakeSpatialState spatialState = new FakeSpatialState();
 
+        spatialState.setEnvironmentVisibility(
+                new FakeEnvironmentVisibilityState(EnvironmentVisibilityState.APP_VISIBLE));
+        spatialState.setPassthroughVisibility(
+                new FakePassthroughVisibilityState(PassthroughVisibilityState.APP, 0.5f));
         mEnvironment.setSpatialState(spatialState);
 
         mEnvironment.setSpatialEnvironmentPreference(
@@ -994,14 +629,14 @@
                         new ExrImageResourceImpl(exr), new GltfModelResourceImpl(gltf)));
         mEnvironment.setPassthroughOpacityPreference(0.5f);
 
-        Node skyboxNode = getNodeWithEnvironmentToken(exr);
-        Node geometryNode = getNodeWithGltfToken(gltf);
+        FakeNode skyboxNode = mFakeExtensions.testGetNodeWithEnvironmentToken(exr);
+        FakeNode geometryNode = mFakeExtensions.testGetNodeWithGltfToken(gltf);
 
         assertThat(skyboxNode).isNotNull();
         assertThat(geometryNode).isNotNull();
 
-        assertThat(mNodeRepository.getParent(skyboxNode)).isNotNull();
-        assertThat(mNodeRepository.getParent(geometryNode)).isNotNull();
+        assertThat(skyboxNode.getParent()).isNotNull();
+        assertThat(geometryNode.getParent()).isNotNull();
 
         assertThat(mEnvironment.getSpatialEnvironmentPreference()).isNotNull();
         assertThat(mEnvironment.isSpatialEnvironmentPreferenceActive()).isTrue();
@@ -1010,10 +645,9 @@
         assertThat(mEnvironment.getCurrentPassthroughOpacity()).isEqualTo(0.5f);
 
         mEnvironment.dispose();
-        assertThat(mNodeRepository.getParent(skyboxNode)).isNull();
-        assertThat(mNodeRepository.getParent(geometryNode)).isNull();
-        assertThat(ShadowXrExtensions.extract(mXrExtensions).getEnvironmentNode(mActivity))
-                .isNull();
+        assertThat(skyboxNode.getParent()).isNull();
+        assertThat(geometryNode.getParent()).isNull();
+        assertThat(mFakeExtensions.getFakeEnvironmentNode()).isNull();
         assertThat(mEnvironment.getSpatialEnvironmentPreference()).isNull();
         assertThat(mEnvironment.isSpatialEnvironmentPreferenceActive()).isFalse();
         assertThat(mEnvironment.getPassthroughOpacityPreference()).isNull();
diff --git a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/SystemSpaceEntityImplTest.java b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/SystemSpaceEntityImplTest.java
index 3e1b521..10df5fe 100644
--- a/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/SystemSpaceEntityImplTest.java
+++ b/xr/scenecore/scenecore/src/test/java/androidx/xr/scenecore/impl/SystemSpaceEntityImplTest.java
@@ -23,26 +23,20 @@
 
 import static org.mockito.Mockito.verify;
 
+import androidx.xr.extensions.node.Mat4f;
 import androidx.xr.runtime.math.Matrix4;
 import androidx.xr.runtime.math.Pose;
 import androidx.xr.runtime.math.Quaternion;
 import androidx.xr.runtime.math.Vector3;
 import androidx.xr.scenecore.JxrPlatformAdapter.SystemSpaceEntity.OnSpaceUpdatedListener;
 import androidx.xr.scenecore.testing.FakeScheduledExecutorService;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeCloseable;
 import androidx.xr.scenecore.testing.FakeXrExtensions.FakeNode;
-
-import com.android.extensions.xr.node.FakeCloseable;
-import com.android.extensions.xr.node.Mat4f;
-import com.android.extensions.xr.node.Node;
-import com.android.extensions.xr.node.NodeRepository;
-import com.android.extensions.xr.node.NodeTransform;
-import com.android.extensions.xr.node.ShadowNodeTransform;
+import androidx.xr.scenecore.testing.FakeXrExtensions.FakeNodeTransform;
 
 import org.junit.Test;
 import org.mockito.Mockito;
 
-import java.time.Duration;
-
 /**
  * Abstract test class for {@link SystemSpaceEntityImpl} implementations.
  *
@@ -67,12 +61,7 @@
     public void systemSpaceEntityImplConstructor_setsNodeTransformSubscription() {
         SystemSpaceEntityImpl systemSpaceEntity = getSystemSpaceEntityImpl();
         FakeScheduledExecutorService fakeExecutor = getDefaultFakeExecutor();
-        // TODO: b/377554103 - Remove delay once the subscription API are synced with the node
-        // creation.
-        getDefaultFakeExecutor()
-                .simulateSleepExecutingAllTasks(
-                        Duration.ofMillis(SystemSpaceEntityImpl.SUBSCRIPTION_DELAY_MS));
-        FakeNode node = new FakeNode(systemSpaceEntity.getNode());
+        FakeNode node = (FakeNode) systemSpaceEntity.getNode();
         assertThat(node.getTransformListener()).isNotNull();
         assertThat(node.getTransformExecutor()).isEqualTo(fakeExecutor);
         assertThat(systemSpaceEntity.mNodeTransformCloseable).isNotNull();
@@ -81,11 +70,6 @@
     @Test
     public void dispose_closesNodeTransformSubscription() {
         SystemSpaceEntityImpl systemSpaceEntity = getSystemSpaceEntityImpl();
-        // TODO: b/377554103 - Remove delay once the subscription API are synced with the node
-        // creation.
-        getDefaultFakeExecutor()
-                .simulateSleepExecutingAllTasks(
-                        Duration.ofMillis(SystemSpaceEntityImpl.SUBSCRIPTION_DELAY_MS));
         FakeCloseable nodeTransformCloseable =
                 (FakeCloseable) systemSpaceEntity.mNodeTransformCloseable;
         assertThat(nodeTransformCloseable.isClosed()).isFalse();
@@ -168,12 +152,7 @@
     @Test
     public void getPoseInOpenXrReferenceSpace_returnsPoseFromSubscribeToNodeTransform() {
         SystemSpaceEntityImpl systemSpaceEntity = getSystemSpaceEntityImpl();
-        // TODO: b/377554103 - Remove delay once the subscription API are synced with the node
-        // creation.
-        getDefaultFakeExecutor()
-                .simulateSleepExecutingAllTasks(
-                        Duration.ofMillis(SystemSpaceEntityImpl.SUBSCRIPTION_DELAY_MS));
-        FakeNode node = new FakeNode(systemSpaceEntity.getNode());
+        FakeNode node = (FakeNode) systemSpaceEntity.getNode();
         Mat4f mat4f =
                 new Mat4f( // --                Column major, right handed 4x4 Transformation Matrix
                         // with
@@ -184,7 +163,7 @@
                             0f, 0f, 1f, 0f, // --     0,        0,      1,  0
                             4f, 8f, 12f, 1f, // --    tx,       ty,     tz, 1
                         });
-        NodeTransform nodeTransformEvent = ShadowNodeTransform.create(mat4f);
+        FakeNodeTransform nodeTransformEvent = new FakeNodeTransform(mat4f);
 
         node.sendTransformEvent(nodeTransformEvent);
         getDefaultFakeExecutor().runAll();
@@ -200,14 +179,9 @@
     @Test
     public void setOnSpaceUpdatedListener_callsListenerOnNodeTransformEvent() {
         SystemSpaceEntityImpl systemSpaceEntity = getSystemSpaceEntityImpl();
-        // TODO: b/377554103 - Remove delay once the subscription API are synced with the node
-        // creation.
-        getDefaultFakeExecutor()
-                .simulateSleepExecutingAllTasks(
-                        Duration.ofMillis(SystemSpaceEntityImpl.SUBSCRIPTION_DELAY_MS));
-        FakeNode node = new FakeNode(systemSpaceEntity.getNode());
+        FakeNode node = (FakeNode) systemSpaceEntity.getNode();
         Mat4f mat4f = new Mat4f(Matrix4.Identity.getData());
-        NodeTransform nodeTransformEvent = ShadowNodeTransform.create(mat4f);
+        FakeNodeTransform nodeTransformEvent = new FakeNodeTransform(mat4f);
 
         OnSpaceUpdatedListener listener = Mockito.mock(OnSpaceUpdatedListener.class);
         FakeScheduledExecutorService executor = new FakeScheduledExecutorService();
@@ -227,13 +201,9 @@
             setOnSpaceUpdatedListener_multipleListeners_callsLastListenerOnNodeTransformEvent() {
         SystemSpaceEntityImpl systemSpaceEntity = getSystemSpaceEntityImpl();
         FakeScheduledExecutorService fakeExecutor = getDefaultFakeExecutor();
-        // TODO: b/377554103 - Remove delay once the subscription API are synced with the node
-        // creation.
-        fakeExecutor.simulateSleepExecutingAllTasks(
-                Duration.ofMillis(SystemSpaceEntityImpl.SUBSCRIPTION_DELAY_MS));
-        FakeNode node = new FakeNode(systemSpaceEntity.getNode());
+        FakeNode node = (FakeNode) systemSpaceEntity.getNode();
         Mat4f mat4f = new Mat4f(Matrix4.Identity.getData());
-        NodeTransform nodeTransformEvent = ShadowNodeTransform.create(mat4f);
+        FakeNodeTransform nodeTransformEvent = new FakeNodeTransform(mat4f);
 
         OnSpaceUpdatedListener listener = Mockito.mock(OnSpaceUpdatedListener.class);
         OnSpaceUpdatedListener listener2 = Mockito.mock(OnSpaceUpdatedListener.class);
@@ -254,14 +224,9 @@
     public void
             setOnSpaceUpdatedListener_withNullExecutor_callsListenerOnNodeTransformEventExecutor() {
         SystemSpaceEntityImpl systemSpaceEntity = getSystemSpaceEntityImpl();
-        // TODO: b/377554103 - Remove delay once the subscription API are synced with the node
-        // creation.
-        getDefaultFakeExecutor()
-                .simulateSleepExecutingAllTasks(
-                        Duration.ofMillis(SystemSpaceEntityImpl.SUBSCRIPTION_DELAY_MS));
-        FakeNode node = new FakeNode(systemSpaceEntity.getNode());
+        FakeNode node = (FakeNode) systemSpaceEntity.getNode();
         Mat4f mat4f = new Mat4f(Matrix4.Identity.getData());
-        NodeTransform nodeTransformEvent = ShadowNodeTransform.create(mat4f);
+        FakeNodeTransform nodeTransformEvent = new FakeNodeTransform(mat4f);
 
         OnSpaceUpdatedListener listener = Mockito.mock(OnSpaceUpdatedListener.class);
         systemSpaceEntity.setOnSpaceUpdatedListener(listener, null);
@@ -275,14 +240,9 @@
     @Test
     public void setOnSpaceUpdatedListener_withNullListener_noListenerCalledOnNodeTransformEvent() {
         SystemSpaceEntityImpl systemSpaceEntity = getSystemSpaceEntityImpl();
-        // TODO: b/377554103 - Remove delay once the subscription API are synced with the node
-        // creation.
-        getDefaultFakeExecutor()
-                .simulateSleepExecutingAllTasks(
-                        Duration.ofMillis(SystemSpaceEntityImpl.SUBSCRIPTION_DELAY_MS));
-        FakeNode node = new FakeNode(systemSpaceEntity.getNode());
+        FakeNode node = (FakeNode) systemSpaceEntity.getNode();
         Mat4f mat4f = new Mat4f(Matrix4.Identity.getData());
-        NodeTransform nodeTransformEvent = ShadowNodeTransform.create(mat4f);
+        FakeNodeTransform nodeTransformEvent = new FakeNodeTransform(mat4f);
 
         OnSpaceUpdatedListener listener = Mockito.mock(OnSpaceUpdatedListener.class);
         systemSpaceEntity.setOnSpaceUpdatedListener(listener, null);
@@ -302,14 +262,14 @@
         systemSpaceEntity.addChild(childEntity);
 
         // Verify the parent of the child node is the space node before disposing it.
-        Node systemSpaceNode = systemSpaceEntity.getNode();
-        assertThat(NodeRepository.getInstance().getParent(childEntity.getNode()))
-                .isEqualTo(systemSpaceNode);
+        FakeNode systemSpaceNode = (FakeNode) systemSpaceEntity.getNode();
+        FakeNode childNode = (FakeNode) childEntity.getNode();
+        assertThat(childNode.getParent()).isEqualTo(systemSpaceNode);
 
         // Dispose the space entity and verify that the children were disposed.
         systemSpaceEntity.dispose();
 
-        assertThat(NodeRepository.getInstance().getParent(childEntity.getNode())).isNull();
+        assertThat(childNode.getParent()).isNull();
     }
 
     @Test
diff --git a/pdf/pdf-compose/api/current.txt b/xr/xr-stubs/api/current.txt
similarity index 100%
rename from pdf/pdf-compose/api/current.txt
rename to xr/xr-stubs/api/current.txt
diff --git a/pdf/pdf-compose/api/res-current.txt b/xr/xr-stubs/api/res-current.txt
similarity index 100%
rename from pdf/pdf-compose/api/res-current.txt
rename to xr/xr-stubs/api/res-current.txt
diff --git a/xr/xr-stubs/api/restricted_current.txt b/xr/xr-stubs/api/restricted_current.txt
new file mode 100644
index 0000000..4726632
--- /dev/null
+++ b/xr/xr-stubs/api/restricted_current.txt
@@ -0,0 +1,462 @@
+// Signature format: 4.0
+package com.android.extensions.xr {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class Config {
+    method public float defaultPixelsPerMeter(float);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class XrExtensionResult {
+    method public int getResult();
+    field @Deprecated public static final int XR_RESULT_ERROR_IGNORED = 3; // 0x3
+    field @Deprecated public static final int XR_RESULT_ERROR_INVALID_STATE = 2; // 0x2
+    field public static final int XR_RESULT_ERROR_NOT_ALLOWED = 3; // 0x3
+    field public static final int XR_RESULT_ERROR_SYSTEM = 4; // 0x4
+    field public static final int XR_RESULT_IGNORED_ALREADY_APPLIED = 2; // 0x2
+    field public static final int XR_RESULT_SUCCESS = 0; // 0x0
+    field public static final int XR_RESULT_SUCCESS_NOT_VISIBLE = 1; // 0x1
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class XrExtensions {
+    ctor public XrExtensions();
+    method public void addFindableView(android.view.View!, android.view.ViewGroup!);
+    method public void attachSpatialEnvironment(android.app.Activity!, com.android.extensions.xr.node.Node!, com.android.extensions.xr.function.Consumer<com.android.extensions.xr.XrExtensionResult!>!, java.util.concurrent.Executor!);
+    method public void attachSpatialScene(android.app.Activity!, com.android.extensions.xr.node.Node!, com.android.extensions.xr.node.Node!, com.android.extensions.xr.function.Consumer<com.android.extensions.xr.XrExtensionResult!>!, java.util.concurrent.Executor!);
+    method public void clearSpatialStateCallback(android.app.Activity!);
+    method public com.android.extensions.xr.space.ActivityPanel! createActivityPanel(android.app.Activity!, com.android.extensions.xr.space.ActivityPanelLaunchParameters!);
+    method public com.android.extensions.xr.node.Node! createNode();
+    method public com.android.extensions.xr.node.NodeTransaction! createNodeTransaction();
+    method public com.android.extensions.xr.node.ReformOptions! createReformOptions(com.android.extensions.xr.function.Consumer<com.android.extensions.xr.node.ReformEvent!>!, java.util.concurrent.Executor!);
+    method public com.android.extensions.xr.splitengine.SplitEngineBridge! createSplitEngineBridge();
+    method public com.android.extensions.xr.subspace.Subspace! createSubspace(com.android.extensions.xr.splitengine.SplitEngineBridge!, int);
+    method public void detachSpatialEnvironment(android.app.Activity!, com.android.extensions.xr.function.Consumer<com.android.extensions.xr.XrExtensionResult!>!, java.util.concurrent.Executor!);
+    method public void detachSpatialScene(android.app.Activity!, com.android.extensions.xr.function.Consumer<com.android.extensions.xr.XrExtensionResult!>!, java.util.concurrent.Executor!);
+    method public int getApiVersion();
+    method public com.android.extensions.xr.Config! getConfig();
+    method public int getOpenXrWorldReferenceSpaceType();
+    method public com.android.extensions.xr.space.SpatialState! getSpatialState(android.app.Activity!);
+    method public com.android.extensions.xr.node.Node! getSurfaceTrackingNode(android.view.View!);
+    method public com.android.extensions.xr.media.XrSpatialAudioExtensions! getXrSpatialAudioExtensions();
+    method public void hitTest(android.app.Activity!, com.android.extensions.xr.node.Vec3!, com.android.extensions.xr.node.Vec3!, com.android.extensions.xr.function.Consumer<com.android.extensions.xr.space.HitTestResult!>!, java.util.concurrent.Executor!);
+    method @Deprecated public java.util.concurrent.CompletableFuture<com.android.extensions.xr.asset.EnvironmentToken!>! loadEnvironment(java.io.InputStream!, int, int, String!);
+    method @Deprecated public java.util.concurrent.CompletableFuture<com.android.extensions.xr.asset.EnvironmentToken!>! loadEnvironment(java.io.InputStream!, int, int, String!, int, int);
+    method @Deprecated public java.util.concurrent.CompletableFuture<com.android.extensions.xr.asset.GltfModelToken!>! loadGltfModel(java.io.InputStream!, int, int, String!);
+    method @Deprecated public java.util.concurrent.CompletableFuture<com.android.extensions.xr.asset.SceneToken!>! loadImpressScene(java.io.InputStream!, int, int);
+    method public void removeFindableView(android.view.View!, android.view.ViewGroup!);
+    method public void requestFullSpaceMode(android.app.Activity!, boolean, com.android.extensions.xr.function.Consumer<com.android.extensions.xr.XrExtensionResult!>!, java.util.concurrent.Executor!);
+    method public android.os.Bundle! setFullSpaceStartMode(android.os.Bundle!);
+    method public android.os.Bundle! setFullSpaceStartModeWithEnvironmentInherited(android.os.Bundle!);
+    method @Deprecated public void setMainWindowCurvatureRadius(android.app.Activity!, float);
+    method public void setMainWindowSize(android.app.Activity!, int, int, com.android.extensions.xr.function.Consumer<com.android.extensions.xr.XrExtensionResult!>!, java.util.concurrent.Executor!);
+    method public void setPreferredAspectRatio(android.app.Activity!, float, com.android.extensions.xr.function.Consumer<com.android.extensions.xr.XrExtensionResult!>!, java.util.concurrent.Executor!);
+    method public void setSpatialStateCallback(android.app.Activity!, com.android.extensions.xr.function.Consumer<com.android.extensions.xr.space.SpatialState!>!, java.util.concurrent.Executor!);
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class XrExtensions.SceneViewerResult {
+    ctor @Deprecated public XrExtensions.SceneViewerResult();
+  }
+
+}
+
+package com.android.extensions.xr.asset {
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface AssetToken {
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface EnvironmentToken extends com.android.extensions.xr.asset.AssetToken {
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface GltfAnimation {
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public enum GltfAnimation.State {
+    enum_constant @Deprecated public static final com.android.extensions.xr.asset.GltfAnimation.State LOOP;
+    enum_constant @Deprecated public static final com.android.extensions.xr.asset.GltfAnimation.State PLAY;
+    enum_constant @Deprecated public static final com.android.extensions.xr.asset.GltfAnimation.State STOP;
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface GltfModelToken extends com.android.extensions.xr.asset.AssetToken {
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SceneToken extends com.android.extensions.xr.asset.AssetToken {
+  }
+
+}
+
+package com.android.extensions.xr.environment {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class EnvironmentVisibilityState {
+    method public int getCurrentState();
+    field public static final int APP_VISIBLE = 2; // 0x2
+    field public static final int HOME_VISIBLE = 1; // 0x1
+    field public static final int INVISIBLE = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class PassthroughVisibilityState {
+    method public int getCurrentState();
+    method public float getOpacity();
+    field public static final int APP = 2; // 0x2
+    field public static final int DISABLED = 0; // 0x0
+    field public static final int HOME = 1; // 0x1
+    field public static final int SYSTEM = 3; // 0x3
+  }
+
+}
+
+package com.android.extensions.xr.function {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.FunctionalInterface public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+}
+
+package com.android.extensions.xr.media {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AudioManagerExtensions {
+    method public void playSoundEffectAsPointSource(android.media.AudioManager!, int, com.android.extensions.xr.media.PointSourceAttributes!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AudioTrackExtensions {
+    method public com.android.extensions.xr.media.PointSourceAttributes! getPointSourceAttributes(android.media.AudioTrack!);
+    method public com.android.extensions.xr.media.SoundFieldAttributes! getSoundFieldAttributes(android.media.AudioTrack!);
+    method public int getSpatialSourceType(android.media.AudioTrack!);
+    method public android.media.AudioTrack.Builder! setPointSourceAttributes(android.media.AudioTrack.Builder!, com.android.extensions.xr.media.PointSourceAttributes!);
+    method public android.media.AudioTrack.Builder! setSoundFieldAttributes(android.media.AudioTrack.Builder!, com.android.extensions.xr.media.SoundFieldAttributes!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MediaPlayerExtensions {
+    method public android.media.MediaPlayer! setPointSourceAttributes(android.media.MediaPlayer!, com.android.extensions.xr.media.PointSourceAttributes!);
+    method public android.media.MediaPlayer! setSoundFieldAttributes(android.media.MediaPlayer!, com.android.extensions.xr.media.SoundFieldAttributes!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class PointSourceAttributes {
+    method public com.android.extensions.xr.node.Node! getNode();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final class PointSourceAttributes.Builder {
+    ctor public PointSourceAttributes.Builder();
+    method public com.android.extensions.xr.media.PointSourceAttributes! build() throws java.lang.UnsupportedOperationException;
+    method public com.android.extensions.xr.media.PointSourceAttributes.Builder! setNode(com.android.extensions.xr.node.Node!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SoundFieldAttributes {
+    method public int getAmbisonicsOrder();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final class SoundFieldAttributes.Builder {
+    ctor public SoundFieldAttributes.Builder();
+    method public com.android.extensions.xr.media.SoundFieldAttributes! build() throws java.lang.UnsupportedOperationException;
+    method public com.android.extensions.xr.media.SoundFieldAttributes.Builder! setAmbisonicsOrder(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SoundPoolExtensions {
+    method public int getSpatialSourceType(android.media.SoundPool!, int);
+    method public int playAsPointSource(android.media.SoundPool!, int, com.android.extensions.xr.media.PointSourceAttributes!, float, int, int, float);
+    method public int playAsSoundField(android.media.SoundPool!, int, com.android.extensions.xr.media.SoundFieldAttributes!, float, int, int, float);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SpatializerExtensions {
+    field public static final int AMBISONICS_ORDER_FIRST_ORDER = 0; // 0x0
+    field public static final int AMBISONICS_ORDER_SECOND_ORDER = 1; // 0x1
+    field public static final int AMBISONICS_ORDER_THIRD_ORDER = 2; // 0x2
+    field public static final int SOURCE_TYPE_BYPASS = 0; // 0x0
+    field public static final int SOURCE_TYPE_POINT_SOURCE = 1; // 0x1
+    field public static final int SOURCE_TYPE_SOUND_FIELD = 2; // 0x2
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class XrSpatialAudioExtensions {
+    method public com.android.extensions.xr.media.AudioManagerExtensions! getAudioManagerExtensions();
+    method public com.android.extensions.xr.media.AudioTrackExtensions! getAudioTrackExtensions();
+    method public com.android.extensions.xr.media.MediaPlayerExtensions! getMediaPlayerExtensions();
+    method public com.android.extensions.xr.media.SoundPoolExtensions! getSoundPoolExtensions();
+  }
+
+}
+
+package com.android.extensions.xr.node {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class InputEvent {
+    method public int getAction();
+    method public com.android.extensions.xr.node.Vec3! getDirection();
+    method public int getDispatchFlags();
+    method public com.android.extensions.xr.node.InputEvent.HitInfo! getHitInfo();
+    method public com.android.extensions.xr.node.Vec3! getOrigin();
+    method public int getPointerType();
+    method public com.android.extensions.xr.node.InputEvent.HitInfo! getSecondaryHitInfo();
+    method public int getSource();
+    method public long getTimestamp();
+    field public static final int ACTION_CANCEL = 3; // 0x3
+    field public static final int ACTION_DOWN = 0; // 0x0
+    field public static final int ACTION_HOVER_ENTER = 5; // 0x5
+    field public static final int ACTION_HOVER_EXIT = 6; // 0x6
+    field public static final int ACTION_HOVER_MOVE = 4; // 0x4
+    field public static final int ACTION_MOVE = 2; // 0x2
+    field public static final int ACTION_UP = 1; // 0x1
+    field public static final int DISPATCH_FLAG_2D = 2; // 0x2
+    field public static final int DISPATCH_FLAG_CAPTURED_POINTER = 1; // 0x1
+    field public static final int DISPATCH_FLAG_NONE = 0; // 0x0
+    field public static final int POINTER_TYPE_DEFAULT = 0; // 0x0
+    field public static final int POINTER_TYPE_LEFT = 1; // 0x1
+    field public static final int POINTER_TYPE_RIGHT = 2; // 0x2
+    field public static final int SOURCE_CONTROLLER = 2; // 0x2
+    field public static final int SOURCE_GAZE_AND_GESTURE = 5; // 0x5
+    field public static final int SOURCE_HANDS = 3; // 0x3
+    field public static final int SOURCE_HEAD = 1; // 0x1
+    field public static final int SOURCE_MOUSE = 4; // 0x4
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class InputEvent.HitInfo {
+    ctor public InputEvent.HitInfo(int, com.android.extensions.xr.node.Node!, com.android.extensions.xr.node.Mat4f!, com.android.extensions.xr.node.Vec3!);
+    method public com.android.extensions.xr.node.Vec3! getHitPosition();
+    method public com.android.extensions.xr.node.Node! getInputNode();
+    method public int getSubspaceImpressNodeId();
+    method public com.android.extensions.xr.node.Mat4f! getTransform();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Mat4f {
+    ctor public Mat4f(float[]!);
+    method public float get(int, int);
+    method public float[]! getFlattenedMatrix();
+    method public void set(int, int, float);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class Node implements android.os.Parcelable {
+    method public int describeContents();
+    method public void listenForInput(com.android.extensions.xr.function.Consumer<com.android.extensions.xr.node.InputEvent!>!, java.util.concurrent.Executor!);
+    method public void requestPointerCapture(com.android.extensions.xr.function.Consumer<java.lang.Integer!>!, java.util.concurrent.Executor!);
+    method public void setNonPointerFocusTarget(android.view.AttachedSurfaceControl!);
+    method public void stopListeningForInput();
+    method public void stopPointerCapture();
+    method public java.io.Closeable! subscribeToTransform(com.android.extensions.xr.function.Consumer<com.android.extensions.xr.node.NodeTransform!>!, java.util.concurrent.Executor!);
+    method public void writeToParcel(android.os.Parcel!, int);
+    field public static final int POINTER_CAPTURE_STATE_ACTIVE = 1; // 0x1
+    field public static final int POINTER_CAPTURE_STATE_PAUSED = 0; // 0x0
+    field public static final int POINTER_CAPTURE_STATE_STOPPED = 2; // 0x2
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class NodeTransaction implements java.io.Closeable {
+    method public void apply();
+    method public void close();
+    method public com.android.extensions.xr.node.NodeTransaction! disableReform(com.android.extensions.xr.node.Node!);
+    method public com.android.extensions.xr.node.NodeTransaction! enableReform(com.android.extensions.xr.node.Node!, com.android.extensions.xr.node.ReformOptions!);
+    method public com.android.extensions.xr.node.NodeTransaction! merge(com.android.extensions.xr.node.NodeTransaction!);
+    method public com.android.extensions.xr.node.NodeTransaction! removeCornerRadius(com.android.extensions.xr.node.Node!);
+    method public com.android.extensions.xr.node.NodeTransaction! setAlpha(com.android.extensions.xr.node.Node!, float);
+    method public com.android.extensions.xr.node.NodeTransaction! setAnchorId(com.android.extensions.xr.node.Node!, android.os.IBinder!);
+    method public com.android.extensions.xr.node.NodeTransaction! setCornerRadius(com.android.extensions.xr.node.Node!, float);
+    method @Deprecated public com.android.extensions.xr.node.NodeTransaction! setCurvature(com.android.extensions.xr.node.Node!, float);
+    method @Deprecated public com.android.extensions.xr.node.NodeTransaction! setEnvironment(com.android.extensions.xr.node.Node!, com.android.extensions.xr.asset.EnvironmentToken!);
+    method @Deprecated public com.android.extensions.xr.node.NodeTransaction! setGltfAnimation(com.android.extensions.xr.node.Node!, String!, com.android.extensions.xr.asset.GltfAnimation.State!);
+    method @Deprecated public com.android.extensions.xr.node.NodeTransaction! setGltfModel(com.android.extensions.xr.node.Node!, com.android.extensions.xr.asset.GltfModelToken!);
+    method @Deprecated public com.android.extensions.xr.node.NodeTransaction! setImpressScene(com.android.extensions.xr.node.Node!, com.android.extensions.xr.asset.SceneToken!);
+    method public com.android.extensions.xr.node.NodeTransaction! setName(com.android.extensions.xr.node.Node!, String!);
+    method public com.android.extensions.xr.node.NodeTransaction! setOrientation(com.android.extensions.xr.node.Node!, float, float, float, float);
+    method public com.android.extensions.xr.node.NodeTransaction! setParent(com.android.extensions.xr.node.Node!, com.android.extensions.xr.node.Node!);
+    method public com.android.extensions.xr.node.NodeTransaction! setPassthroughState(com.android.extensions.xr.node.Node!, float, int);
+    method public com.android.extensions.xr.node.NodeTransaction! setPixelPositioning(com.android.extensions.xr.node.Node!, int);
+    method public com.android.extensions.xr.node.NodeTransaction! setPixelResolution(com.android.extensions.xr.node.Node!, float);
+    method public com.android.extensions.xr.node.NodeTransaction! setPosition(com.android.extensions.xr.node.Node!, float, float, float);
+    method public com.android.extensions.xr.node.NodeTransaction! setReformSize(com.android.extensions.xr.node.Node!, com.android.extensions.xr.node.Vec3!);
+    method public com.android.extensions.xr.node.NodeTransaction! setScale(com.android.extensions.xr.node.Node!, float, float, float);
+    method public com.android.extensions.xr.node.NodeTransaction! setSubspace(com.android.extensions.xr.node.Node!, com.android.extensions.xr.subspace.Subspace!);
+    method public com.android.extensions.xr.node.NodeTransaction! setSurfaceControl(com.android.extensions.xr.node.Node!, android.view.SurfaceControl!);
+    method public com.android.extensions.xr.node.NodeTransaction! setSurfacePackage(com.android.extensions.xr.node.Node!, android.view.SurfaceControlViewHost.SurfacePackage!);
+    method public com.android.extensions.xr.node.NodeTransaction! setVisibility(com.android.extensions.xr.node.Node!, boolean);
+    method public com.android.extensions.xr.node.NodeTransaction! setWindowBounds(android.view.SurfaceControl!, int, int);
+    method public com.android.extensions.xr.node.NodeTransaction! setWindowBounds(android.view.SurfaceControlViewHost.SurfacePackage!, int, int);
+    field public static final int POSITION_FROM_PARENT_TOP_LEFT = 64; // 0x40
+    field public static final int X_POSITION_IN_PIXELS = 1; // 0x1
+    field public static final int Y_POSITION_IN_PIXELS = 2; // 0x2
+    field public static final int Z_POSITION_IN_PIXELS = 4; // 0x4
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class NodeTransform {
+    method public long getTimestamp();
+    method public com.android.extensions.xr.node.Mat4f! getTransform();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Quatf {
+    ctor public Quatf(float, float, float, float);
+    field public final float w;
+    field public final float x;
+    field public final float y;
+    field public final float z;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ReformEvent {
+    method public com.android.extensions.xr.node.Vec3! getCurrentRayDirection();
+    method public com.android.extensions.xr.node.Vec3! getCurrentRayOrigin();
+    method public int getId();
+    method public com.android.extensions.xr.node.Vec3! getInitialRayDirection();
+    method public com.android.extensions.xr.node.Vec3! getInitialRayOrigin();
+    method public com.android.extensions.xr.node.Quatf! getProposedOrientation();
+    method public com.android.extensions.xr.node.Vec3! getProposedPosition();
+    method public com.android.extensions.xr.node.Vec3! getProposedScale();
+    method public com.android.extensions.xr.node.Vec3! getProposedSize();
+    method public int getState();
+    method public int getType();
+    field public static final int REFORM_STATE_END = 3; // 0x3
+    field public static final int REFORM_STATE_ONGOING = 2; // 0x2
+    field public static final int REFORM_STATE_START = 1; // 0x1
+    field public static final int REFORM_STATE_UNKNOWN = 0; // 0x0
+    field public static final int REFORM_TYPE_MOVE = 1; // 0x1
+    field public static final int REFORM_TYPE_RESIZE = 2; // 0x2
+    field public static final int REFORM_TYPE_UNKNOWN = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ReformOptions {
+    method public com.android.extensions.xr.node.Vec3! getCurrentSize();
+    method public int getEnabledReform();
+    method public com.android.extensions.xr.function.Consumer<com.android.extensions.xr.node.ReformEvent!>! getEventCallback();
+    method public java.util.concurrent.Executor! getEventExecutor();
+    method public float getFixedAspectRatio();
+    method public int getFlags();
+    method public boolean getForceShowResizeOverlay();
+    method public com.android.extensions.xr.node.Vec3! getMaximumSize();
+    method public com.android.extensions.xr.node.Vec3! getMinimumSize();
+    method public int getScaleWithDistanceMode();
+    method public com.android.extensions.xr.node.ReformOptions! setCurrentSize(com.android.extensions.xr.node.Vec3!);
+    method public com.android.extensions.xr.node.ReformOptions! setEnabledReform(int);
+    method public com.android.extensions.xr.node.ReformOptions! setEventCallback(com.android.extensions.xr.function.Consumer<com.android.extensions.xr.node.ReformEvent!>!);
+    method public com.android.extensions.xr.node.ReformOptions! setEventExecutor(java.util.concurrent.Executor!);
+    method public com.android.extensions.xr.node.ReformOptions! setFixedAspectRatio(float);
+    method public com.android.extensions.xr.node.ReformOptions! setFlags(int);
+    method public com.android.extensions.xr.node.ReformOptions! setForceShowResizeOverlay(boolean);
+    method public com.android.extensions.xr.node.ReformOptions! setMaximumSize(com.android.extensions.xr.node.Vec3!);
+    method public com.android.extensions.xr.node.ReformOptions! setMinimumSize(com.android.extensions.xr.node.Vec3!);
+    method public com.android.extensions.xr.node.ReformOptions! setScaleWithDistanceMode(int);
+    field public static final int ALLOW_MOVE = 1; // 0x1
+    field public static final int ALLOW_RESIZE = 2; // 0x2
+    field public static final int FLAG_ALLOW_SYSTEM_MOVEMENT = 2; // 0x2
+    field public static final int FLAG_POSE_RELATIVE_TO_PARENT = 4; // 0x4
+    field public static final int FLAG_SCALE_WITH_DISTANCE = 1; // 0x1
+    field public static final int SCALE_WITH_DISTANCE_MODE_DEFAULT = 3; // 0x3
+    field public static final int SCALE_WITH_DISTANCE_MODE_DMM = 2; // 0x2
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Vec3 {
+    ctor public Vec3(float, float, float);
+    field public final float x;
+    field public final float y;
+    field public final float z;
+  }
+
+}
+
+package com.android.extensions.xr.passthrough {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class PassthroughState {
+    field public static final int PASSTHROUGH_MODE_MAX = 1; // 0x1
+    field public static final int PASSTHROUGH_MODE_MIN = 2; // 0x2
+    field public static final int PASSTHROUGH_MODE_OFF = 0; // 0x0
+  }
+
+}
+
+package com.android.extensions.xr.space {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActivityPanel {
+    method public void delete();
+    method public com.android.extensions.xr.node.Node! getNode();
+    method public void launchActivity(android.content.Intent!, android.os.Bundle!);
+    method public void moveActivity(android.app.Activity!);
+    method public void setWindowBounds(android.graphics.Rect!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ActivityPanelLaunchParameters {
+    ctor public ActivityPanelLaunchParameters(android.graphics.Rect!);
+    method public android.graphics.Rect! getWindowBounds();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class Bounds {
+    ctor public Bounds(float, float, float);
+    method public float getDepth();
+    method public float getHeight();
+    method public float getWidth();
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class BoundsChangeEvent implements com.android.extensions.xr.space.SpatialStateEvent {
+    ctor @Deprecated public BoundsChangeEvent(com.android.extensions.xr.space.Bounds!);
+    method @Deprecated public com.android.extensions.xr.space.Bounds! getBounds();
+    method @Deprecated public float getDepth();
+    method @Deprecated public float getHeight();
+    method @Deprecated public float getWidth();
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class EnvironmentControlChangeEvent implements com.android.extensions.xr.space.SpatialStateEvent {
+    ctor @Deprecated public EnvironmentControlChangeEvent(boolean);
+    method @Deprecated public boolean getEnvironmentControlAllowed();
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class EnvironmentVisibilityChangeEvent implements com.android.extensions.xr.space.SpatialStateEvent {
+    ctor @Deprecated public EnvironmentVisibilityChangeEvent(int);
+    method @Deprecated public int getEnvironmentState();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class HitTestResult {
+    method public float getDistance();
+    method public com.android.extensions.xr.node.Vec3! getHitPosition();
+    method public com.android.extensions.xr.node.Vec3! getSurfaceNormal();
+    method public int getSurfaceType();
+    method public boolean getVirtualEnvironmentIsVisible();
+    field public static final int SURFACE_3D_OBJECT = 2; // 0x2
+    field public static final int SURFACE_PANEL = 1; // 0x1
+    field public static final int SURFACE_UNKNOWN = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final class HitTestResult.Builder {
+    ctor public HitTestResult.Builder(float, com.android.extensions.xr.node.Vec3!, boolean, int);
+    method public com.android.extensions.xr.space.HitTestResult! build();
+    method public com.android.extensions.xr.space.HitTestResult.Builder! setSurfaceNormal(com.android.extensions.xr.node.Vec3!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SpatialCapabilities {
+    ctor public SpatialCapabilities();
+    method public boolean get(int);
+    field public static final int APP_ENVIRONMENTS_CAPABLE = 3; // 0x3
+    field public static final int PASSTHROUGH_CONTROL_CAPABLE = 2; // 0x2
+    field public static final int SPATIAL_3D_CONTENTS_CAPABLE = 1; // 0x1
+    field public static final int SPATIAL_ACTIVITY_EMBEDDING_CAPABLE = 5; // 0x5
+    field public static final int SPATIAL_AUDIO_CAPABLE = 4; // 0x4
+    field public static final int SPATIAL_UI_CAPABLE = 0; // 0x0
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class SpatialCapabilityChangeEvent implements com.android.extensions.xr.space.SpatialStateEvent {
+    ctor @Deprecated public SpatialCapabilityChangeEvent(com.android.extensions.xr.space.SpatialCapabilities!);
+    method @Deprecated public com.android.extensions.xr.space.SpatialCapabilities! getCurrentCapabilities();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SpatialState {
+    method public com.android.extensions.xr.space.Bounds! getBounds();
+    method public com.android.extensions.xr.environment.EnvironmentVisibilityState! getEnvironmentVisibility();
+    method public android.util.Size! getMainWindowSize();
+    method public com.android.extensions.xr.environment.PassthroughVisibilityState! getPassthroughVisibility();
+    method public float getPreferredAspectRatio();
+    method public com.android.extensions.xr.space.SpatialCapabilities! getSpatialCapabilities();
+    method public boolean isActiveEnvironmentNode(com.android.extensions.xr.node.Node!);
+    method public boolean isActiveSceneNode(com.android.extensions.xr.node.Node!);
+    method public boolean isActiveWindowLeashNode(com.android.extensions.xr.node.Node!);
+    method public boolean isEnvironmentInherited();
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SpatialStateEvent {
+  }
+
+}
+
+package com.android.extensions.xr.splitengine {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SplitEngineBridge {
+    method public long getNativeHandle();
+  }
+
+}
+
+package com.android.extensions.xr.subspace {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class Subspace {
+  }
+
+}
+
diff --git a/xr/xr-stubs/build.gradle b/xr/xr-stubs/build.gradle
index 40ad4d8..4bdaa32 100644
--- a/xr/xr-stubs/build.gradle
+++ b/xr/xr-stubs/build.gradle
@@ -40,7 +40,7 @@
 
 androidx {
     name = "Android XR Extensions Stub"
-    type = SoftwareType.SNAPSHOT_ONLY_LIBRARY
+    type = SoftwareType.PUBLISHED_LIBRARY
     inceptionYear = "2024"
     description = "Stub implementation of the Android XR Extensions."
     // TODO: b/379715750 - Remove this flag once the deprecated methods have been removed from the API.
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/Config.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/Config.java
index 9cb59f1..c3a767e 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/Config.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/Config.java
@@ -16,9 +16,11 @@
 
 package com.android.extensions.xr;
 
+import androidx.annotation.RestrictTo;
 
 /** XR configuration information. */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class Config {
 
     Config() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/XrExtensionResult.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/XrExtensionResult.java
index d91db73..a34f008 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/XrExtensionResult.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/XrExtensionResult.java
@@ -16,9 +16,11 @@
 
 package com.android.extensions.xr;
 
+import androidx.annotation.RestrictTo;
 
 /** Represents a result of an asynchronous XR Extension call. */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class XrExtensionResult {
 
     XrExtensionResult() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/XrExtensions.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/XrExtensions.java
index 9bdb861..a7c77dc 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/XrExtensions.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/XrExtensions.java
@@ -18,10 +18,13 @@
 
 import android.content.Intent;
 
+import androidx.annotation.RestrictTo;
+
 /**
  * The main extensions class that creates or provides instances of various XR Extensions components.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class XrExtensions {
 
     public XrExtensions() {
@@ -548,8 +551,7 @@
      * Synchronously returns the OpenXR reference space type.
      *
      * @return the OpenXR reference space type used as world space for the shared scene.
-     * @see <a
-     *     href="https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#spaces-reference-spaces">
+     * @see <a href="https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#spaces-reference-spaces">
      *     OpenXR specs</a>
      */
     public int getOpenXrWorldReferenceSpaceType() {
@@ -662,6 +664,7 @@
      * @deprecated JXR Core doesn't need this anymore as it does the same with Split Engine.
      */
     @SuppressWarnings({"unchecked", "deprecation", "all"})
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
     @Deprecated
     public class SceneViewerResult {
 
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/AssetToken.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/AssetToken.java
index 01a872a..d45c181 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/AssetToken.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/AssetToken.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.asset;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Token of a spatial asset cached in the SpaceFlinger.
@@ -30,5 +31,6 @@
  * @deprecated JXR Core doesn't need this anymore as it does the same with Split Engine.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 @Deprecated
 public interface AssetToken {}
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/EnvironmentToken.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/EnvironmentToken.java
index 9ab118e..e289a67 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/EnvironmentToken.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/EnvironmentToken.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.asset;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Token of an environment cached in the SpaceFlinger.
@@ -30,5 +31,6 @@
  * @deprecated JXR Core doesn't need this anymore as it does the same with Split Engine.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 @Deprecated
 public interface EnvironmentToken extends com.android.extensions.xr.asset.AssetToken {}
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/GltfAnimation.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/GltfAnimation.java
index 8a1dc45..238487f 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/GltfAnimation.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/GltfAnimation.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.asset;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Animation configuration to be played on a glTF model.
@@ -23,6 +24,7 @@
  * @deprecated SceneCore doesn't need this anymore as it does the same with Split Engine.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 @Deprecated
 public interface GltfAnimation {
     /**
@@ -31,6 +33,7 @@
      * @deprecated No longer needed by SceneCore.
      */
     @SuppressWarnings({"unchecked", "deprecation", "all"})
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
     @Deprecated
     enum State {
         /**
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/GltfModelToken.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/GltfModelToken.java
index 02a0513..0b8f80e 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/GltfModelToken.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/GltfModelToken.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.asset;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Token of a glTF model cached in the SpaceFlinger.
@@ -30,5 +31,6 @@
  * @deprecated JXR Core doesn't need this anymore as it does the same with Split Engine.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 @Deprecated
 public interface GltfModelToken extends com.android.extensions.xr.asset.AssetToken {}
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/SceneToken.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/SceneToken.java
index 395f67e..c424750 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/SceneToken.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/asset/SceneToken.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.asset;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Token of a scene cached in the SpaceFlinger.
@@ -30,5 +31,6 @@
  * @deprecated JXR Core doesn't need this anymore as it does the same with Split Engine.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 @Deprecated
 public interface SceneToken extends com.android.extensions.xr.asset.AssetToken {}
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/environment/EnvironmentVisibilityState.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/environment/EnvironmentVisibilityState.java
index 7427607..cc42a07 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/environment/EnvironmentVisibilityState.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/environment/EnvironmentVisibilityState.java
@@ -16,9 +16,11 @@
 
 package com.android.extensions.xr.environment;
 
+import androidx.annotation.RestrictTo;
 
 /** Visibility states of an environment. */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class EnvironmentVisibilityState {
 
     EnvironmentVisibilityState() {
@@ -52,8 +54,8 @@
     public static final int HOME_VISIBLE = 1; // 0x1
 
     /**
-     * No environment is shown. This could mean Passthrough is on with 100% opacity or the home
-     * environment app has crashed.
+     * No environment is shown. This could mean Passthrough is on with 100% opacity or the
+     * home environment app has crashed.
      */
     public static final int INVISIBLE = 0; // 0x0
 }
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/environment/PassthroughVisibilityState.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/environment/PassthroughVisibilityState.java
index 3987d3e..aa48496 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/environment/PassthroughVisibilityState.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/environment/PassthroughVisibilityState.java
@@ -16,9 +16,11 @@
 
 package com.android.extensions.xr.environment;
 
+import androidx.annotation.RestrictTo;
 
 /** Visibility states of passthrough. */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class PassthroughVisibilityState {
 
     PassthroughVisibilityState() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/function/Consumer.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/function/Consumer.java
index 275bd01..56a4e5442 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/function/Consumer.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/function/Consumer.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.function;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Represents a function that accepts an argument and produces no result. It is used internally to
@@ -25,6 +26,7 @@
  * @see java.util.function.Consumer
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 @java.lang.FunctionalInterface
 public interface Consumer<T> {
 
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/AudioManagerExtensions.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/AudioManagerExtensions.java
index a1916ec..f980590 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/AudioManagerExtensions.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/AudioManagerExtensions.java
@@ -16,12 +16,14 @@
 
 package com.android.extensions.xr.media;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Provides spatial audio extensions on the framework {@link
  * com.android.extensions.xr.media.AudioManagerExtensions AudioManagerExtensions} class.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class AudioManagerExtensions {
 
     AudioManagerExtensions() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/AudioTrackExtensions.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/AudioTrackExtensions.java
index a532bde..b8e6aaa 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/AudioTrackExtensions.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/AudioTrackExtensions.java
@@ -16,12 +16,14 @@
 
 package com.android.extensions.xr.media;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Provides spatial audio extensions on the framework {@link android.media.AudioTrack AudioTrack}
  * class.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class AudioTrackExtensions {
 
     AudioTrackExtensions() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/MediaPlayerExtensions.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/MediaPlayerExtensions.java
index 2c46fd7..52bb573 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/MediaPlayerExtensions.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/MediaPlayerExtensions.java
@@ -16,12 +16,14 @@
 
 package com.android.extensions.xr.media;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Provides spatial audio extensions on the framework {@link android.media.MediaPlayer MediaPlayer}
  * class.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class MediaPlayerExtensions {
 
     MediaPlayerExtensions() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/PointSourceAttributes.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/PointSourceAttributes.java
index 52b03c8..383187d 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/PointSourceAttributes.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/PointSourceAttributes.java
@@ -16,12 +16,14 @@
 
 package com.android.extensions.xr.media;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * {@link com.android.extensions.xr.media.PointSourceAttributes PointSourceAttributes} is used to
  * configure a sound be spatialized as a 3D point.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class PointSourceAttributes {
 
     PointSourceAttributes() {
@@ -45,6 +47,7 @@
      * PointSourceAttributes}
      */
     @SuppressWarnings({"unchecked", "deprecation", "all"})
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
     public static final class Builder {
 
         public Builder() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/SoundFieldAttributes.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/SoundFieldAttributes.java
index f92f512..7ab72ea 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/SoundFieldAttributes.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/SoundFieldAttributes.java
@@ -16,12 +16,14 @@
 
 package com.android.extensions.xr.media;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * {@link com.android.extensions.xr.media.SoundFieldAttributes SoundFieldAttributes} is used to
  * configure ambisonic sound sources.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class SoundFieldAttributes {
 
     SoundFieldAttributes() {
@@ -41,6 +43,7 @@
      * SoundFieldAttributes}
      */
     @SuppressWarnings({"unchecked", "deprecation", "all"})
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
     public static final class Builder {
 
         public Builder() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/SoundPoolExtensions.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/SoundPoolExtensions.java
index 915f375..841b69b 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/SoundPoolExtensions.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/SoundPoolExtensions.java
@@ -16,12 +16,14 @@
 
 package com.android.extensions.xr.media;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Provides spatial audio extensions on the framework {@link android.media.SoundPool SoundPool}
  * class.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class SoundPoolExtensions {
 
     SoundPoolExtensions() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/SpatializerExtensions.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/SpatializerExtensions.java
index 82379d1..b08d6bd 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/SpatializerExtensions.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/SpatializerExtensions.java
@@ -16,9 +16,11 @@
 
 package com.android.extensions.xr.media;
 
+import androidx.annotation.RestrictTo;
 
 /** Extensions of the existing {@link Spatializer} class. */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class SpatializerExtensions {
 
     SpatializerExtensions() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/XrSpatialAudioExtensions.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/XrSpatialAudioExtensions.java
index db93ff1..acd9deb 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/XrSpatialAudioExtensions.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/media/XrSpatialAudioExtensions.java
@@ -16,9 +16,11 @@
 
 package com.android.extensions.xr.media;
 
+import androidx.annotation.RestrictTo;
 
 /** Provides new functionality of existing framework APIs needed to Spatialize audio sources. */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class XrSpatialAudioExtensions {
 
     XrSpatialAudioExtensions() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/InputEvent.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/InputEvent.java
index 2342c2b..4f39f6c 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/InputEvent.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/InputEvent.java
@@ -16,9 +16,11 @@
 
 package com.android.extensions.xr.node;
 
+import androidx.annotation.RestrictTo;
 
 /** A single 6DOF pointer event. */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public final class InputEvent {
 
     InputEvent() {
@@ -204,6 +206,7 @@
 
     /** Info about a single ray hit. */
     @SuppressWarnings({"unchecked", "deprecation", "all"})
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
     public static class HitInfo {
 
         public HitInfo(
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Mat4f.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Mat4f.java
index a64fddb..e98f907 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Mat4f.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Mat4f.java
@@ -16,9 +16,11 @@
 
 package com.android.extensions.xr.node;
 
+import androidx.annotation.RestrictTo;
 
 /** 4x4 matrix. */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public final class Mat4f {
 
     public Mat4f(float[] m) {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Node.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Node.java
index 2916fe8..0a8589e 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Node.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Node.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.node;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Handle to a node in the SpaceFlinger scene graph that can also host a 2D Panel or 3D subspace.
@@ -29,6 +30,7 @@
  * system, i.e. +X points to the right, +Y up, and +Z points towards the camera.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class Node implements android.os.Parcelable {
 
     Node() {
@@ -123,7 +125,7 @@
         throw new RuntimeException("Stub!");
     }
 
-    /** A no-op override. */
+    /** A no-op override.  */
     public int describeContents() {
         throw new RuntimeException("Stub!");
     }
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/NodeTransaction.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/NodeTransaction.java
index c729e2c..1983264 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/NodeTransaction.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/NodeTransaction.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.node;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * An atomic set of changes to apply to a set of {@link com.android.extensions.xr.node.Node Node}s.
@@ -24,6 +25,7 @@
  * system, i.e. +X points to the right, +Y up, and +Z points towards the camera.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class NodeTransaction implements java.io.Closeable {
 
     NodeTransaction() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/NodeTransform.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/NodeTransform.java
index 6fac3b6..189dd51 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/NodeTransform.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/NodeTransform.java
@@ -16,9 +16,11 @@
 
 package com.android.extensions.xr.node;
 
+import androidx.annotation.RestrictTo;
 
 /** interface containing the Node transform */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class NodeTransform {
 
     NodeTransform() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Quatf.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Quatf.java
index 690983d..9879687 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Quatf.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Quatf.java
@@ -16,9 +16,11 @@
 
 package com.android.extensions.xr.node;
 
+import androidx.annotation.RestrictTo;
 
 /** Quaternion. q = w + xi + yj + zk */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public final class Quatf {
 
     public Quatf(float x, float y, float z, float w) {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/ReformEvent.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/ReformEvent.java
index b8285d0..fc8a5f0 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/ReformEvent.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/ReformEvent.java
@@ -16,9 +16,11 @@
 
 package com.android.extensions.xr.node;
 
+import androidx.annotation.RestrictTo;
 
 /** A reform (move / resize) event. */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class ReformEvent {
 
     ReformEvent() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/ReformOptions.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/ReformOptions.java
index cbd096b..3c0242c 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/ReformOptions.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/ReformOptions.java
@@ -16,12 +16,14 @@
 
 package com.android.extensions.xr.node;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Configuration options for reform (move/resize) UX. To create a ReformOptions instance, call
  * {@code XrExtensions.createReformOptions()}.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class ReformOptions {
 
     ReformOptions() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Vec3.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Vec3.java
index 2dee764..746d909 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Vec3.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/node/Vec3.java
@@ -16,9 +16,11 @@
 
 package com.android.extensions.xr.node;
 
+import androidx.annotation.RestrictTo;
 
 /** 3D vector. */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public final class Vec3 {
 
     public Vec3(float x, float y, float z) {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/passthrough/PassthroughState.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/passthrough/PassthroughState.java
index 7a5f2c7..42f3901 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/passthrough/PassthroughState.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/passthrough/PassthroughState.java
@@ -16,9 +16,11 @@
 
 package com.android.extensions.xr.passthrough;
 
+import androidx.annotation.RestrictTo;
 
 /** Allows to configure the passthrough when the application is in full-space mode. */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class PassthroughState {
 
     PassthroughState() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/ActivityPanel.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/ActivityPanel.java
index 2b3d866..c33ca4a 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/ActivityPanel.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/ActivityPanel.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.space;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Defines the panel in XR scene to support embedding activities within a host activity.
@@ -24,6 +25,7 @@
  * com.android.extensions.xr.space.ActivityPanel ActivityPanel} will also be destroyed.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class ActivityPanel {
 
     ActivityPanel() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/ActivityPanelLaunchParameters.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/ActivityPanelLaunchParameters.java
index d97fd88..cf58741 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/ActivityPanelLaunchParameters.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/ActivityPanelLaunchParameters.java
@@ -16,12 +16,14 @@
 
 package com.android.extensions.xr.space;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Defines the launch parameters when creating an {@link
  * com.android.extensions.xr.space.ActivityPanel ActivityPanel}.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public final class ActivityPanelLaunchParameters {
 
     /**
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/Bounds.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/Bounds.java
index beb02b8fc..5562fc58d 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/Bounds.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/Bounds.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.space;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Bounds values in meters.
@@ -23,6 +24,7 @@
  * @see androidx.xr.extensions.XrExtensions#getSpatialState
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class Bounds {
 
     public Bounds(float width, float height, float depth) {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/BoundsChangeEvent.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/BoundsChangeEvent.java
index f86cb73..255c6198 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/BoundsChangeEvent.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/BoundsChangeEvent.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.space;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Triggers when there is a bounds change. For example, resize the panel in home space, or
@@ -24,6 +25,7 @@
  * @deprecated Use SpatialState instead.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 @Deprecated
 public final class BoundsChangeEvent implements com.android.extensions.xr.space.SpatialStateEvent {
 
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/EnvironmentControlChangeEvent.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/EnvironmentControlChangeEvent.java
index 1fcabeb..73ec74e 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/EnvironmentControlChangeEvent.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/EnvironmentControlChangeEvent.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.space;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Triggers when the ability to control the environment changes.
@@ -23,6 +24,7 @@
  * @deprecated Use SpatialState instead.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 @Deprecated
 public final class EnvironmentControlChangeEvent
         implements com.android.extensions.xr.space.SpatialStateEvent {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/EnvironmentVisibilityChangeEvent.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/EnvironmentVisibilityChangeEvent.java
index afac561..233f5c7 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/EnvironmentVisibilityChangeEvent.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/EnvironmentVisibilityChangeEvent.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.space;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * For all resumed top activities with this spatialstate callback set, this is called whenever the
@@ -24,6 +25,7 @@
  * @deprecated Use SpatialState instead.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 @Deprecated
 public final class EnvironmentVisibilityChangeEvent
         implements com.android.extensions.xr.space.SpatialStateEvent {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/HitTestResult.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/HitTestResult.java
index 2891c0d..007a3ca 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/HitTestResult.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/HitTestResult.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.space;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Hit test result.
@@ -23,6 +24,7 @@
  * @see androidx.xr.extensions.XrExtensions#hitTest
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class HitTestResult {
 
     HitTestResult() {
@@ -64,6 +66,7 @@
     public static final int SURFACE_UNKNOWN = 0; // 0x0
 
     @SuppressWarnings({"unchecked", "deprecation", "all"})
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
     public static final class Builder {
 
         public Builder(
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialCapabilities.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialCapabilities.java
index c250719..a9f25752 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialCapabilities.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialCapabilities.java
@@ -16,9 +16,11 @@
 
 package com.android.extensions.xr.space;
 
+import androidx.annotation.RestrictTo;
 
 /** Represents a set of capabilities an activity has. */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class SpatialCapabilities {
 
     public SpatialCapabilities() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialCapabilityChangeEvent.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialCapabilityChangeEvent.java
index fbddc6a..be1b160 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialCapabilityChangeEvent.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialCapabilityChangeEvent.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.space;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Triggers when the spatial capability set has changed.
@@ -23,6 +24,7 @@
  * @deprecated Use SpatialState instead.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 @Deprecated
 public final class SpatialCapabilityChangeEvent
         implements com.android.extensions.xr.space.SpatialStateEvent {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialState.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialState.java
index de77088..bd2356f 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialState.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialState.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.space;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * An interface that represents an activity's spatial state.
@@ -27,6 +28,7 @@
  * @see androidx.xr.extensions.XrExtensions#registerSpatialStateCallback
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class SpatialState {
 
     SpatialState() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialStateEvent.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialStateEvent.java
index 2eff54b..7f520fb 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialStateEvent.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/space/SpatialStateEvent.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.space;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Base class for spatial state change events.
@@ -24,5 +25,6 @@
  * @deprecated Use SpatialState instead.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 @Deprecated
 public interface SpatialStateEvent {}
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/splitengine/SplitEngineBridge.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/splitengine/SplitEngineBridge.java
index df40a8d..fcc89dd 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/splitengine/SplitEngineBridge.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/splitengine/SplitEngineBridge.java
@@ -16,9 +16,11 @@
 
 package com.android.extensions.xr.splitengine;
 
+import androidx.annotation.RestrictTo;
 
 /** Wrapper object around a native SplitEngineBridge. */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class SplitEngineBridge {
 
     SplitEngineBridge() {
diff --git a/xr/xr-stubs/src/main/java/com/android/extensions/xr/subspace/Subspace.java b/xr/xr-stubs/src/main/java/com/android/extensions/xr/subspace/Subspace.java
index 015b4ed..e8bb053 100644
--- a/xr/xr-stubs/src/main/java/com/android/extensions/xr/subspace/Subspace.java
+++ b/xr/xr-stubs/src/main/java/com/android/extensions/xr/subspace/Subspace.java
@@ -16,6 +16,7 @@
 
 package com.android.extensions.xr.subspace;
 
+import androidx.annotation.RestrictTo;
 
 /**
  * Handle to a subspace in the system scene graph.
@@ -27,6 +28,7 @@
  * coordinate system, i.e. +X points to the right, +Y up, and +Z points towards the camera.
  */
 @SuppressWarnings({"unchecked", "deprecation", "all"})
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public class Subspace {
 
     Subspace() {
