Merge "Allow access to consumed WindowInsets" into androidx-main
diff --git a/activity/activity-compose/api/1.6.0-beta01.txt b/activity/activity-compose/api/1.6.0-beta01.txt
index a679906..66989c4 100644
--- a/activity/activity-compose/api/1.6.0-beta01.txt
+++ b/activity/activity-compose/api/1.6.0-beta01.txt
@@ -36,10 +36,5 @@
     method @Deprecated public void unregister();
   }
 
-  public final class ReportLoadedKt {
-    method @androidx.compose.runtime.Composable public static void ReportLoadedAfter(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
-    method @androidx.compose.runtime.Composable public static void ReportLoadedWhen(kotlin.jvm.functions.Function0<java.lang.Boolean> predicate);
-  }
-
 }
 
diff --git a/activity/activity-compose/api/current.txt b/activity/activity-compose/api/current.txt
index a679906..66989c4 100644
--- a/activity/activity-compose/api/current.txt
+++ b/activity/activity-compose/api/current.txt
@@ -36,10 +36,5 @@
     method @Deprecated public void unregister();
   }
 
-  public final class ReportLoadedKt {
-    method @androidx.compose.runtime.Composable public static void ReportLoadedAfter(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
-    method @androidx.compose.runtime.Composable public static void ReportLoadedWhen(kotlin.jvm.functions.Function0<java.lang.Boolean> predicate);
-  }
-
 }
 
diff --git a/activity/activity-compose/api/public_plus_experimental_1.6.0-beta01.txt b/activity/activity-compose/api/public_plus_experimental_1.6.0-beta01.txt
index a679906..66989c4 100644
--- a/activity/activity-compose/api/public_plus_experimental_1.6.0-beta01.txt
+++ b/activity/activity-compose/api/public_plus_experimental_1.6.0-beta01.txt
@@ -36,10 +36,5 @@
     method @Deprecated public void unregister();
   }
 
-  public final class ReportLoadedKt {
-    method @androidx.compose.runtime.Composable public static void ReportLoadedAfter(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
-    method @androidx.compose.runtime.Composable public static void ReportLoadedWhen(kotlin.jvm.functions.Function0<java.lang.Boolean> predicate);
-  }
-
 }
 
diff --git a/activity/activity-compose/api/public_plus_experimental_current.txt b/activity/activity-compose/api/public_plus_experimental_current.txt
index a679906..66989c4 100644
--- a/activity/activity-compose/api/public_plus_experimental_current.txt
+++ b/activity/activity-compose/api/public_plus_experimental_current.txt
@@ -36,10 +36,5 @@
     method @Deprecated public void unregister();
   }
 
-  public final class ReportLoadedKt {
-    method @androidx.compose.runtime.Composable public static void ReportLoadedAfter(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
-    method @androidx.compose.runtime.Composable public static void ReportLoadedWhen(kotlin.jvm.functions.Function0<java.lang.Boolean> predicate);
-  }
-
 }
 
diff --git a/activity/activity-compose/api/restricted_1.6.0-beta01.txt b/activity/activity-compose/api/restricted_1.6.0-beta01.txt
index a679906..66989c4 100644
--- a/activity/activity-compose/api/restricted_1.6.0-beta01.txt
+++ b/activity/activity-compose/api/restricted_1.6.0-beta01.txt
@@ -36,10 +36,5 @@
     method @Deprecated public void unregister();
   }
 
-  public final class ReportLoadedKt {
-    method @androidx.compose.runtime.Composable public static void ReportLoadedAfter(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
-    method @androidx.compose.runtime.Composable public static void ReportLoadedWhen(kotlin.jvm.functions.Function0<java.lang.Boolean> predicate);
-  }
-
 }
 
diff --git a/activity/activity-compose/api/restricted_current.txt b/activity/activity-compose/api/restricted_current.txt
index a679906..66989c4 100644
--- a/activity/activity-compose/api/restricted_current.txt
+++ b/activity/activity-compose/api/restricted_current.txt
@@ -36,10 +36,5 @@
     method @Deprecated public void unregister();
   }
 
-  public final class ReportLoadedKt {
-    method @androidx.compose.runtime.Composable public static void ReportLoadedAfter(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
-    method @androidx.compose.runtime.Composable public static void ReportLoadedWhen(kotlin.jvm.functions.Function0<java.lang.Boolean> predicate);
-  }
-
 }
 
diff --git a/activity/activity-compose/samples/src/main/java/androidx/activity/compose/samples/ReportLoadedSamples.kt b/activity/activity-compose/samples/src/main/java/androidx/activity/compose/samples/ReportLoadedSamples.kt
deleted file mode 100644
index e569c35..0000000
--- a/activity/activity-compose/samples/src/main/java/androidx/activity/compose/samples/ReportLoadedSamples.kt
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package androidx.activity.compose.samples
-
-import androidx.activity.compose.ReportLoadedAfter
-import androidx.activity.compose.ReportLoadedWhen
-import androidx.annotation.Sampled
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.lazy.LazyColumn
-import androidx.compose.foundation.lazy.LazyListState
-import androidx.compose.material.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.Modifier
-
-@Sampled
-@Composable
-fun ReportLoadedWhenSample() {
-    var contentComposed by remember { mutableStateOf(false) }
-    LazyColumn(modifier = Modifier.fillMaxSize()) {
-        items(100) {
-            contentComposed = true
-            Text("Hello World $it")
-        }
-    }
-    ReportLoadedWhen { contentComposed }
-}
-
-@Sampled
-@Composable
-fun ReportLoadedAfterSample() {
-    val lazyListState = remember { LazyListState() }
-    ReportLoadedAfter {
-        lazyListState.animateScrollToItem(10)
-    }
-}
\ No newline at end of file
diff --git a/activity/activity-compose/src/androidTest/AndroidManifest.xml b/activity/activity-compose/src/androidTest/AndroidManifest.xml
index d2149a0..9cd4123 100644
--- a/activity/activity-compose/src/androidTest/AndroidManifest.xml
+++ b/activity/activity-compose/src/androidTest/AndroidManifest.xml
@@ -14,11 +14,4 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android">
-    <application>
-        <activity
-            android:name="androidx.activity.compose.TestActivity"
-            android:theme="@android:style/Theme.Material.NoActionBar.Fullscreen" />
-    </application>
-</manifest>
+<manifest />
diff --git a/activity/activity-compose/src/androidTest/java/androidx/activity/compose/ReportLoadedTest.kt b/activity/activity-compose/src/androidTest/java/androidx/activity/compose/ReportLoadedTest.kt
deleted file mode 100644
index 57c8490..0000000
--- a/activity/activity-compose/src/androidTest/java/androidx/activity/compose/ReportLoadedTest.kt
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package androidx.activity.compose
-
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.platform.ComposeView
-import androidx.compose.ui.test.junit4.createAndroidComposeRule
-import androidx.compose.ui.viewinterop.AndroidView
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.MediumTest
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.sync.Mutex
-import kotlinx.coroutines.sync.withLock
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@MediumTest
-@RunWith(AndroidJUnit4::class)
-class ReportLoadedTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
-
-    @Test
-    fun testReportFullyLoadedWhen() {
-        var ready by mutableStateOf(false)
-        var readyChecks = 0
-        rule.setContent {
-            ReportLoadedWhen {
-                readyChecks++
-                ready
-            }
-        }
-
-        rule.waitForIdle()
-        assertThat(rule.activity.reportFullyDrawnCalled).isFalse()
-        assertThat(readyChecks).isEqualTo(1)
-
-        ready = true
-
-        // Must recompose
-        rule.waitForIdle()
-        assertThat(rule.activity.reportFullyDrawnCalled).isTrue()
-        assertThat(readyChecks).isEqualTo(2)
-
-        // Shouldn't repeat the reportFullyDrawn()
-        ready = false
-        rule.waitForIdle()
-        rule.activity.reportFullyDrawnCalled = false
-        assertThat(readyChecks).isEqualTo(2)
-
-        ready = true
-        rule.waitForIdle()
-        assertThat(rule.activity.reportFullyDrawnCalled).isFalse()
-        assertThat(readyChecks).isEqualTo(2)
-    }
-
-    @Test
-    fun testReportFullyLoadedAfter() {
-        val recomposeInt = mutableStateOf(0)
-        val mutex = Mutex(locked = true)
-        var lockChecks = 0
-        rule.setContent {
-            recomposeInt.value
-            ReportLoadedAfter {
-                lockChecks++
-                mutex.withLock { }
-            }
-        }
-
-        rule.waitForIdle()
-        assertThat(rule.activity.reportFullyDrawnCalled).isFalse()
-        assertThat(lockChecks).isEqualTo(1)
-
-        mutex.unlock()
-
-        // Should complete as soon as the coroutine is scheduled, which is on the UI thread.
-        // We just need to wait our turn for the UI thread:
-        rule.runOnUiThread {
-            assertThat(rule.activity.reportFullyDrawnCalled).isTrue()
-            assertThat(lockChecks).isEqualTo(1)
-        }
-
-        // Shouldn't repeat the reportFullyDrawn()
-        rule.activity.reportFullyDrawnCalled = false
-        assertThat(mutex.tryLock()).isTrue()
-        recomposeInt.value = 1
-        rule.waitForIdle()
-
-        assertThat(rule.activity.reportFullyDrawnCalled).isFalse()
-        assertThat(lockChecks).isEqualTo(1)
-    }
-
-    @Test
-    fun waitUntilTwoAreLoaded() {
-        val mutex = Mutex(locked = true)
-        var conditionReady by mutableStateOf(false)
-        rule.setContent {
-            ReportLoadedWhen {
-                conditionReady
-            }
-            ReportLoadedAfter {
-                mutex.withLock { }
-            }
-        }
-
-        rule.waitForIdle()
-        assertThat(rule.activity.reportFullyDrawnCalled).isFalse()
-
-        conditionReady = true
-        rule.waitForIdle()
-
-        assertThat(rule.activity.reportFullyDrawnCalled).isFalse()
-
-        mutex.unlock()
-
-        // Should complete as soon as the coroutine is scheduled, which is on the UI thread.
-        // We just need to wait our turn for the UI thread:
-        rule.runOnUiThread {
-            assertThat(rule.activity.reportFullyDrawnCalled).isTrue()
-        }
-    }
-
-    // same as above, but the order is swapped
-    @Test
-    fun waitUntilTwoAreLoaded2() {
-        val mutex = Mutex(locked = true)
-        var conditionReady by mutableStateOf(false)
-        rule.setContent {
-            ReportLoadedWhen {
-                conditionReady
-            }
-            ReportLoadedAfter {
-                mutex.withLock { }
-            }
-        }
-
-        rule.waitForIdle()
-        assertThat(rule.activity.reportFullyDrawnCalled).isFalse()
-
-        mutex.unlock()
-
-        // Should complete as soon as the coroutine is scheduled, which is on the UI thread.
-        // We just need to wait our turn for the UI thread:
-        rule.runOnUiThread {
-            assertThat(rule.activity.reportFullyDrawnCalled).isFalse()
-        }
-
-        conditionReady = true
-        rule.waitForIdle()
-
-        assertThat(rule.activity.reportFullyDrawnCalled).isTrue()
-    }
-
-    @Test
-    fun waitForTwoDifferentComposeViews() {
-        val mutex = Mutex(locked = true)
-        var conditionReady by mutableStateOf(false)
-        rule.setContent {
-            AndroidView(factory = { context ->
-                ComposeView(context).apply {
-                    setContent {
-                        ReportLoadedWhen {
-                            conditionReady
-                        }
-                    }
-                }
-            })
-            AndroidView(factory = { context ->
-                ComposeView(context).apply {
-                    setContent {
-                        ReportLoadedAfter {
-                            mutex.withLock { }
-                        }
-                    }
-                }
-            })
-        }
-
-        rule.waitForIdle()
-        assertThat(rule.activity.reportFullyDrawnCalled).isFalse()
-
-        mutex.unlock()
-        rule.runOnUiThread {
-            assertThat(rule.activity.reportFullyDrawnCalled).isFalse()
-        }
-
-        conditionReady = true
-        rule.waitForIdle()
-
-        assertThat(rule.activity.reportFullyDrawnCalled).isTrue()
-    }
-
-    @Test
-    fun removedCondition() {
-        var condition1 by mutableStateOf(false)
-        val condition2 by mutableStateOf(false)
-        var useCondition2 by mutableStateOf(true)
-
-        rule.setContent {
-            ReportLoadedWhen {
-                condition1
-            }
-            if (useCondition2) {
-                ReportLoadedWhen {
-                    condition2
-                }
-            }
-        }
-
-        rule.waitForIdle()
-        assertThat(rule.activity.reportFullyDrawnCalled).isFalse()
-
-        condition1 = true
-        rule.waitForIdle()
-        assertThat(rule.activity.reportFullyDrawnCalled).isFalse()
-
-        useCondition2 = false
-        rule.waitForIdle()
-        assertThat(rule.activity.reportFullyDrawnCalled).isTrue()
-    }
-}
diff --git a/activity/activity-compose/src/main/java/androidx/activity/compose/ReportLoaded.kt b/activity/activity-compose/src/main/java/androidx/activity/compose/ReportLoaded.kt
deleted file mode 100644
index 592d0f6..0000000
--- a/activity/activity-compose/src/main/java/androidx/activity/compose/ReportLoaded.kt
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package androidx.activity.compose
-
-import android.app.Activity
-import androidx.activity.FullyLoadedReporter
-import androidx.activity.reportWhenComplete
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.snapshots.SnapshotStateObserver
-import androidx.compose.ui.platform.LocalView
-
-/**
- * Manages the composition callback for [ReportLoadedWhen].
- */
-private class ReportLoadedComposition(
-    private val fullyLoadedReporter: FullyLoadedReporter
-) : () -> Unit {
-
-    private val snapshotStateObserver = SnapshotStateObserver { command ->
-        command()
-    }.apply {
-        start()
-    }
-
-    /**
-     * Called whenever the values read in the lambda parameter has changed.
-     */
-    private val checkReporter: (() -> Boolean) -> Unit = ::observeReporter
-
-    init {
-        fullyLoadedReporter.addOnReportLoadedListener(this)
-    }
-
-    /**
-     * Called when the [FullyLoadedReporter] has called [Activity.reportFullyDrawn]. This
-     * stops watching for changes to the snapshot.
-     */
-    override fun invoke() {
-        snapshotStateObserver.clear()
-        snapshotStateObserver.stop()
-        // We don't need this instance anymore
-        fullyLoadedReporter.activity.window.decorView.setTag(R.id.report_loaded_composition, null)
-     }
-
-    /**
-     * Tells the [FullyLoadedReporter] to wait until [removeReporter] is called before
-     * calling [Activity.reportFullyDrawn].
-     */
-    fun addReporter(reporter: () -> Boolean) {
-        if (!fullyLoadedReporter.hasReported) {
-            fullyLoadedReporter.addReporter()
-            observeReporter(reporter)
-        }
-    }
-
-    /**
-     * Tells the [FullyLoadedReporter] that one of the report conditions that caused
-     * [addReporter] to be called has passed and that [Activity.reportFullyDrawn] can
-     * be called if it is the last one to pass.
-     */
-    fun removeReporter(reporter: () -> Boolean) {
-        if (!fullyLoadedReporter.hasReported) {
-            snapshotStateObserver.clear(reporter)
-            fullyLoadedReporter.removeReporter()
-        }
-    }
-
-    private fun observeReporter(reporter: () -> Boolean) {
-        var reporterPassed = false
-        snapshotStateObserver.observeReads(reporter, checkReporter) {
-            reporterPassed = reporter()
-        }
-        if (reporterPassed) {
-            removeReporter(reporter)
-        }
-    }
-}
-
-/**
- * Adds [predicate] to the conditions that must be met prior to [Activity.reportFullyDrawn]
- * being called.
- *
- * The [Activity] used is extracted from the [LocalView]'s context.
- *
- * @sample androidx.activity.compose.samples.ReportLoadedWhenSample
- */
-@Composable
-fun ReportLoadedWhen(
-    predicate: () -> Boolean
-) {
-    val view = LocalView.current
-    DisposableEffect(view, predicate) {
-        val fullyLoadedReporter = FullyLoadedReporter.findFullyLoadedReporter(view.context)
-        if (fullyLoadedReporter == null || fullyLoadedReporter.hasReported) {
-            onDispose {}
-        } else {
-            val decorView = fullyLoadedReporter.activity.window.decorView
-            val compositionLoaded =
-                decorView.getTag(R.id.report_loaded_composition) as? ReportLoadedComposition
-                    ?: ReportLoadedComposition(fullyLoadedReporter).also {
-                        decorView.setTag(R.id.report_loaded_composition, it)
-                    }
-            compositionLoaded.addReporter(predicate)
-            onDispose {
-                compositionLoaded.removeReporter(predicate)
-            }
-        }
-    }
-}
-
-/**
- * Adds [block] to the methods that must complete prior to [Activity.reportFullyDrawn]
- * being called.
- *
- * The [Activity] used is extracted from the [LocalView]'s context.
- *
- * After [Activity.reportFullyDrawn] has been called, [block] will not be called again, even on
- * recomposition.
- *
- * @sample androidx.activity.compose.samples.ReportLoadedAfterSample
- */
-@Composable
-fun ReportLoadedAfter(
-    block: suspend () -> Unit
-) {
-    val view = LocalView.current
-    LaunchedEffect(block, view) {
-        FullyLoadedReporter.findFullyLoadedReporter(view.context)?.reportWhenComplete(block)
-    }
-}
diff --git a/activity/activity/api/1.6.0-beta01.txt b/activity/activity/api/1.6.0-beta01.txt
index eaf46d0..08fffc8 100644
--- a/activity/activity/api/1.6.0-beta01.txt
+++ b/activity/activity/api/1.6.0-beta01.txt
@@ -52,27 +52,6 @@
     method @CallSuper public void onBackPressed();
   }
 
-  @RequiresApi(android.os.Build.VERSION_CODES.KITKAT) public final class FullyLoadedReporter {
-    method public void addOnReportLoadedListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
-    method public void addReporter();
-    method @MainThread public static androidx.activity.FullyLoadedReporter? findFullyLoadedReporter(android.content.Context context);
-    method public android.app.Activity getActivity();
-    method public boolean getHasReported();
-    method public void removeOnReportLoadedListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
-    method public void removeReporter();
-    property public final android.app.Activity activity;
-    property public final boolean hasReported;
-    field public static final androidx.activity.FullyLoadedReporter.Companion Companion;
-  }
-
-  public static final class FullyLoadedReporter.Companion {
-    method @MainThread public androidx.activity.FullyLoadedReporter? findFullyLoadedReporter(android.content.Context context);
-  }
-
-  public final class FullyLoadedReporterKt {
-    method @RequiresApi(android.os.Build.VERSION_CODES.KITKAT) public static suspend inline Object? reportWhenComplete(androidx.activity.FullyLoadedReporter, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> reporter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-  }
-
   public abstract class OnBackPressedCallback {
     ctor public OnBackPressedCallback(boolean);
     method @MainThread public abstract void handleOnBackPressed();
diff --git a/activity/activity/api/current.txt b/activity/activity/api/current.txt
index eaf46d0..08fffc8 100644
--- a/activity/activity/api/current.txt
+++ b/activity/activity/api/current.txt
@@ -52,27 +52,6 @@
     method @CallSuper public void onBackPressed();
   }
 
-  @RequiresApi(android.os.Build.VERSION_CODES.KITKAT) public final class FullyLoadedReporter {
-    method public void addOnReportLoadedListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
-    method public void addReporter();
-    method @MainThread public static androidx.activity.FullyLoadedReporter? findFullyLoadedReporter(android.content.Context context);
-    method public android.app.Activity getActivity();
-    method public boolean getHasReported();
-    method public void removeOnReportLoadedListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
-    method public void removeReporter();
-    property public final android.app.Activity activity;
-    property public final boolean hasReported;
-    field public static final androidx.activity.FullyLoadedReporter.Companion Companion;
-  }
-
-  public static final class FullyLoadedReporter.Companion {
-    method @MainThread public androidx.activity.FullyLoadedReporter? findFullyLoadedReporter(android.content.Context context);
-  }
-
-  public final class FullyLoadedReporterKt {
-    method @RequiresApi(android.os.Build.VERSION_CODES.KITKAT) public static suspend inline Object? reportWhenComplete(androidx.activity.FullyLoadedReporter, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> reporter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-  }
-
   public abstract class OnBackPressedCallback {
     ctor public OnBackPressedCallback(boolean);
     method @MainThread public abstract void handleOnBackPressed();
diff --git a/activity/activity/api/public_plus_experimental_1.6.0-beta01.txt b/activity/activity/api/public_plus_experimental_1.6.0-beta01.txt
index eaf46d0..08fffc8 100644
--- a/activity/activity/api/public_plus_experimental_1.6.0-beta01.txt
+++ b/activity/activity/api/public_plus_experimental_1.6.0-beta01.txt
@@ -52,27 +52,6 @@
     method @CallSuper public void onBackPressed();
   }
 
-  @RequiresApi(android.os.Build.VERSION_CODES.KITKAT) public final class FullyLoadedReporter {
-    method public void addOnReportLoadedListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
-    method public void addReporter();
-    method @MainThread public static androidx.activity.FullyLoadedReporter? findFullyLoadedReporter(android.content.Context context);
-    method public android.app.Activity getActivity();
-    method public boolean getHasReported();
-    method public void removeOnReportLoadedListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
-    method public void removeReporter();
-    property public final android.app.Activity activity;
-    property public final boolean hasReported;
-    field public static final androidx.activity.FullyLoadedReporter.Companion Companion;
-  }
-
-  public static final class FullyLoadedReporter.Companion {
-    method @MainThread public androidx.activity.FullyLoadedReporter? findFullyLoadedReporter(android.content.Context context);
-  }
-
-  public final class FullyLoadedReporterKt {
-    method @RequiresApi(android.os.Build.VERSION_CODES.KITKAT) public static suspend inline Object? reportWhenComplete(androidx.activity.FullyLoadedReporter, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> reporter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-  }
-
   public abstract class OnBackPressedCallback {
     ctor public OnBackPressedCallback(boolean);
     method @MainThread public abstract void handleOnBackPressed();
diff --git a/activity/activity/api/public_plus_experimental_current.txt b/activity/activity/api/public_plus_experimental_current.txt
index eaf46d0..08fffc8 100644
--- a/activity/activity/api/public_plus_experimental_current.txt
+++ b/activity/activity/api/public_plus_experimental_current.txt
@@ -52,27 +52,6 @@
     method @CallSuper public void onBackPressed();
   }
 
-  @RequiresApi(android.os.Build.VERSION_CODES.KITKAT) public final class FullyLoadedReporter {
-    method public void addOnReportLoadedListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
-    method public void addReporter();
-    method @MainThread public static androidx.activity.FullyLoadedReporter? findFullyLoadedReporter(android.content.Context context);
-    method public android.app.Activity getActivity();
-    method public boolean getHasReported();
-    method public void removeOnReportLoadedListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
-    method public void removeReporter();
-    property public final android.app.Activity activity;
-    property public final boolean hasReported;
-    field public static final androidx.activity.FullyLoadedReporter.Companion Companion;
-  }
-
-  public static final class FullyLoadedReporter.Companion {
-    method @MainThread public androidx.activity.FullyLoadedReporter? findFullyLoadedReporter(android.content.Context context);
-  }
-
-  public final class FullyLoadedReporterKt {
-    method @RequiresApi(android.os.Build.VERSION_CODES.KITKAT) public static suspend inline Object? reportWhenComplete(androidx.activity.FullyLoadedReporter, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> reporter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-  }
-
   public abstract class OnBackPressedCallback {
     ctor public OnBackPressedCallback(boolean);
     method @MainThread public abstract void handleOnBackPressed();
diff --git a/activity/activity/api/restricted_1.6.0-beta01.txt b/activity/activity/api/restricted_1.6.0-beta01.txt
index cf90f3c..75909c6 100644
--- a/activity/activity/api/restricted_1.6.0-beta01.txt
+++ b/activity/activity/api/restricted_1.6.0-beta01.txt
@@ -51,27 +51,6 @@
     method @CallSuper public void onBackPressed();
   }
 
-  @RequiresApi(android.os.Build.VERSION_CODES.KITKAT) public final class FullyLoadedReporter {
-    method public void addOnReportLoadedListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
-    method public void addReporter();
-    method @MainThread public static androidx.activity.FullyLoadedReporter? findFullyLoadedReporter(android.content.Context context);
-    method public android.app.Activity getActivity();
-    method public boolean getHasReported();
-    method public void removeOnReportLoadedListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
-    method public void removeReporter();
-    property public final android.app.Activity activity;
-    property public final boolean hasReported;
-    field public static final androidx.activity.FullyLoadedReporter.Companion Companion;
-  }
-
-  public static final class FullyLoadedReporter.Companion {
-    method @MainThread public androidx.activity.FullyLoadedReporter? findFullyLoadedReporter(android.content.Context context);
-  }
-
-  public final class FullyLoadedReporterKt {
-    method @RequiresApi(android.os.Build.VERSION_CODES.KITKAT) public static suspend inline Object? reportWhenComplete(androidx.activity.FullyLoadedReporter, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> reporter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-  }
-
   public abstract class OnBackPressedCallback {
     ctor public OnBackPressedCallback(boolean);
     method @MainThread public abstract void handleOnBackPressed();
diff --git a/activity/activity/api/restricted_current.txt b/activity/activity/api/restricted_current.txt
index cf90f3c..75909c6 100644
--- a/activity/activity/api/restricted_current.txt
+++ b/activity/activity/api/restricted_current.txt
@@ -51,27 +51,6 @@
     method @CallSuper public void onBackPressed();
   }
 
-  @RequiresApi(android.os.Build.VERSION_CODES.KITKAT) public final class FullyLoadedReporter {
-    method public void addOnReportLoadedListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
-    method public void addReporter();
-    method @MainThread public static androidx.activity.FullyLoadedReporter? findFullyLoadedReporter(android.content.Context context);
-    method public android.app.Activity getActivity();
-    method public boolean getHasReported();
-    method public void removeOnReportLoadedListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
-    method public void removeReporter();
-    property public final android.app.Activity activity;
-    property public final boolean hasReported;
-    field public static final androidx.activity.FullyLoadedReporter.Companion Companion;
-  }
-
-  public static final class FullyLoadedReporter.Companion {
-    method @MainThread public androidx.activity.FullyLoadedReporter? findFullyLoadedReporter(android.content.Context context);
-  }
-
-  public final class FullyLoadedReporterKt {
-    method @RequiresApi(android.os.Build.VERSION_CODES.KITKAT) public static suspend inline Object? reportWhenComplete(androidx.activity.FullyLoadedReporter, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> reporter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-  }
-
   public abstract class OnBackPressedCallback {
     ctor public OnBackPressedCallback(boolean);
     method @MainThread public abstract void handleOnBackPressed();
diff --git a/activity/activity/src/androidTest/AndroidManifest.xml b/activity/activity/src/androidTest/AndroidManifest.xml
index 25407d9..6e0f394 100644
--- a/activity/activity/src/androidTest/AndroidManifest.xml
+++ b/activity/activity/src/androidTest/AndroidManifest.xml
@@ -79,9 +79,6 @@
         <activity
             android:name="androidx.activity.OptionMenuNoSuperActivity"
             android:exported="true" />
-        <activity
-            android:name="androidx.activity.FullyLoadedActivity"
-            android:exported="true" />
     </application>
 
 </manifest>
diff --git a/activity/activity/src/androidTest/java/androidx/activity/FullyLoadedReporterTest.kt b/activity/activity/src/androidTest/java/androidx/activity/FullyLoadedReporterTest.kt
deleted file mode 100644
index 5a36aef..0000000
--- a/activity/activity/src/androidTest/java/androidx/activity/FullyLoadedReporterTest.kt
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package androidx.activity
-
-import android.app.Dialog
-import android.content.Context
-import android.os.Build
-import android.view.View
-import androidx.test.core.app.ActivityScenario
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
-import androidx.testutils.withActivity
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.runBlocking
-import kotlinx.coroutines.sync.Mutex
-import org.junit.Assert.assertFalse
-import org.junit.Assert.assertNotNull
-import org.junit.Assert.assertSame
-import org.junit.Assert.assertTrue
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@MediumTest
-@RunWith(AndroidJUnit4::class)
-@SdkSuppress(minSdkVersion = Build.VERSION_CODES.KITKAT)
-class FullyLoadedReporterTest {
-    @Test
-    fun findFullyLoadedReporter() {
-        with(ActivityScenario.launch(FullyLoadedActivity::class.java)) {
-            val fullyLoadedReporter = withActivity {
-                val view = View(this)
-                setContentView(view)
-                val reporter = FullyLoadedReporter.findFullyLoadedReporter(this)
-                assertNotNull(reporter)
-                reporter!!
-            }
-            withActivity {
-                assertSame(fullyLoadedReporter, FullyLoadedReporter.findFullyLoadedReporter(this))
-            }
-        }
-    }
-
-    @Test
-    fun findFullyLoadedReporterInDialog() {
-        with(ActivityScenario.launch(FullyLoadedActivity::class.java)) {
-            lateinit var dialogContext: Context
-            withActivity {
-                val view1 = View(this)
-                setContentView(view1)
-                val dialog = Dialog(this)
-                val view2 = View(dialog.context)
-                dialog.setContentView(view2)
-                dialogContext = dialog.context
-            }
-            withActivity {
-                val activityReporter = FullyLoadedReporter.findFullyLoadedReporter(this)
-                val dialogReporter = FullyLoadedReporter.findFullyLoadedReporter(dialogContext)
-                assertSame(activityReporter, dialogReporter)
-            }
-        }
-    }
-
-    @Test
-    fun reportWhenComplete() {
-        with(ActivityScenario.launch(FullyLoadedActivity::class.java)) {
-            lateinit var fullyLoadedReporter: FullyLoadedReporter
-            withActivity {
-                val view = View(this)
-                setContentView(view)
-                fullyLoadedReporter = FullyLoadedReporter.findFullyLoadedReporter(this)!!
-            }
-            val mutex = Mutex(true)
-            runBlocking {
-                launch {
-                    fullyLoadedReporter.reportWhenComplete {
-                        mutex.lock()
-                        mutex.unlock()
-                    }
-                }
-                delay(1L)
-                waitForPostAnimation {
-                    assertFalse(fullyDrawnReported)
-                }
-                mutex.unlock()
-                delay(1L)
-                waitForPostAnimation {
-                    assertTrue(fullyDrawnReported)
-                }
-            }
-        }
-    }
-
-    @Test
-    fun addReporter() {
-        with(ActivityScenario.launch(FullyLoadedActivity::class.java)) {
-            val fullyLoadedReporter = withActivity {
-                FullyLoadedReporter.findFullyLoadedReporter(this)!!
-            }
-            fullyLoadedReporter.addReporter()
-            fullyLoadedReporter.addReporter()
-            fullyLoadedReporter.removeReporter()
-
-            waitForPostAnimation {
-                assertFalse(fullyDrawnReported)
-            }
-            fullyLoadedReporter.removeReporter()
-            waitForPostAnimation {
-                assertTrue(fullyDrawnReported)
-            }
-        }
-    }
-
-    @Test
-    fun reporterAndReportWhen() {
-        with(ActivityScenario.launch(FullyLoadedActivity::class.java)) {
-            val fullyLoadedReporter = withActivity {
-                FullyLoadedReporter.findFullyLoadedReporter(this)!!
-            }
-            fullyLoadedReporter.addReporter()
-            val mutex = Mutex(true)
-            runBlocking {
-                launch {
-                    fullyLoadedReporter.reportWhenComplete {
-                        mutex.lock()
-                        mutex.unlock()
-                    }
-                }
-                delay(1L) // wait for launch
-                fullyLoadedReporter.removeReporter()
-
-                waitForPostAnimation {
-                    assertFalse(fullyDrawnReported)
-                }
-                mutex.unlock()
-                delay(1L) // allow launch to continue
-                waitForPostAnimation {
-                    assertTrue(fullyDrawnReported)
-                }
-            }
-        }
-    }
-
-    @Test
-    fun reportWhenAndReporter() {
-        with(ActivityScenario.launch(FullyLoadedActivity::class.java)) {
-            val fullyLoadedReporter = withActivity {
-                FullyLoadedReporter.findFullyLoadedReporter(this)!!
-            }
-            fullyLoadedReporter.addReporter()
-            val mutex = Mutex(true)
-            runBlocking {
-                launch {
-                    fullyLoadedReporter.reportWhenComplete {
-                        mutex.lock()
-                        mutex.unlock()
-                    }
-                }
-                delay(1L) // wait for launch
-                mutex.unlock()
-                delay(1L) // allow launch to continue
-                waitForPostAnimation {
-                    assertFalse(fullyDrawnReported)
-                }
-
-                fullyLoadedReporter.removeReporter()
-                waitForPostAnimation {
-                    assertTrue(fullyDrawnReported)
-                }
-            }
-        }
-    }
-
-    @Test
-    fun reportListener() {
-        with(ActivityScenario.launch(FullyLoadedActivity::class.java)) {
-            var report1 = false
-            var report2 = false
-            var report3 = false
-            val reportListener1 = { report1 = true }
-            val reportListener2 = { report2 = true }
-            val reportListener3 = { report3 = true }
-
-            val fullyLoadedReporter = withActivity {
-                setContentView(View(this))
-                FullyLoadedReporter.findFullyLoadedReporter(this)!!
-            }
-            fullyLoadedReporter.addReporter()
-            fullyLoadedReporter.addOnReportLoadedListener(reportListener1)
-            fullyLoadedReporter.addOnReportLoadedListener(reportListener2)
-            fullyLoadedReporter.removeOnReportLoadedListener(reportListener2)
-            fullyLoadedReporter.removeReporter()
-            waitForPostAnimation {
-                assertTrue(report1)
-                assertFalse(report2)
-            }
-            fullyLoadedReporter.addOnReportLoadedListener(reportListener3)
-            assertTrue(report3)
-        }
-    }
-
-    private fun ActivityScenario<FullyLoadedActivity>.waitForPostAnimation(
-        block: FullyLoadedActivity.() -> Unit = {}
-    ) {
-        val countDownLatch = CountDownLatch(1)
-        withActivity {
-            runOnUiThread {
-                window.decorView.postOnAnimation {
-                    countDownLatch.countDown()
-                }
-                window.decorView.invalidate()
-            }
-        }
-        assertTrue(countDownLatch.await(10, TimeUnit.SECONDS))
-        withActivity {
-            block()
-        }
-    }
-}
-
-class FullyLoadedActivity : ComponentActivity() {
-    var fullyDrawnReported = false
-
-    override fun reportFullyDrawn() {
-        fullyDrawnReported = true
-        super.reportFullyDrawn()
-    }
-}
\ No newline at end of file
diff --git a/activity/activity/src/main/java/androidx/activity/FullyLoadedReporter.kt b/activity/activity/src/main/java/androidx/activity/FullyLoadedReporter.kt
deleted file mode 100644
index 3712ab0..0000000
--- a/activity/activity/src/main/java/androidx/activity/FullyLoadedReporter.kt
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package androidx.activity
-
-import android.app.Activity
-import android.content.Context
-import android.content.ContextWrapper
-import android.os.Build
-import android.os.Looper
-import androidx.annotation.GuardedBy
-import androidx.annotation.MainThread
-import androidx.annotation.RequiresApi
-
-/**
- * Manages when to call [Activity.reportFullyDrawn]. Different parts of the UI may
- * individually indicate when they are ready for interaction. [Activity.reportFullyDrawn]
- * will only be called when all parts are ready. At least one [addReporter] or
- * [reportWhenComplete] must be used before [Activity.reportFullyDrawn] will be called.
- *
- * For example, to use coroutines:
- * ```
- * val fullyDrawnReporter = FullyLoadedReporter.findFullyLoadedReporter(context)
- * launch {
- *     fullyDrawnReporter.reportWhenComplete {
- *         dataLoadedMutex.lock()
- *         dataLoadedMutex.unlock()
- *     }
- * }
- * ```
- * Or it can be manually controlled:
- * ```
- * // On worker thread:
- * FullyLoadedReporter.findFullyLoadedReporter(context).addReporter()
- * // Do the loading
- * FullyLoadedReporter.findFullyLoadedReporter(context).removeReporter()
- * ```
- */
-@RequiresApi(Build.VERSION_CODES.KITKAT)
-class FullyLoadedReporter private constructor(val activity: Activity) {
-    private val lock = Any()
-
-    private val decorView = activity.window.decorView
-
-    @GuardedBy("lock")
-    private var reporterCount = 0
-
-    @GuardedBy("lock")
-    private var reportPosted = false
-
-    @GuardedBy("lock")
-    private var reportedFullyDrawn = false
-
-    /**
-     * Returns `true` if [Activity.reportFullyDrawn] has been called or `false` otherwise.
-     */
-    val hasReported: Boolean
-        get() {
-            return synchronized(lock) { reportedFullyDrawn }
-        }
-
-    @GuardedBy("lock")
-    private val onReportCallbacks = mutableListOf<() -> Unit>()
-
-    private val reportOnAnimation: Runnable = Runnable {
-        synchronized(lock) {
-            reportPosted = false
-            if (reporterCount == 0) {
-                reportedFullyDrawn = true
-                activity.reportFullyDrawn()
-                onReportCallbacks.forEach { it() }
-                onReportCallbacks.clear()
-            }
-        }
-    }
-
-    /**
-     * Adds a lock to prevent calling [Activity.reportFullyDrawn].
-     */
-    fun addReporter() {
-        synchronized(lock) {
-            if (!reportedFullyDrawn) {
-                reporterCount++
-            }
-        }
-    }
-
-    /**
-     * Removes a lock added in [addReporter]. When all locks have been removed,
-     * [Activity.reportFullyDrawn] will be called on the next animation frame.
-     */
-    fun removeReporter() {
-        synchronized(lock) {
-            if (!reportedFullyDrawn) {
-                check(reporterCount > 0) {
-                    "removeReporter() called when all reporters have already been removed."
-                }
-                reporterCount--
-                postWhenReportersAreDone()
-            }
-        }
-    }
-
-    /**
-     * Registers [callback] to be called when [Activity.reportFullyDrawn] is called. If
-     * it has already been called, then [callback] will be called immediately.
-     */
-    fun addOnReportLoadedListener(callback: () -> Unit) {
-        val callImmediately =
-            synchronized(lock) {
-                if (reportedFullyDrawn) {
-                    true
-                } else {
-                    onReportCallbacks += callback
-                    false
-                }
-            }
-        if (callImmediately) {
-            callback()
-        }
-    }
-
-    /**
-     * Removes a previously registered [callback] so that it won't be called when
-     * [Activity.reportFullyDrawn] is called.
-     */
-    fun removeOnReportLoadedListener(callback: () -> Unit) {
-        synchronized(lock) {
-            onReportCallbacks -= callback
-        }
-    }
-
-    /**
-     * Posts a request to report that the Activity is fully drawn on the next animation frame.
-     * On the next animation frame, it will check again that there are no other reporters
-     * that have yet to complete.
-     */
-    private fun postWhenReportersAreDone() {
-        if (!reportPosted && reporterCount == 0) {
-            reportPosted = true
-            decorView.postOnAnimation(reportOnAnimation)
-            // Invalidate just in case no drawing was already scheduled
-            if (Looper.myLooper() != activity.mainLooper) {
-                decorView.postInvalidate()
-            } else {
-                decorView.invalidate()
-            }
-        }
-    }
-
-    companion object {
-        /**
-         * Finds the [FullyLoadedReporter] associated with the activity, creating one if
-         * necessary. `null` will be returned if [context] is not associated with
-         * an [Activity].
-         */
-        @JvmStatic
-        @MainThread
-        fun findFullyLoadedReporter(context: Context): FullyLoadedReporter? {
-            val activity = unwrapContext(context) ?: return null
-            val decorView = activity.window.decorView
-            return decorView.getTag(R.id.report_loaded) as? FullyLoadedReporter
-                ?: FullyLoadedReporter(activity).also {
-                    decorView.setTag(R.id.report_loaded, it)
-                }
-        }
-
-        @JvmStatic
-        internal fun unwrapContext(wrappedContext: Context): Activity? {
-            var context: Context? = wrappedContext
-            while (true) {
-                when (context) {
-                    is Activity -> return context
-                    is ContextWrapper -> context = context.baseContext
-                    else -> return null
-                }
-            }
-        }
-    }
-}
-
-/**
- * Tells the [FullyLoadedReporter] to wait until [reporter] has completed
- * before calling [Activity.reportFullyDrawn].
- */
-@RequiresApi(Build.VERSION_CODES.KITKAT)
-suspend inline fun FullyLoadedReporter.reportWhenComplete(
-    @Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE")
-    reporter: suspend () -> Unit
-) {
-    addReporter()
-    if (hasReported) {
-        return
-    }
-    try {
-        reporter()
-    } finally {
-        removeReporter()
-    }
-}
\ No newline at end of file
diff --git a/activity/activity/src/main/res/values/ids.xml b/activity/activity/src/main/res/values/ids.xml
index a1374d7..b1c5fee 100644
--- a/activity/activity/src/main/res/values/ids.xml
+++ b/activity/activity/src/main/res/values/ids.xml
@@ -16,5 +16,4 @@
 
 <resources>
     <id name="view_tree_on_back_pressed_dispatcher_owner" />
-    <item type="id" name="report_loaded"/>
 </resources>
\ No newline at end of file
diff --git a/annotation/annotation-experimental-lint/integration-tests/build.gradle b/annotation/annotation-experimental-lint/integration-tests/build.gradle
index 6e4b361..308e7cd 100644
--- a/annotation/annotation-experimental-lint/integration-tests/build.gradle
+++ b/annotation/annotation-experimental-lint/integration-tests/build.gradle
@@ -38,8 +38,6 @@
 // Allow usage of Kotlin's @Experimental annotation, which is itself experimental.
 tasks.withType(KotlinCompile).configureEach {
     kotlinOptions {
-        freeCompilerArgs += [ "-opt-in=kotlin.Experimental" ]
-
         // Ensure that compilation passes in CLI despite opt-in violations in integration tests.
         if (!isIdeBuild()) {
             freeCompilerArgs += [ "-opt-in=sample.optin.ExperimentalKotlinAnnotation" ]
diff --git a/benchmark/benchmark-common/build.gradle b/benchmark/benchmark-common/build.gradle
index 50886a1..c68112e 100644
--- a/benchmark/benchmark-common/build.gradle
+++ b/benchmark/benchmark-common/build.gradle
@@ -75,13 +75,6 @@
     description = "Android Benchmark - Common"
 }
 
-// Allow usage of Kotlin's @Experimental annotation, which is itself experimental.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.Experimental"]
-    }
-}
-
 // https://github.com/square/wire/issues/1947
 // Remove when we upgrade to fixed wire library
 afterEvaluate {
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/ThreadPriority.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/ThreadPriority.kt
index e2646ac..a4e1cd2 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/ThreadPriority.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/ThreadPriority.kt
@@ -96,13 +96,22 @@
      * so setting JIT / benchmark thread priorities are best-effort for now
      */
     private fun setThreadPriority(label: String, tid: Int, priority: Int): Boolean {
-        val previousPriority = Process.getThreadPriority(tid)
+
+        // Tries to acquire the thread priority
+        val previousPriority = try {
+            Process.getThreadPriority(tid)
+        } catch (e: IllegalArgumentException) {
+            return false
+        }
+
+        // Tries to set the thread priority
         try {
             Process.setThreadPriority(tid, priority)
         } catch (e: SecurityException) {
             return false
         }
 
+        // Checks and returns whether the priority changed
         val newPriority = Process.getThreadPriority(tid)
         if (newPriority != previousPriority) {
             Log.d(
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoConfig.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoConfig.kt
index 60d54ed..6b11eac 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoConfig.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoConfig.kt
@@ -103,6 +103,13 @@
     )
 )
 
+private val PACKAGE_LIST_DATASOURCE = TraceConfig.DataSource(
+    config = DataSourceConfig(
+        name = "android.packages_list",
+        target_buffer = 1,
+    )
+)
+
 private val LINUX_SYS_STATS_DATASOURCE = TraceConfig.DataSource(
     config = DataSourceConfig(
         name = "linux.sys_stats",
@@ -168,6 +175,7 @@
     data_sources = listOf(
         ftraceDataSource(atraceApps),
         PROCESS_STATS_DATASOURCE,
+        PACKAGE_LIST_DATASOURCE,
         LINUX_SYS_STATS_DATASOURCE,
         ANDROID_POWER_DATASOURCE,
         TraceConfig.DataSource(DataSourceConfig("android.surfaceflinger.frametimeline")),
diff --git a/benchmark/benchmark-darwin-core/build.gradle b/benchmark/benchmark-darwin-core/build.gradle
index b322e4b..d27219b 100644
--- a/benchmark/benchmark-darwin-core/build.gradle
+++ b/benchmark/benchmark-darwin-core/build.gradle
@@ -5,32 +5,45 @@
 }
 
 androidXMultiplatform {
-  sourceSets {
-  }
-
-  /// b/243154573
-  jvm()
-
-  ios {
-    compilations.main {
-      cinterops {
-        xcTestInterop {
-          defFile project.file("src/nativeInterop/cinterop/xcTestInterop.def")
-          // https://youtrack.jetbrains.com/issue/KT-48807#focus=Comments-27-5210791.0-0
-          compilerOpts("-DNS_FORMAT_ARGUMENT(A)=")
+    sourceSets {
+        // We need a source set here even though the module is technically empty.
+        // That is the only way we can have dependencies on the cinterop task work.
+        // https://youtrack.jetbrains.com/issue/KT-40975
+        iosArm64Main {
+            dependsOn(commonMain)
         }
-      }
+        iosSimulatorArm64Main {
+            dependsOn(iosArm64Main)
+        }
+        iosX64Main {
+            dependsOn(iosArm64Main)
+        }
     }
-    binaries.framework {
-      baseName = "AndroidXBenchmarkXCTest"
-      embedBitcode = BitcodeEmbeddingMode.DISABLE
+
+    // b/243154573
+    jvm()
+
+    ios {
+        compilations.main {
+            cinterops {
+                xcTestInterop {
+                    defFile project.file("src/nativeInterop/cinterop/xcTestInterop.def")
+                    // https://youtrack.jetbrains.com/issue/KT-48807#focus=Comments-27-5210791.0-0
+                    compilerOpts("-DNS_FORMAT_ARGUMENT(A)=")
+                }
+            }
+        }
+        binaries.framework {
+            baseName = "AndroidXBenchmarkXCTest"
+            // https://youtrack.jetbrains.com/issue/KT-48552
+            embedBitcode = BitcodeEmbeddingMode.DISABLE
+        }
     }
-  }
 }
 
 androidx {
-    name = "Android Benchmark - Darwin Core"
+    name = "AndroidX Benchmarks - Darwin Core"
     mavenGroup = LibraryGroups.BENCHMARK
     inceptionYear = "2022"
-    description = "Android Benchmark - Darwin Core"
+    description = "AndroidX Benchmarks - Darwin Core"
 }
diff --git a/benchmark/benchmark-darwin/build.gradle b/benchmark/benchmark-darwin/build.gradle
new file mode 100644
index 0000000..e98a138
--- /dev/null
+++ b/benchmark/benchmark-darwin/build.gradle
@@ -0,0 +1,49 @@
+import org.jetbrains.kotlin.gradle.plugin.mpp.BitcodeEmbeddingMode
+
+plugins {
+    id("AndroidXPlugin")
+}
+
+androidXMultiplatform {
+    // b/243154573
+    jvm()
+    ios {
+        binaries.framework {
+            baseName = "AndroidXDarwinBenchmarks"
+            // https://youtrack.jetbrains.com/issue/KT-48552
+            embedBitcode = BitcodeEmbeddingMode.DISABLE
+        }
+    }
+    sourceSets {
+        commonMain {
+            dependencies {
+                api(libs.kotlinStdlib)
+            }
+        }
+        commonTest {
+            dependencies {
+                implementation(libs.kotlinTest)
+                implementation(libs.kotlinTestAnnotationsCommon)
+            }
+        }
+        iosArm64Main {
+            dependsOn(commonMain)
+            dependencies {
+                api(project(":benchmark:benchmark-darwin-core"))
+            }
+        }
+        iosSimulatorArm64Main {
+            dependsOn(iosArm64Main)
+        }
+        iosX64Main {
+            dependsOn(iosArm64Main)
+        }
+    }
+}
+
+androidx {
+    name = "AndroidX Benchmarks - Darwin"
+    mavenGroup = LibraryGroups.BENCHMARK
+    inceptionYear = "2022"
+    description = "AndroidX Benchmarks - Darwin"
+}
diff --git a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt b/benchmark/benchmark-darwin/src/commonMain/kotlin/androidx/benchmark/darwin/MeasureOptions.kt
similarity index 77%
copy from privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt
copy to benchmark/benchmark-darwin/src/commonMain/kotlin/androidx/benchmark/darwin/MeasureOptions.kt
index c4940c5b..5675b04 100644
--- a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt
+++ b/benchmark/benchmark-darwin/src/commonMain/kotlin/androidx/benchmark/darwin/MeasureOptions.kt
@@ -14,4 +14,11 @@
  * limitations under the License.
  */
 
-package androidx.privacysandbox.tools.apigenerator
\ No newline at end of file
+package androidx.benchmark.darwin
+
+/**
+ * Test measurement options that control how many iterations to run.
+ */
+expect class MeasureOptions {
+    var iterationCount: ULong
+}
diff --git a/activity/activity-compose/src/androidTest/java/androidx/activity/compose/TestActivity.kt b/benchmark/benchmark-darwin/src/commonMain/kotlin/androidx/benchmark/darwin/TestCase.kt
similarity index 67%
rename from activity/activity-compose/src/androidTest/java/androidx/activity/compose/TestActivity.kt
rename to benchmark/benchmark-darwin/src/commonMain/kotlin/androidx/benchmark/darwin/TestCase.kt
index 722f444..889b3b9 100644
--- a/activity/activity-compose/src/androidTest/java/androidx/activity/compose/TestActivity.kt
+++ b/benchmark/benchmark-darwin/src/commonMain/kotlin/androidx/benchmark/darwin/TestCase.kt
@@ -13,15 +13,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package androidx.activity.compose
 
-import androidx.activity.ComponentActivity
+package androidx.benchmark.darwin
 
-class TestActivity : ComponentActivity() {
-    var reportFullyDrawnCalled = false
+abstract class TestCase {
+    /**
+     * Provides an opportunity to customize initial state before a test case begins.
+     */
+    abstract fun setUp()
 
-    override fun reportFullyDrawn() {
-        reportFullyDrawnCalled = true
-        super.reportFullyDrawn()
-    }
-}
\ No newline at end of file
+    abstract fun benchmark(context: TestCaseContext)
+
+    abstract fun testDescription(): String
+}
diff --git a/activity/activity-compose/src/androidTest/java/androidx/activity/compose/TestActivity.kt b/benchmark/benchmark-darwin/src/commonMain/kotlin/androidx/benchmark/darwin/TestCaseContext.kt
similarity index 62%
copy from activity/activity-compose/src/androidTest/java/androidx/activity/compose/TestActivity.kt
copy to benchmark/benchmark-darwin/src/commonMain/kotlin/androidx/benchmark/darwin/TestCaseContext.kt
index 722f444..bca6b09 100644
--- a/activity/activity-compose/src/androidTest/java/androidx/activity/compose/TestActivity.kt
+++ b/benchmark/benchmark-darwin/src/commonMain/kotlin/androidx/benchmark/darwin/TestCaseContext.kt
@@ -13,15 +13,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package androidx.activity.compose
 
-import androidx.activity.ComponentActivity
+package androidx.benchmark.darwin
 
-class TestActivity : ComponentActivity() {
-    var reportFullyDrawnCalled = false
+interface TestCaseContext {
+    /**
+     * Registers a block of teardown code to run after the current test method ends.
+     */
+    fun addTeardownBlock(block: () -> Unit)
 
-    override fun reportFullyDrawn() {
-        reportFullyDrawnCalled = true
-        super.reportFullyDrawn()
-    }
-}
\ No newline at end of file
+    /**
+     * Records the selected metrics for a block of code.
+     */
+    fun measureWithMetrics(metrics: List<*>, options: MeasureOptions, block: () -> Unit)
+}
diff --git a/activity/activity-compose/src/androidTest/java/androidx/activity/compose/TestActivity.kt b/benchmark/benchmark-darwin/src/commonMain/kotlin/androidx/benchmark/darwin/TestCases.kt
similarity index 64%
copy from activity/activity-compose/src/androidTest/java/androidx/activity/compose/TestActivity.kt
copy to benchmark/benchmark-darwin/src/commonMain/kotlin/androidx/benchmark/darwin/TestCases.kt
index 722f444..d9bca8a 100644
--- a/activity/activity-compose/src/androidTest/java/androidx/activity/compose/TestActivity.kt
+++ b/benchmark/benchmark-darwin/src/commonMain/kotlin/androidx/benchmark/darwin/TestCases.kt
@@ -13,15 +13,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package androidx.activity.compose
 
-import androidx.activity.ComponentActivity
+package androidx.benchmark.darwin
 
-class TestActivity : ComponentActivity() {
-    var reportFullyDrawnCalled = false
-
-    override fun reportFullyDrawn() {
-        reportFullyDrawnCalled = true
-        super.reportFullyDrawn()
+/**
+ * Returns a [List] of [TestCase]s to run for benchmarks.
+ */
+object TestCases {
+    private val testCases = mutableSetOf<TestCase>()
+    fun benchmarkTests(): List<TestCase> {
+        return testCases.toList()
     }
-}
\ No newline at end of file
+
+    fun addBenchmarkTest(testCase: TestCase) {
+        testCases += testCase
+    }
+}
diff --git a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt b/benchmark/benchmark-darwin/src/iosArm64Main/kotlin/androidx/benchmark/darwin/MeasureOptions.kt
similarity index 84%
rename from privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt
rename to benchmark/benchmark-darwin/src/iosArm64Main/kotlin/androidx/benchmark/darwin/MeasureOptions.kt
index c4940c5b..6dbd48a 100644
--- a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt
+++ b/benchmark/benchmark-darwin/src/iosArm64Main/kotlin/androidx/benchmark/darwin/MeasureOptions.kt
@@ -14,4 +14,6 @@
  * limitations under the License.
  */
 
-package androidx.privacysandbox.tools.apigenerator
\ No newline at end of file
+package androidx.benchmark.darwin
+
+actual typealias MeasureOptions = platform.XCTest.XCTMeasureOptions
diff --git a/benchmark/benchmark-darwin/src/iosArm64Main/kotlin/androidx/benchmark/darwin/TestCaseContextWrapper.kt b/benchmark/benchmark-darwin/src/iosArm64Main/kotlin/androidx/benchmark/darwin/TestCaseContextWrapper.kt
new file mode 100644
index 0000000..4a569c6
--- /dev/null
+++ b/benchmark/benchmark-darwin/src/iosArm64Main/kotlin/androidx/benchmark/darwin/TestCaseContextWrapper.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.benchmark.darwin
+
+import platform.XCTest.XCTMeasureOptions
+import platform.XCTest.XCTestCase
+import platform.XCTest.measureWithMetrics
+
+class TestCaseContextWrapper(private val context: XCTestCase) : TestCaseContext {
+    override fun addTeardownBlock(block: () -> Unit) {
+        context.addTeardownBlock(block)
+    }
+
+    override fun measureWithMetrics(
+        metrics: List<*>,
+        options: XCTMeasureOptions,
+        block: () -> Unit
+    ) {
+        context.measureWithMetrics(metrics, options, block)
+    }
+}
diff --git a/benchmark/benchmark-darwin/src/iosArm64Main/kotlin/androidx/benchmark/darwin/tests/SleepTestCase.kt b/benchmark/benchmark-darwin/src/iosArm64Main/kotlin/androidx/benchmark/darwin/tests/SleepTestCase.kt
new file mode 100644
index 0000000..cb7559c
--- /dev/null
+++ b/benchmark/benchmark-darwin/src/iosArm64Main/kotlin/androidx/benchmark/darwin/tests/SleepTestCase.kt
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.benchmark.darwin.tests
+
+import androidx.benchmark.darwin.TestCase
+import androidx.benchmark.darwin.TestCaseContext
+import androidx.benchmark.darwin.TestCases
+import platform.Foundation.NSLog
+import platform.XCTest.XCTMeasureOptions
+import platform.posix.sleep
+
+class SleepTestCase : TestCase() {
+    override fun setUp() {
+        NSLog("%s", "Hello Benchmarks !")
+    }
+
+    override fun benchmark(context: TestCaseContext) {
+        val options = XCTMeasureOptions.defaultOptions()
+        // A single iteration
+        options.iterationCount = 1.toULong()
+        context.measureWithMetrics(
+            listOf(
+                platform.XCTest.XCTCPUMetric(),
+                platform.XCTest.XCTMemoryMetric(),
+                platform.XCTest.XCTClockMetric()
+            ),
+            options
+        ) {
+            repeat(3) {
+                NSLog("%s", "Sleeping for 1 second")
+                sleep(1)
+            }
+        }
+    }
+
+    override fun testDescription(): String {
+        return "A test that sleeps for 3 seconds"
+    }
+
+    companion object {
+        fun addBenchmarkTest() {
+            TestCases.addBenchmarkTest(SleepTestCase())
+        }
+    }
+}
diff --git a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt b/benchmark/benchmark-darwin/src/jvmMain/kotlin/androidx/benchmark/darwin/MeasureOptions.kt
similarity index 76%
copy from privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt
copy to benchmark/benchmark-darwin/src/jvmMain/kotlin/androidx/benchmark/darwin/MeasureOptions.kt
index c4940c5b..bdc7389 100644
--- a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt
+++ b/benchmark/benchmark-darwin/src/jvmMain/kotlin/androidx/benchmark/darwin/MeasureOptions.kt
@@ -14,4 +14,9 @@
  * limitations under the License.
  */
 
-package androidx.privacysandbox.tools.apigenerator
\ No newline at end of file
+package androidx.benchmark.darwin
+
+/**
+ * Test measurement options that control how many iterations to run.
+ */
+actual data class MeasureOptions(actual var iterationCount: ULong)
diff --git a/benchmark/benchmark-macro-junit4/build.gradle b/benchmark/benchmark-macro-junit4/build.gradle
index 1f30898..30f8fe2 100644
--- a/benchmark/benchmark-macro-junit4/build.gradle
+++ b/benchmark/benchmark-macro-junit4/build.gradle
@@ -60,10 +60,3 @@
     inceptionYear = "2020"
     description = "Android Benchmark - Macrobenchmark JUnit4"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += [ '-opt-in=kotlin.RequiresOptIn' ]
-    }
-}
diff --git a/benchmark/benchmark-macro/api/restricted_current.txt b/benchmark/benchmark-macro/api/restricted_current.txt
index be73ac8..90b9e32 100644
--- a/benchmark/benchmark-macro/api/restricted_current.txt
+++ b/benchmark/benchmark-macro/api/restricted_current.txt
@@ -181,6 +181,14 @@
   public final class ForceTracingKt {
   }
 
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class PerfettoTraceProcessor {
+    method public String getJsonMetrics(String absoluteTracePath, String metric);
+    method @org.jetbrains.annotations.TestOnly public String getShellPath();
+    method public String rawQuery(String absoluteTracePath, String query);
+    property @org.jetbrains.annotations.TestOnly public final String shellPath;
+    field public static final androidx.benchmark.macro.perfetto.PerfettoTraceProcessor INSTANCE;
+  }
+
   public final class StringHelperKt {
   }
 
diff --git a/benchmark/benchmark-macro/build.gradle b/benchmark/benchmark-macro/build.gradle
index fc0fd01..2a1c4a6 100644
--- a/benchmark/benchmark-macro/build.gradle
+++ b/benchmark/benchmark-macro/build.gradle
@@ -75,10 +75,3 @@
     inceptionYear = "2020"
     description = "Android Benchmark - Macrobenchmark"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += [ '-opt-in=kotlin.RequiresOptIn' ]
-    }
-}
diff --git a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt
index c78444c..04d3195 100644
--- a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt
+++ b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt
@@ -138,9 +138,9 @@
         validateStartup_fullyDrawn(100)
     }
 
-    private fun getApi31WarmMetrics(metric: Metric): IterationResult {
+    private fun getApi32WarmMetrics(metric: Metric): IterationResult {
         assumeTrue(isAbiSupported())
-        val traceFile = createTempFileFromAsset("api31_startup_warm", ".perfetto-trace")
+        val traceFile = createTempFileFromAsset("api32_startup_warm", ".perfetto-trace")
         val packageName = "androidx.benchmark.integration.macrobenchmark.target"
         metric.configure(packageName)
         return metric.getMetrics(
@@ -148,7 +148,7 @@
                 targetPackageName = "androidx.benchmark.integration.macrobenchmark.target",
                 testPackageName = "androidx.benchmark.integration.macrobenchmark.test",
                 startupMode = StartupMode.WARM,
-                apiLevel = 31
+                apiLevel = 32
             ),
             tracePath = traceFile.absolutePath
         )
@@ -187,29 +187,29 @@
     @MediumTest
     @Test
     fun fixedStartupTraceMetrics() {
-        val metrics = getApi31WarmMetrics(StartupTimingMetric())
+        val metrics = getApi32WarmMetrics(StartupTimingMetric())
 
         // check known values
         assertEquals(
             setOf("timeToInitialDisplayMs", "timeToFullDisplayMs"),
             metrics.singleMetrics.keys
         )
-        assertEquals(62.373965, metrics.singleMetrics["timeToInitialDisplayMs"]!!, 0.0001)
-        assertEquals(555.968701, metrics.singleMetrics["timeToFullDisplayMs"]!!, 0.0001)
-        assertEquals(186982050780778..186982606749479, metrics.timelineRangeNs)
+        assertEquals(154.629883, metrics.singleMetrics["timeToInitialDisplayMs"]!!, 0.0001)
+        assertEquals(659.641358, metrics.singleMetrics["timeToFullDisplayMs"]!!, 0.0001)
+        assertEquals(157479786572825..157480446214183, metrics.timelineRangeNs)
     }
 
     @SuppressLint("NewApi") // suppressed for StartupTimingLegacyMetric, since data is fixed
     @MediumTest
     @Test
     fun fixedStartupTraceMetrics_legacy() {
-        val metrics = getApi31WarmMetrics(StartupTimingLegacyMetric())
+        val metrics = getApi32WarmMetrics(StartupTimingLegacyMetric())
 
         // check known values
         assertEquals(setOf("startupMs", "fullyDrawnMs"), metrics.singleMetrics.keys)
-        assertEquals(64.748027, metrics.singleMetrics["startupMs"]!!, 0.0001)
-        assertEquals(543.742658, metrics.singleMetrics["fullyDrawnMs"]!!, 0.0001)
-        assertEquals(186982050780778..186982115528805, metrics.timelineRangeNs)
+        assertEquals(156.515747, metrics.singleMetrics["startupMs"]!!, 0.0001)
+        assertEquals(644.613729, metrics.singleMetrics["fullyDrawnMs"]!!, 0.0001)
+        assertEquals(157479786566030..157479943081777, metrics.timelineRangeNs)
     }
 }
 
diff --git a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkHandshakeTest.kt b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkHandshakeTest.kt
index cb13b1d..0a6ef65 100644
--- a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkHandshakeTest.kt
+++ b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkHandshakeTest.kt
@@ -47,7 +47,7 @@
 import org.junit.runners.Parameterized
 import org.junit.runners.Parameterized.Parameters
 
-private const val tracingPerfettoVersion = "1.0.0-alpha02" // TODO(224510255): get by 'reflection'
+private const val tracingPerfettoVersion = "1.0.0-alpha03" // TODO(224510255): get by 'reflection'
 private const val minSupportedSdk = Build.VERSION_CODES.R // TODO(234351579): Support API < 30
 
 @RunWith(Parameterized::class)
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessor.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessor.kt
index 66a570b..3ec5957 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessor.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessor.kt
@@ -17,6 +17,7 @@
 package androidx.benchmark.macro.perfetto
 
 import android.util.Log
+import androidx.annotation.RestrictTo
 import androidx.benchmark.Outputs
 import androidx.benchmark.Shell
 import androidx.benchmark.perfetto.PerfettoHelper
@@ -24,10 +25,13 @@
 import org.jetbrains.annotations.TestOnly
 import java.io.File
 
+import androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX
+
 /**
  * Enables parsing perfetto traces on-device
  */
-internal object PerfettoTraceProcessor {
+@RestrictTo(LIBRARY_GROUP_PREFIX) // for internal benchmarking only
+object PerfettoTraceProcessor {
     private const val TAG = "PerfettoTraceProcessor"
 
     /**
@@ -47,6 +51,12 @@
         }
     }
 
+    /**
+     * Returns a json string containing the requested metric computed by trace_shell_processor on
+     * the given perfetto trace.
+     *
+     * @throws IllegalStateException if the returned json is empty as result of an invalid trace.
+     */
     fun getJsonMetrics(absoluteTracePath: String, metric: String): String {
         validateTracePath(absoluteTracePath)
         require(!metric.contains(" ")) {
@@ -75,7 +85,7 @@
      *
      * Note that sliceNames may include wildcard matches, such as `foo%`
      */
-    fun querySlices(
+    internal fun querySlices(
         absoluteTracePath: String,
         vararg sliceNames: String
     ): List<Slice> {
@@ -96,7 +106,7 @@
         )
     }
 
-    internal fun rawQuery(
+    fun rawQuery(
         absoluteTracePath: String,
         query: String
     ): String {
diff --git a/benchmark/benchmark/build.gradle b/benchmark/benchmark/build.gradle
index 79ff352..9e2a189 100644
--- a/benchmark/benchmark/build.gradle
+++ b/benchmark/benchmark/build.gradle
@@ -37,10 +37,3 @@
 android {
     namespace "androidx.benchmark.benchmark"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
\ No newline at end of file
diff --git a/benchmark/integration-tests/macrobenchmark/build.gradle b/benchmark/integration-tests/macrobenchmark/build.gradle
index 7bfa4bb..b9738c4 100644
--- a/benchmark/integration-tests/macrobenchmark/build.gradle
+++ b/benchmark/integration-tests/macrobenchmark/build.gradle
@@ -1,3 +1,4 @@
+import androidx.build.SupportConfigKt
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 /*
@@ -26,6 +27,12 @@
     defaultConfig {
         minSdkVersion 23
     }
+    sourceSets {
+        androidTest.assets.srcDirs += new File(
+                SupportConfigKt.getPrebuiltsRoot(project),
+                "androidx/traceprocessor/testdata"
+        )
+    }
     namespace "androidx.benchmark.integration.macrobenchmark"
 }
 
@@ -33,6 +40,7 @@
     androidTestImplementation(project(":benchmark:benchmark-junit4"))
     androidTestImplementation(project(":benchmark:benchmark-macro-junit4"))
     androidTestImplementation(project(":internal-testutils-macrobenchmark"))
+    androidTestImplementation(project(":tracing:tracing-ktx"))
     androidTestImplementation(libs.testRules)
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
@@ -41,13 +49,6 @@
     androidTestImplementation(libs.testExtTruth)
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
-    }
-}
-
 // Define a task dependency so the app is installed before we run macro benchmarks.
 tasks.getByPath(":benchmark:integration-tests:macrobenchmark:connectedCheck")
     .dependsOn(
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/PerfettoTraceProcessorBenchmark.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/PerfettoTraceProcessorBenchmark.kt
new file mode 100644
index 0000000..336899a
--- /dev/null
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/PerfettoTraceProcessorBenchmark.kt
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.benchmark.integration.macrobenchmark
+
+import androidx.benchmark.Outputs
+import androidx.benchmark.macro.ExperimentalMetricApi
+import androidx.benchmark.macro.TraceSectionMetric
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
+import androidx.benchmark.macro.perfetto.PerfettoTraceProcessor
+import androidx.benchmark.perfetto.PerfettoHelper
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.tracing.trace
+import java.io.File
+import org.junit.Assume
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+@SmallTest
+@SdkSuppress(minSdkVersion = 29)
+@OptIn(ExperimentalMetricApi::class)
+class PerfettoTraceProcessorBenchmark {
+
+    @get:Rule
+    val benchmarkRule = MacrobenchmarkRule()
+
+    private val traceFile = createTempFileFromAsset("api32_startup_warm", ".perfetto-trace")
+
+    @Before
+    fun setUp() = Assume.assumeTrue(PerfettoHelper.isAbiSupported())
+
+    @Test
+    fun computeSingleMetric() = benchmarkWithTrace {
+        runComputeStartupMetric()
+    }
+
+    @Test
+    fun executeSingleSliceQuery() = benchmarkWithTrace {
+        runSlicesQuery()
+    }
+
+    @Test
+    fun executeMultipleQueries() = benchmarkWithTrace {
+        runSlicesQuery()
+        runCounterQuery()
+        runProcessQuery()
+    }
+
+    @Test
+    fun executeMultipleQueriesAndComputeMetric() = benchmarkWithTrace {
+        runComputeStartupMetric()
+        runSlicesQuery()
+        runCounterQuery()
+        runProcessQuery()
+    }
+
+    private fun benchmarkWithTrace(block: () -> (Unit)) = benchmarkRule.measureRepeated(
+        packageName = PACKAGE_NAME,
+        metrics = listOf(TraceSectionMetric("perfettoTraceProcessor")),
+        iterations = 5,
+    ) {
+        trace("perfettoTraceProcessor", block)
+    }
+
+    private fun runComputeStartupMetric() {
+        PerfettoTraceProcessor.getJsonMetrics(
+            traceFile.absolutePath, "android_startup"
+        )
+    }
+
+    private fun runSlicesQuery() {
+        PerfettoTraceProcessor.rawQuery(
+            traceFile.absolutePath, """
+                SELECT slice.name, slice.ts, slice.dur, thread_track.id, thread_track.name
+                FROM slice
+                INNER JOIN thread_track on slice.track_id = thread_track.id
+                INNER JOIN thread USING(utid)
+                INNER JOIN process USING(upid)
+            """.trimIndent()
+        )
+    }
+
+    private fun runCounterQuery() {
+        PerfettoTraceProcessor.rawQuery(
+            traceFile.absolutePath, """
+                SELECT track.name, counter.value, counter.ts
+                FROM track
+                JOIN counter ON track.id = counter.track_id
+            """.trimIndent()
+        )
+    }
+
+    private fun runProcessQuery() {
+        PerfettoTraceProcessor.rawQuery(
+            traceFile.absolutePath, """
+                SELECT upid
+                FROM counter
+                JOIN process_counter_track ON process_counter_track.id = counter.track_id
+                WHERE process_counter_track.name = 'mem.swap' AND value > 1000
+            """.trimIndent()
+        )
+    }
+
+    private fun createTempFileFromAsset(prefix: String, suffix: String): File {
+        val file = File.createTempFile(prefix, suffix, Outputs.dirUsableByAppAndShell)
+        InstrumentationRegistry
+            .getInstrumentation()
+            .context
+            .assets
+            .open(prefix + suffix)
+            .copyTo(file.outputStream())
+        return file
+    }
+
+    companion object {
+        private const val PACKAGE_NAME = "androidx.benchmark.integration.macrobenchmark.target"
+    }
+}
diff --git a/bluetooth/bluetooth-core/api/current.txt b/bluetooth/bluetooth-core/api/current.txt
index e6f50d0..7161d63 100644
--- a/bluetooth/bluetooth-core/api/current.txt
+++ b/bluetooth/bluetooth-core/api/current.txt
@@ -1 +1,67 @@
 // Signature format: 4.0
+package androidx.bluetooth.core {
+
+  public final class AdvertiseSettings {
+    ctor public AdvertiseSettings(optional int advertiseMode, optional int advertiseTxPowerLevel, optional boolean advertiseConnectable, optional int advertiseTimeoutMillis);
+    method public boolean getAdvertiseConnectable();
+    method public int getAdvertiseMode();
+    method public int getAdvertiseTimeoutMillis();
+    method public int getAdvertiseTxPowerLevel();
+    property public final boolean advertiseConnectable;
+    property public final int advertiseMode;
+    property public final int advertiseTimeoutMillis;
+    property public final int advertiseTxPowerLevel;
+    field public static final int ADVERTISE_MODE_BALANCED = 1; // 0x1
+    field public static final int ADVERTISE_MODE_LOW_LATENCY = 2; // 0x2
+    field public static final int ADVERTISE_MODE_LOW_POWER = 0; // 0x0
+    field public static final int ADVERTISE_TX_POWER_HIGH = 3; // 0x3
+    field public static final int ADVERTISE_TX_POWER_LOW = 1; // 0x1
+    field public static final int ADVERTISE_TX_POWER_MEDIUM = 2; // 0x2
+    field public static final int ADVERTISE_TX_POWER_ULTRA_LOW = 0; // 0x0
+    field public static final androidx.bluetooth.core.AdvertiseSettings.Companion Companion;
+  }
+
+  public static final class AdvertiseSettings.Companion {
+  }
+
+  public final class ScanFilter {
+    ctor public ScanFilter(optional String? deviceName, optional String? deviceAddress, optional android.os.ParcelUuid? serviceUuid, optional android.os.ParcelUuid? serviceUuidMask, optional android.os.ParcelUuid? serviceDataUuid, optional byte[]? serviceData, optional byte[]? serviceDataMask, optional int manufacturerId, optional byte[]? manufacturerData, optional byte[]? manufacturerDataMask, optional android.os.ParcelUuid? serviceSolicitationUuid, optional android.os.ParcelUuid? serviceSolicitationUuidMask, optional byte[]? advertisingData, optional byte[]? advertisingDataMask, optional int advertisingDataType);
+    method public byte[]? getAdvertisingData();
+    method public byte[]? getAdvertisingDataMask();
+    method public int getAdvertisingDataType();
+    method public String? getDeviceAddress();
+    method public String? getDeviceName();
+    method public byte[]? getManufacturerData();
+    method public byte[]? getManufacturerDataMask();
+    method public int getManufacturerId();
+    method public byte[]? getServiceData();
+    method public byte[]? getServiceDataMask();
+    method public android.os.ParcelUuid? getServiceDataUuid();
+    method public android.os.ParcelUuid? getServiceSolicitationUuid();
+    method public android.os.ParcelUuid? getServiceSolicitationUuidMask();
+    method public android.os.ParcelUuid? getServiceUuid();
+    method public android.os.ParcelUuid? getServiceUuidMask();
+    method public boolean matches(android.bluetooth.le.ScanResult? scanResult);
+    property public final byte[]? advertisingData;
+    property public final byte[]? advertisingDataMask;
+    property public final int advertisingDataType;
+    property public final String? deviceAddress;
+    property public final String? deviceName;
+    property public final byte[]? manufacturerData;
+    property public final byte[]? manufacturerDataMask;
+    property public final int manufacturerId;
+    property public final byte[]? serviceData;
+    property public final byte[]? serviceDataMask;
+    property public final android.os.ParcelUuid? serviceDataUuid;
+    property public final android.os.ParcelUuid? serviceSolicitationUuid;
+    property public final android.os.ParcelUuid? serviceSolicitationUuidMask;
+    property public final android.os.ParcelUuid? serviceUuid;
+    property public final android.os.ParcelUuid? serviceUuidMask;
+    field public static final androidx.bluetooth.core.ScanFilter.Companion Companion;
+  }
+
+  public static final class ScanFilter.Companion {
+  }
+
+}
+
diff --git a/bluetooth/bluetooth-core/api/public_plus_experimental_current.txt b/bluetooth/bluetooth-core/api/public_plus_experimental_current.txt
index e6f50d0..7161d63 100644
--- a/bluetooth/bluetooth-core/api/public_plus_experimental_current.txt
+++ b/bluetooth/bluetooth-core/api/public_plus_experimental_current.txt
@@ -1 +1,67 @@
 // Signature format: 4.0
+package androidx.bluetooth.core {
+
+  public final class AdvertiseSettings {
+    ctor public AdvertiseSettings(optional int advertiseMode, optional int advertiseTxPowerLevel, optional boolean advertiseConnectable, optional int advertiseTimeoutMillis);
+    method public boolean getAdvertiseConnectable();
+    method public int getAdvertiseMode();
+    method public int getAdvertiseTimeoutMillis();
+    method public int getAdvertiseTxPowerLevel();
+    property public final boolean advertiseConnectable;
+    property public final int advertiseMode;
+    property public final int advertiseTimeoutMillis;
+    property public final int advertiseTxPowerLevel;
+    field public static final int ADVERTISE_MODE_BALANCED = 1; // 0x1
+    field public static final int ADVERTISE_MODE_LOW_LATENCY = 2; // 0x2
+    field public static final int ADVERTISE_MODE_LOW_POWER = 0; // 0x0
+    field public static final int ADVERTISE_TX_POWER_HIGH = 3; // 0x3
+    field public static final int ADVERTISE_TX_POWER_LOW = 1; // 0x1
+    field public static final int ADVERTISE_TX_POWER_MEDIUM = 2; // 0x2
+    field public static final int ADVERTISE_TX_POWER_ULTRA_LOW = 0; // 0x0
+    field public static final androidx.bluetooth.core.AdvertiseSettings.Companion Companion;
+  }
+
+  public static final class AdvertiseSettings.Companion {
+  }
+
+  public final class ScanFilter {
+    ctor public ScanFilter(optional String? deviceName, optional String? deviceAddress, optional android.os.ParcelUuid? serviceUuid, optional android.os.ParcelUuid? serviceUuidMask, optional android.os.ParcelUuid? serviceDataUuid, optional byte[]? serviceData, optional byte[]? serviceDataMask, optional int manufacturerId, optional byte[]? manufacturerData, optional byte[]? manufacturerDataMask, optional android.os.ParcelUuid? serviceSolicitationUuid, optional android.os.ParcelUuid? serviceSolicitationUuidMask, optional byte[]? advertisingData, optional byte[]? advertisingDataMask, optional int advertisingDataType);
+    method public byte[]? getAdvertisingData();
+    method public byte[]? getAdvertisingDataMask();
+    method public int getAdvertisingDataType();
+    method public String? getDeviceAddress();
+    method public String? getDeviceName();
+    method public byte[]? getManufacturerData();
+    method public byte[]? getManufacturerDataMask();
+    method public int getManufacturerId();
+    method public byte[]? getServiceData();
+    method public byte[]? getServiceDataMask();
+    method public android.os.ParcelUuid? getServiceDataUuid();
+    method public android.os.ParcelUuid? getServiceSolicitationUuid();
+    method public android.os.ParcelUuid? getServiceSolicitationUuidMask();
+    method public android.os.ParcelUuid? getServiceUuid();
+    method public android.os.ParcelUuid? getServiceUuidMask();
+    method public boolean matches(android.bluetooth.le.ScanResult? scanResult);
+    property public final byte[]? advertisingData;
+    property public final byte[]? advertisingDataMask;
+    property public final int advertisingDataType;
+    property public final String? deviceAddress;
+    property public final String? deviceName;
+    property public final byte[]? manufacturerData;
+    property public final byte[]? manufacturerDataMask;
+    property public final int manufacturerId;
+    property public final byte[]? serviceData;
+    property public final byte[]? serviceDataMask;
+    property public final android.os.ParcelUuid? serviceDataUuid;
+    property public final android.os.ParcelUuid? serviceSolicitationUuid;
+    property public final android.os.ParcelUuid? serviceSolicitationUuidMask;
+    property public final android.os.ParcelUuid? serviceUuid;
+    property public final android.os.ParcelUuid? serviceUuidMask;
+    field public static final androidx.bluetooth.core.ScanFilter.Companion Companion;
+  }
+
+  public static final class ScanFilter.Companion {
+  }
+
+}
+
diff --git a/bluetooth/bluetooth-core/api/restricted_current.txt b/bluetooth/bluetooth-core/api/restricted_current.txt
index e6f50d0..f650587 100644
--- a/bluetooth/bluetooth-core/api/restricted_current.txt
+++ b/bluetooth/bluetooth-core/api/restricted_current.txt
@@ -1 +1,79 @@
 // Signature format: 4.0
+package androidx.bluetooth.core {
+
+  public final class AdvertiseSettings implements androidx.bluetooth.core.Bundleable {
+    ctor public AdvertiseSettings(optional int advertiseMode, optional int advertiseTxPowerLevel, optional boolean advertiseConnectable, optional int advertiseTimeoutMillis);
+    method public boolean getAdvertiseConnectable();
+    method public int getAdvertiseMode();
+    method public int getAdvertiseTimeoutMillis();
+    method public int getAdvertiseTxPowerLevel();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.os.Bundle toBundle();
+    property public final boolean advertiseConnectable;
+    property public final int advertiseMode;
+    property public final int advertiseTimeoutMillis;
+    property public final int advertiseTxPowerLevel;
+    field public static final int ADVERTISE_MODE_BALANCED = 1; // 0x1
+    field public static final int ADVERTISE_MODE_LOW_LATENCY = 2; // 0x2
+    field public static final int ADVERTISE_MODE_LOW_POWER = 0; // 0x0
+    field public static final int ADVERTISE_TX_POWER_HIGH = 3; // 0x3
+    field public static final int ADVERTISE_TX_POWER_LOW = 1; // 0x1
+    field public static final int ADVERTISE_TX_POWER_MEDIUM = 2; // 0x2
+    field public static final int ADVERTISE_TX_POWER_ULTRA_LOW = 0; // 0x0
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final androidx.bluetooth.core.Bundleable.Creator<androidx.bluetooth.core.AdvertiseSettings> CREATOR;
+    field public static final androidx.bluetooth.core.AdvertiseSettings.Companion Companion;
+  }
+
+  public static final class AdvertiseSettings.Companion {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface Bundleable {
+    method public android.os.Bundle toBundle();
+  }
+
+  public static interface Bundleable.Creator<T extends androidx.bluetooth.core.Bundleable> {
+    method public T fromBundle(android.os.Bundle bundle);
+  }
+
+  public final class ScanFilter implements androidx.bluetooth.core.Bundleable {
+    ctor public ScanFilter(optional String? deviceName, optional String? deviceAddress, optional android.os.ParcelUuid? serviceUuid, optional android.os.ParcelUuid? serviceUuidMask, optional android.os.ParcelUuid? serviceDataUuid, optional byte[]? serviceData, optional byte[]? serviceDataMask, optional int manufacturerId, optional byte[]? manufacturerData, optional byte[]? manufacturerDataMask, optional android.os.ParcelUuid? serviceSolicitationUuid, optional android.os.ParcelUuid? serviceSolicitationUuidMask, optional byte[]? advertisingData, optional byte[]? advertisingDataMask, optional int advertisingDataType);
+    method public byte[]? getAdvertisingData();
+    method public byte[]? getAdvertisingDataMask();
+    method public int getAdvertisingDataType();
+    method public String? getDeviceAddress();
+    method public String? getDeviceName();
+    method public byte[]? getManufacturerData();
+    method public byte[]? getManufacturerDataMask();
+    method public int getManufacturerId();
+    method public byte[]? getServiceData();
+    method public byte[]? getServiceDataMask();
+    method public android.os.ParcelUuid? getServiceDataUuid();
+    method public android.os.ParcelUuid? getServiceSolicitationUuid();
+    method public android.os.ParcelUuid? getServiceSolicitationUuidMask();
+    method public android.os.ParcelUuid? getServiceUuid();
+    method public android.os.ParcelUuid? getServiceUuidMask();
+    method public boolean matches(android.bluetooth.le.ScanResult? scanResult);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.os.Bundle toBundle();
+    property public final byte[]? advertisingData;
+    property public final byte[]? advertisingDataMask;
+    property public final int advertisingDataType;
+    property public final String? deviceAddress;
+    property public final String? deviceName;
+    property public final byte[]? manufacturerData;
+    property public final byte[]? manufacturerDataMask;
+    property public final int manufacturerId;
+    property public final byte[]? serviceData;
+    property public final byte[]? serviceDataMask;
+    property public final android.os.ParcelUuid? serviceDataUuid;
+    property public final android.os.ParcelUuid? serviceSolicitationUuid;
+    property public final android.os.ParcelUuid? serviceSolicitationUuidMask;
+    property public final android.os.ParcelUuid? serviceUuid;
+    property public final android.os.ParcelUuid? serviceUuidMask;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final androidx.bluetooth.core.Bundleable.Creator<androidx.bluetooth.core.ScanFilter> CREATOR;
+    field public static final androidx.bluetooth.core.ScanFilter.Companion Companion;
+  }
+
+  public static final class ScanFilter.Companion {
+  }
+
+}
+
diff --git a/bluetooth/bluetooth-core/src/androidTest/java/androidx/bluetooth/core/AdvertiseDataTest.kt b/bluetooth/bluetooth-core/src/androidTest/java/androidx/bluetooth/core/AdvertiseDataTest.kt
new file mode 100644
index 0000000..630a9d7
--- /dev/null
+++ b/bluetooth/bluetooth-core/src/androidTest/java/androidx/bluetooth/core/AdvertiseDataTest.kt
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.bluetooth.core
+
+import android.bluetooth.le.AdvertiseData as FwkAdvertiseData
+import android.os.Build
+import android.os.ParcelUuid
+import android.util.SparseArray
+import com.google.common.truth.Truth
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class AdvertiseDataTest {
+
+    companion object {
+        val TEST_SERVICE_UUID = ParcelUuid.fromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF")
+        val TEST_SERVICE_UUIDS = mutableListOf<ParcelUuid>(TEST_SERVICE_UUID)
+        val TEST_SERVICE_SOLICITATION_UUID =
+            ParcelUuid.fromString("CCCCCCC0-CCCC-CCCC-CCCC-CCCCCCCCCCCC")
+        val TEST_SERVICE_SOLICITATION_UUIDS = mutableListOf<ParcelUuid>(
+            TEST_SERVICE_SOLICITATION_UUID)
+        val TEST_MANUFACTURER_ID = 1000
+        val TEST_MANUFACTURER_SPECIFIC_DATUM = "MANUFACTURER-DATA".toByteArray()
+        val TEST_MANUFACTURER_SPECIFIC_DATA = SparseArray<ByteArray>().also {
+            it.put(TEST_MANUFACTURER_ID, TEST_MANUFACTURER_SPECIFIC_DATUM)
+        }
+        val TEST_SERVICE_DATA_UUID = ParcelUuid.fromString(
+            "DDDDDDD0-DDDD-DDDD-DDDD-DDDDDDDDDDDD")
+        val TEST_SERVICE_DATUM = "SERVICE-DATA".toByteArray()
+        val TEST_SERVICE_DATA = mutableMapOf<ParcelUuid, ByteArray>(
+            TEST_SERVICE_DATA_UUID to TEST_SERVICE_DATUM)
+        val TEST_INCLUDE_TX_POWER_LEVEL = false
+        val TEST_INCLUDE_DEVICE_NAME = false
+
+        internal fun <E> SparseArray<E>.compareContent(other: SparseArray<E>?) {
+            Truth.assertThat(other).isNotNull()
+            Truth.assertThat(size()).isEqualTo(other?.size())
+            if (other != null && size() == other.size()) {
+                for (index in 0 until size()) {
+                    val key = keyAt(index)
+                    val value = get(key)
+                    Truth.assertThat(key).isEqualTo(other.keyAt(index))
+                    Truth.assertThat(value).isEqualTo(other.get(key))
+                }
+            }
+        }
+    }
+
+    @Test
+    fun constructorWithValues_createsFrameworkInstanceCorrectly() {
+        val advertiseData = AdvertiseData(
+            serviceUuids = TEST_SERVICE_UUIDS,
+            serviceSolicitationUuids = TEST_SERVICE_SOLICITATION_UUIDS,
+            manufacturerSpecificData = TEST_MANUFACTURER_SPECIFIC_DATA,
+            serviceData = TEST_SERVICE_DATA,
+            includeTxPowerLevel = TEST_INCLUDE_TX_POWER_LEVEL,
+            includeDeviceName = TEST_INCLUDE_DEVICE_NAME
+        )
+        val fwkAdvertiseData = advertiseData.impl.fwkInstance
+        Truth.assertThat(fwkAdvertiseData.serviceUuids).isEqualTo(TEST_SERVICE_UUIDS)
+        TEST_MANUFACTURER_SPECIFIC_DATA.compareContent(fwkAdvertiseData.manufacturerSpecificData)
+        Truth.assertThat(fwkAdvertiseData.serviceData).isEqualTo(TEST_SERVICE_DATA)
+        Truth.assertThat(fwkAdvertiseData.includeTxPowerLevel).isEqualTo(
+            TEST_INCLUDE_TX_POWER_LEVEL)
+        Truth.assertThat(fwkAdvertiseData.includeDeviceName).isEqualTo(TEST_INCLUDE_DEVICE_NAME)
+        if (Build.VERSION.SDK_INT >= 31) {
+            Truth.assertThat(fwkAdvertiseData.serviceSolicitationUuids).isEqualTo(
+                TEST_SERVICE_SOLICITATION_UUIDS)
+        }
+    }
+
+    @Test
+    fun constructorWithFwkInstance_createsAdvertiseDataCorrectly() {
+        val fwkAdvertiseDataBuilder = FwkAdvertiseData.Builder()
+            .addServiceUuid(TEST_SERVICE_UUID)
+            .addManufacturerData(TEST_MANUFACTURER_ID, TEST_MANUFACTURER_SPECIFIC_DATUM)
+            .addServiceData(TEST_SERVICE_DATA_UUID, TEST_SERVICE_DATUM)
+            .setIncludeTxPowerLevel(TEST_INCLUDE_TX_POWER_LEVEL)
+            .setIncludeDeviceName(TEST_INCLUDE_DEVICE_NAME)
+        if (Build.VERSION.SDK_INT >= 31) {
+            fwkAdvertiseDataBuilder.addServiceSolicitationUuid(TEST_SERVICE_SOLICITATION_UUID)
+        }
+
+        val advertiseData = AdvertiseData(fwkAdvertiseDataBuilder.build())
+
+        Truth.assertThat(advertiseData.serviceUuids).isEqualTo(TEST_SERVICE_UUIDS)
+        TEST_MANUFACTURER_SPECIFIC_DATA.compareContent(advertiseData.manufacturerSpecificData)
+        Truth.assertThat(advertiseData.serviceData).isEqualTo(TEST_SERVICE_DATA)
+        Truth.assertThat(advertiseData.includeTxPowerLevel).isEqualTo(TEST_INCLUDE_TX_POWER_LEVEL)
+        Truth.assertThat(advertiseData.includeDeviceName).isEqualTo(TEST_INCLUDE_DEVICE_NAME)
+        if (Build.VERSION.SDK_INT >= 31) {
+            Truth.assertThat(advertiseData.serviceSolicitationUuids)
+                .isEqualTo(TEST_SERVICE_SOLICITATION_UUIDS)
+        }
+    }
+
+    @Test
+    fun advertiseDataBundleable() {
+        val advertiseData = AdvertiseData(
+            serviceUuids = TEST_SERVICE_UUIDS,
+            serviceSolicitationUuids = TEST_SERVICE_SOLICITATION_UUIDS,
+            manufacturerSpecificData = TEST_MANUFACTURER_SPECIFIC_DATA,
+            serviceData = TEST_SERVICE_DATA,
+            includeTxPowerLevel = TEST_INCLUDE_TX_POWER_LEVEL,
+            includeDeviceName = TEST_INCLUDE_DEVICE_NAME
+        )
+        val bundle = advertiseData.toBundle()
+
+        val advertiseDataFromBundle = AdvertiseData.CREATOR.fromBundle(bundle)
+        Truth.assertThat(advertiseDataFromBundle.serviceUuids).isEqualTo(TEST_SERVICE_UUIDS)
+        TEST_MANUFACTURER_SPECIFIC_DATA.compareContent(
+            advertiseDataFromBundle.manufacturerSpecificData)
+        Truth.assertThat(advertiseDataFromBundle.serviceData).isEqualTo(TEST_SERVICE_DATA)
+        Truth.assertThat(advertiseDataFromBundle.includeTxPowerLevel).isEqualTo(
+            TEST_INCLUDE_TX_POWER_LEVEL)
+        Truth.assertThat(advertiseDataFromBundle.includeDeviceName).isEqualTo(
+            TEST_INCLUDE_DEVICE_NAME)
+        Truth.assertThat(advertiseDataFromBundle.serviceSolicitationUuids).isEqualTo(
+            TEST_SERVICE_SOLICITATION_UUIDS)
+    }
+}
\ No newline at end of file
diff --git a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/AdvertiseData.kt b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/AdvertiseData.kt
index 0b5a5f0..a948848 100644
--- a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/AdvertiseData.kt
+++ b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/AdvertiseData.kt
@@ -16,30 +16,193 @@
 
 package androidx.bluetooth.core
 
+import android.bluetooth.le.AdvertiseData as FwkAdvertiseData
+import android.os.Build
+import android.os.Bundle
 import android.os.ParcelUuid
 import android.util.SparseArray
-import android.bluetooth.le.AdvertiseData as FwkAdvertiseData
-import android.os.Bundle
-import androidx.bluetooth.core.utils.Bundleable
-import androidx.bluetooth.core.utils.Utils
+import androidx.annotation.RequiresApi
 
 /**
- * TODO: Implement AdvertiseDataImplXxx
- * TODO: Implement addXxx functions
  * TODO: Add docs
- * TODO: Add functions in SDK 31
  * TODO: Add functions in SDK 33
  *
  * Advertise data packet container for Bluetooth LE advertising. This represents the data to be
  * advertised as well as the scan response data for active scans.
- *
- * Add @see BluetoothLeAdvertiser, @see ScanRecord when they are ready
  * @hide
  */
-class AdvertiseData internal constructor(private val fwkInstance: FwkAdvertiseData) : Bundleable {
+class AdvertiseData internal constructor(
+    internal val impl: AdvertiseDataImpl
+) : AdvertiseDataImpl by impl {
+    companion object {
+        val CREATOR: Bundleable.Creator<AdvertiseData> =
+            if (Build.VERSION.SDK_INT < 31) {
+                AdvertiseDataImplApi21.CREATOR
+            } else {
+                AdvertiseDataImplApi31.CREATOR
+            }
+
+        internal fun createAdvertiseDataImpl(args: AdvertiseDataArgs): AdvertiseDataImpl {
+            return if (Build.VERSION.SDK_INT < 31) {
+                AdvertiseDataImplApi21(
+                    AdvertiseDataImplApi21.getFwkAdvertiseDataBuilder(args).build(),
+                    args.serviceSolicitationUuids
+                )
+            } else {
+                AdvertiseDataImplApi31(
+                    AdvertiseDataImplApi31.getFwkAdvertiseDataBuilder(args).build()
+                )
+            }
+        }
+    }
+
+    internal constructor(fwkAdvertiseData: FwkAdvertiseData) : this(
+        if (Build.VERSION.SDK_INT < 31) {
+            AdvertiseDataImplApi21(fwkAdvertiseData)
+        } else {
+            AdvertiseDataImplApi31(fwkAdvertiseData)
+        }
+    )
+
+    constructor(
+        serviceUuids: MutableList<ParcelUuid>? = null,
+        serviceSolicitationUuids: MutableList<ParcelUuid>? = null,
+        manufacturerSpecificData: SparseArray<ByteArray>? = null,
+        serviceData: MutableMap<ParcelUuid, ByteArray>? = null,
+        includeTxPowerLevel: Boolean = false,
+        includeDeviceName: Boolean = false
+    ) : this(
+        createAdvertiseDataImpl(AdvertiseDataArgs(
+            serviceUuids,
+            serviceSolicitationUuids,
+            manufacturerSpecificData,
+            serviceData,
+            includeTxPowerLevel,
+            includeDeviceName
+        )))
+}
+
+internal data class AdvertiseDataArgs(
+    val serviceUuids: MutableList<ParcelUuid>? = null,
+    val serviceSolicitationUuids: MutableList<ParcelUuid>? = null,
+    val manufacturerSpecificData: SparseArray<ByteArray>? = null,
+    val serviceData: MutableMap<ParcelUuid, ByteArray>? = null,
+    var includeTxPowerLevel: Boolean = false,
+    var includeDeviceName: Boolean = false,
+)
+
+internal interface AdvertiseDataImpl : Bundleable {
+    val serviceUuids: MutableList<ParcelUuid>?
+    val serviceSolicitationUuids: MutableList<ParcelUuid>?
+    val manufacturerSpecificData: SparseArray<ByteArray>?
+    val serviceData: MutableMap<ParcelUuid, ByteArray>?
+    val includeTxPowerLevel: Boolean
+    val includeDeviceName: Boolean
+
+    val fwkInstance: FwkAdvertiseData
+}
+
+internal abstract class AdvertiseDataFwkImplApi21 internal constructor(
+    override val fwkInstance: FwkAdvertiseData
+) : AdvertiseDataImpl {
     companion object {
         internal const val FIELD_FWK_ADVERTISE_DATA = 0
+        internal const val FIELD_SERVICE_SOLICITATION_UUIDS = 1
 
+        internal fun keyForField(field: Int): String {
+            return field.toString(Character.MAX_RADIX)
+        }
+    }
+
+    override val serviceUuids: MutableList<ParcelUuid>?
+        get() = fwkInstance.serviceUuids
+    override val manufacturerSpecificData: SparseArray<ByteArray>?
+        get() = fwkInstance.manufacturerSpecificData
+    override val serviceData: MutableMap<ParcelUuid, ByteArray>?
+        get() = fwkInstance.serviceData
+    override val includeTxPowerLevel: Boolean
+        get() = fwkInstance.includeTxPowerLevel
+    override val includeDeviceName: Boolean
+        get() = fwkInstance.includeDeviceName
+}
+
+internal class AdvertiseDataImplApi21 internal constructor(
+    fwkInstance: FwkAdvertiseData,
+    override val serviceSolicitationUuids: MutableList<ParcelUuid>? = null
+) : AdvertiseDataFwkImplApi21(fwkInstance) {
+    companion object {
+        val CREATOR: Bundleable.Creator<AdvertiseData> =
+            object : Bundleable.Creator<AdvertiseData> {
+                override fun fromBundle(bundle: Bundle): AdvertiseData {
+                    val fwkAdvertiseData =
+                        Utils.getParcelableFromBundle(
+                            bundle,
+                            keyForField(FIELD_FWK_ADVERTISE_DATA),
+                            FwkAdvertiseData::class.java
+                        ) ?: throw IllegalArgumentException(
+                            "Bundle doesn't include a framework advertise data"
+                        )
+                    val serviceSolicitationUuids =
+                        Utils.getParcelableArrayListFromBundle(
+                            bundle,
+                            keyForField(FIELD_SERVICE_SOLICITATION_UUIDS),
+                            ParcelUuid::class.java
+                        )
+
+                    return AdvertiseData(AdvertiseDataImplApi21(
+                        fwkAdvertiseData,
+                        serviceSolicitationUuids.toMutableList())
+                    )
+                }
+            }
+
+        internal fun getFwkAdvertiseDataBuilder(args: AdvertiseDataArgs): FwkAdvertiseData.Builder {
+            val builder = FwkAdvertiseData.Builder()
+                .setIncludeTxPowerLevel(args.includeTxPowerLevel)
+                .setIncludeDeviceName(args.includeDeviceName)
+
+            args.serviceUuids?.forEach { builder.addServiceUuid(it) }
+
+            if (args.manufacturerSpecificData != null) {
+                with(args.manufacturerSpecificData) {
+                    for (index in 0 until size()) {
+                        builder.addManufacturerData(keyAt(index), get(keyAt(index)))
+                    }
+                }
+            }
+
+            args.serviceData?.forEach { builder.addServiceData(it.key, it.value) }
+
+            return builder
+        }
+    }
+
+    override fun toBundle(): Bundle {
+        val bundle = Bundle()
+        bundle.putParcelable(keyForField(FIELD_FWK_ADVERTISE_DATA), fwkInstance)
+        if (serviceSolicitationUuids != null) {
+            bundle.putParcelableArrayList(
+                keyForField(FIELD_SERVICE_SOLICITATION_UUIDS),
+                ArrayList(serviceSolicitationUuids)
+            )
+        }
+        return bundle
+    }
+}
+
+@RequiresApi(Build.VERSION_CODES.S)
+internal abstract class AdvertiseDataFwkImplApi31(
+    fwkInstance: FwkAdvertiseData
+) : AdvertiseDataFwkImplApi21(fwkInstance) {
+    override val serviceSolicitationUuids: MutableList<ParcelUuid>?
+        get() = fwkInstance.serviceSolicitationUuids
+}
+
+@RequiresApi(Build.VERSION_CODES.S)
+internal class AdvertiseDataImplApi31 internal constructor(
+    fwkInstance: FwkAdvertiseData
+) : AdvertiseDataFwkImplApi31(fwkInstance) {
+    companion object {
         val CREATOR: Bundleable.Creator<AdvertiseData> =
             object : Bundleable.Creator<AdvertiseData> {
                 override fun fromBundle(bundle: Bundle): AdvertiseData {
@@ -55,67 +218,14 @@
                 }
             }
 
-        internal fun keyForField(field: Int): String {
-            return field.toString(Character.MAX_RADIX)
-        }
+        internal fun getFwkAdvertiseDataBuilder(args: AdvertiseDataArgs): FwkAdvertiseData.Builder {
+            val builder = AdvertiseDataImplApi21.getFwkAdvertiseDataBuilder(args)
 
-        private fun <T> SparseArray<T>.entriesIterator(): Iterator<Pair<Int, T>> {
-            val size = this.size()
-            return object : Iterator<Pair<Int, T>> {
-                var currIndex = 0
-                override fun hasNext(): Boolean = currIndex < size
-                override fun next(): Pair<Int, T> = Pair(keyAt(currIndex), valueAt(currIndex++))
-            }
-        }
-
-        internal fun buildFwkAdvertiseData(
-            serviceUuids: MutableList<ParcelUuid>? = null,
-            manufacturerSpecificData: SparseArray<ByteArray>? = null,
-            serviceData: MutableMap<ParcelUuid, ByteArray>? = null,
-            includeTxPowerLevel: Boolean = false,
-            includeDeviceName: Boolean = false
-        ): FwkAdvertiseData {
-            val builder = FwkAdvertiseData.Builder()
-                .setIncludeTxPowerLevel(includeTxPowerLevel)
-                .setIncludeDeviceName(includeDeviceName)
-
-            serviceUuids?.forEach { builder.addServiceUuid(it) }
-
-            manufacturerSpecificData?.entriesIterator()?.forEach {
-                builder.addManufacturerData(it.first, it.second)
-            }
-
-            serviceData?.forEach { builder.addServiceData(it.key, it.value) }
-
-            return builder.build()
+            args.serviceSolicitationUuids?.forEach { builder.addServiceSolicitationUuid(it) }
+            return builder
         }
     }
 
-    val serviceUuids: MutableList<ParcelUuid>?
-        get() = fwkInstance.serviceUuids
-    val manufacturerSpecificData: SparseArray<ByteArray>?
-        get() = fwkInstance.manufacturerSpecificData
-    val serviceData: MutableMap<ParcelUuid, ByteArray>?
-        get() = fwkInstance.serviceData
-    val includeTxPowerLevel: Boolean
-        get() = fwkInstance.includeTxPowerLevel
-    val includeDeviceName: Boolean
-        get() = fwkInstance.includeDeviceName
-
-    constructor(
-        serviceUuids: MutableList<ParcelUuid>? = null,
-        manufacturerSpecificData: SparseArray<ByteArray>? = null,
-        serviceData: MutableMap<ParcelUuid, ByteArray>? = null,
-        includeTxPowerLevel: Boolean = false,
-        includeDeviceName: Boolean = false
-    ) : this(buildFwkAdvertiseData(
-        serviceUuids,
-        manufacturerSpecificData,
-        serviceData,
-        includeTxPowerLevel,
-        includeDeviceName
-    ))
-
     override fun toBundle(): Bundle {
         val bundle = Bundle()
         bundle.putParcelable(keyForField(FIELD_FWK_ADVERTISE_DATA), fwkInstance)
diff --git a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/AdvertiseSettings.kt b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/AdvertiseSettings.kt
index ae7fd27..b2e1eb4 100644
--- a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/AdvertiseSettings.kt
+++ b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/AdvertiseSettings.kt
@@ -18,20 +18,24 @@
 
 import android.bluetooth.le.AdvertiseSettings as FwkAdvertiseSettings
 import android.os.Bundle
-import androidx.bluetooth.core.utils.Bundleable
-import androidx.bluetooth.core.utils.Utils
+import androidx.annotation.RestrictTo
 
 /**
  * The {@link AdvertiseSettings} provide a way to adjust advertising preferences for each
- * Bluetooth LE advertisement instance.
- * @hide
+ * Bluetooth LE advertisement instance. Use the constructor to create an instance of this class.
  */
+@SuppressWarnings("HiddenSuperclass") // Bundleable
 class AdvertiseSettings internal constructor(internal val fwkInstance: FwkAdvertiseSettings) :
     Bundleable {
 
     companion object {
         internal const val FIELD_FWK_ADVERTISE_SETTINGS = 0
 
+        /**
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+        @JvmField
         val CREATOR: Bundleable.Creator<AdvertiseSettings> =
             object : Bundleable.Creator<AdvertiseSettings> {
                 override fun fromBundle(bundle: Bundle): AdvertiseSettings {
@@ -52,25 +56,16 @@
         }
 
         internal fun buildFwkAdvertiseSettings(
-            advertiseMode: Int? = null,
-            advertiseTxPowerLevel: Int? = null,
-            advertiseConnectable: Boolean = true,
-            advertiseTimeoutMillis: Int? = null,
+            advertiseMode: Int,
+            advertiseTxPowerLevel: Int,
+            advertiseConnectable: Boolean,
+            advertiseTimeoutMillis: Int,
         ): FwkAdvertiseSettings {
             val builder = FwkAdvertiseSettings.Builder()
                 .setConnectable(advertiseConnectable)
-
-            if (advertiseMode != null) {
-                builder.setAdvertiseMode(advertiseMode)
-            }
-
-            if (advertiseTxPowerLevel != null) {
-                builder.setTxPowerLevel(advertiseTxPowerLevel)
-            }
-
-            if (advertiseTimeoutMillis != null) {
-                builder.setTimeout(advertiseTimeoutMillis)
-            }
+                .setAdvertiseMode(advertiseMode)
+                .setTxPowerLevel(advertiseTxPowerLevel)
+                .setTimeout(advertiseTimeoutMillis)
 
             return builder.build()
         }
@@ -114,11 +109,6 @@
          * advertising packet.
          */
         const val ADVERTISE_TX_POWER_HIGH = FwkAdvertiseSettings.ADVERTISE_TX_POWER_HIGH
-
-        /**
-         * The maximum limited advertisement duration as specified by the Bluetooth SIG
-         */
-        const val LIMITED_ADVERTISING_MAX_MILLIS = 180_000
     }
 
     val advertiseMode: Int
@@ -135,10 +125,10 @@
         get() = fwkInstance.timeout
 
     constructor(
-        advertiseMode: Int? = null,
-        advertiseTxPowerLevel: Int? = null,
+        advertiseMode: Int = ADVERTISE_MODE_LOW_POWER,
+        advertiseTxPowerLevel: Int = ADVERTISE_TX_POWER_MEDIUM,
         advertiseConnectable: Boolean = true,
-        advertiseTimeoutMillis: Int? = null
+        advertiseTimeoutMillis: Int = 0
     ) : this(buildFwkAdvertiseSettings(
         advertiseMode,
         advertiseTxPowerLevel,
@@ -146,6 +136,10 @@
         advertiseTimeoutMillis
     ))
 
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
     override fun toBundle(): Bundle {
         val bundle = Bundle()
         bundle.putParcelable(keyForField(FIELD_FWK_ADVERTISE_SETTINGS), fwkInstance)
diff --git a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/AdvertisingSetParameters.kt b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/AdvertisingSetParameters.kt
index 1fd3b76..b945a9a 100644
--- a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/AdvertisingSetParameters.kt
+++ b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/AdvertisingSetParameters.kt
@@ -16,13 +16,11 @@
 
 package androidx.bluetooth.core
 
-import android.bluetooth.le.AdvertisingSetParameters as FwkAdvertisingSetParameters
 import android.bluetooth.BluetoothDevice as FwkBluetoothDevice
+import android.bluetooth.le.AdvertisingSetParameters as FwkAdvertisingSetParameters
 import android.os.Build
 import android.os.Bundle
 import androidx.annotation.RequiresApi
-import androidx.bluetooth.core.utils.Bundleable
-import androidx.bluetooth.core.utils.Utils
 
 /**
  * TODO: Add docs
diff --git a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothClass.kt b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothClass.kt
index 7b54dda6..6508c06 100644
--- a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothClass.kt
+++ b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothClass.kt
@@ -20,8 +20,7 @@
 import android.annotation.SuppressLint
 import android.os.Build
 import android.os.Bundle
-import androidx.bluetooth.core.utils.Bundleable
-import androidx.bluetooth.core.utils.Utils
+
 /**
  * Represents a Bluetooth class, which describes general characteristics
  * and capabilities of a device. For example, a Bluetooth class will
diff --git a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothGattCharacteristic.kt b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothGattCharacteristic.kt
index a82a182..bd6c937 100644
--- a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothGattCharacteristic.kt
+++ b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothGattCharacteristic.kt
@@ -16,14 +16,12 @@
 
 package androidx.bluetooth.core
 
+import android.bluetooth.BluetoothGattCharacteristic as FwkBluetoothGattCharacteristic
 import android.os.Build
 import android.os.Bundle
-import android.bluetooth.BluetoothGattCharacteristic as FwkBluetoothGattCharacteristic
 import androidx.annotation.RequiresApi
-import androidx.bluetooth.core.utils.Bundleable
-import androidx.bluetooth.core.utils.Utils
-
 import java.util.UUID
+
 /**
  * @hide
  */
diff --git a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothGattDescriptor.kt b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothGattDescriptor.kt
index 943dd24..612cdb0 100644
--- a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothGattDescriptor.kt
+++ b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothGattDescriptor.kt
@@ -16,14 +16,12 @@
 
 package androidx.bluetooth.core
 
+import android.bluetooth.BluetoothGattDescriptor as FwkBluetoothGattDescriptor
 import android.os.Build
 import android.os.Bundle
-import android.bluetooth.BluetoothGattDescriptor as FwkBluetoothGattDescriptor
 import androidx.annotation.RequiresApi
-import androidx.bluetooth.core.utils.Bundleable
-import androidx.bluetooth.core.utils.Utils
-
 import java.util.UUID
+
 /**
  * @hide
  */
diff --git a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothGattService.kt b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothGattService.kt
index c0042c3..b6b75b3 100644
--- a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothGattService.kt
+++ b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothGattService.kt
@@ -20,8 +20,6 @@
 import android.os.Build
 import android.os.Bundle
 import androidx.annotation.RequiresApi
-import androidx.bluetooth.core.utils.Bundleable
-import androidx.bluetooth.core.utils.Utils
 import java.util.UUID
 
 /**
diff --git a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/utils/Bundleable.kt b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/Bundleable.kt
similarity index 76%
rename from bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/utils/Bundleable.kt
rename to bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/Bundleable.kt
index e984a74..ccf7d01 100644
--- a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/utils/Bundleable.kt
+++ b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/Bundleable.kt
@@ -14,18 +14,25 @@
  * limitations under the License.
  */
 
-package androidx.bluetooth.core.utils
+package androidx.bluetooth.core
 
 import android.os.Bundle
+import androidx.annotation.RestrictTo
 
 /**
+ * A class that serializes and stores an object for sending over IPC.
  * @hide
  */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 interface Bundleable {
-    /** Returns a [Bundle] representing the information stored in this object.  */
+    /**
+     * Returns a [Bundle] representing the information stored in this object.
+     */
     fun toBundle(): Bundle
 
-    /** Interface for the static `CREATOR` field of [Bundleable] classes.  */
+    /**
+     *  Interface for the static `CREATOR` field of [Bundleable] classes.
+     */
     interface Creator<T : Bundleable> {
         /**
          * Restores a [Bundleable] instance from a [Bundle] produced by [Bundleable.toBundle].
diff --git a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/ScanFilter.kt b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/ScanFilter.kt
index 6464f38..ac3eb59 100644
--- a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/ScanFilter.kt
+++ b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/ScanFilter.kt
@@ -17,21 +17,33 @@
 package androidx.bluetooth.core
 
 import android.bluetooth.le.ScanFilter as FwkScanFilter
+import android.bluetooth.le.ScanResult as FwkScanResult
 import android.annotation.SuppressLint
 import android.os.Build
 import android.os.Bundle
 import android.os.ParcelUuid
 import androidx.annotation.RequiresApi
-import androidx.bluetooth.core.utils.Bundleable
-import androidx.bluetooth.core.utils.Utils
+import androidx.annotation.RestrictTo
 
 /**
- * TODO: Copy docs
- * @hide
+ * Criteria for filtering result from Bluetooth LE scans. A {@link ScanFilter} allows clients to
+ * restrict scan results to only those that are of interest to them.
+ * <p>
+ * Current filtering on the following fields are supported:
+ * <li>Service UUIDs which identify the bluetooth gatt services running on the device.
+ * <li>Name of remote Bluetooth LE device.
+ * <li>Mac address of the remote device.
+ * <li>Service data which is the data associated with a service.
+ * <li>Manufacturer specific data which is the data associated with a particular manufacturer.
+ * <li>Advertising data type and corresponding data.
+ *
+ * @see BluetoothLeScanner
  */
+// TODO: Add @See ScanResult once ScanResult added
+@SuppressWarnings("HiddenSuperclass") // Bundleable
 class ScanFilter internal constructor(
     internal val impl: ScanFilterImpl
-) : ScanFilterImpl by impl, Bundleable {
+) : Bundleable {
     companion object {
         internal const val FIELD_FWK_SCAN_FILTER = 0
         internal const val FIELD_SERVICE_SOLICITATION_UUID = 1
@@ -40,6 +52,11 @@
         internal const val FIELD_ADVERTISING_DATA_MASK = 4
         internal const val FIELD_ADVERTISING_DATA_TYPE = 5
 
+        /**
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+        @JvmField
         val CREATOR: Bundleable.Creator<ScanFilter> =
             object : Bundleable.Creator<ScanFilter> {
                 override fun fromBundle(bundle: Bundle): ScanFilter {
@@ -118,6 +135,37 @@
         }
     }
 
+    val deviceName: String?
+        get() = impl.deviceName
+    val deviceAddress: String?
+        get() = impl.deviceAddress
+    val serviceUuid: ParcelUuid?
+        get() = impl.serviceUuid
+    val serviceUuidMask: ParcelUuid?
+        get() = impl.serviceUuidMask
+    val serviceDataUuid: ParcelUuid?
+        get() = impl.serviceDataUuid
+    val serviceData: ByteArray?
+        get() = impl.serviceData
+    val serviceDataMask: ByteArray?
+        get() = impl.serviceDataMask
+    val manufacturerId: Int
+        get() = impl.manufacturerId
+    val manufacturerData: ByteArray?
+        get() = impl.manufacturerData
+    val manufacturerDataMask: ByteArray?
+        get() = impl.manufacturerDataMask
+    val serviceSolicitationUuid: ParcelUuid?
+        get() = impl.serviceSolicitationUuid
+    val serviceSolicitationUuidMask: ParcelUuid?
+        get() = impl.serviceSolicitationUuidMask
+    val advertisingData: ByteArray?
+        get() = impl.advertisingData
+    val advertisingDataMask: ByteArray?
+        get() = impl.advertisingDataMask
+    val advertisingDataType: Int
+        get() = impl.advertisingDataType
+
     internal constructor(fwkInstance: FwkScanFilter) : this(
         if (Build.VERSION.SDK_INT >= 33) {
             ScanFilterImplApi33(fwkInstance)
@@ -173,6 +221,18 @@
             ScanFilterImplApi21(fwkInstance, args)
         }
     )
+
+    /**
+     * Check if the scan filter matches a {@code scanResult}. A scan result is considered as a match
+     * if it matches all the field filters.
+     */
+    // TODO: add test for this method
+    fun matches(scanResult: FwkScanResult?): Boolean = impl.matches(scanResult)
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
     override fun toBundle(): Bundle {
         val bundle = Bundle()
         bundle.putScanFilter(this)
@@ -264,6 +324,8 @@
     val advertisingDataType: Int
 
     val fwkInstance: FwkScanFilter
+
+    fun matches(scanResult: FwkScanResult?): Boolean
 }
 
 internal abstract class ScanFilterFwkImplApi21 internal constructor(
@@ -289,6 +351,10 @@
         get() = fwkInstance.manufacturerData
     override val manufacturerDataMask: ByteArray?
         get() = fwkInstance.manufacturerDataMask
+
+    override fun matches(scanResult: android.bluetooth.le.ScanResult?): Boolean {
+        return fwkInstance.matches(scanResult)
+    }
 }
 
 internal class ScanFilterImplApi21 internal constructor(
diff --git a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/utils/Utils.kt b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/Utils.kt
similarity index 93%
rename from bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/utils/Utils.kt
rename to bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/Utils.kt
index 664275e..e322c1f 100644
--- a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/utils/Utils.kt
+++ b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/Utils.kt
@@ -14,18 +14,13 @@
  * limitations under the License.
  */
 
-package androidx.bluetooth.core.utils
+package androidx.bluetooth.core
 
 import android.annotation.SuppressLint
 import android.os.Build
 import android.os.Bundle
 import android.os.Parcelable
-import androidx.annotation.RestrictTo
 
-/**
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY)
 internal object Utils {
     // TODO: Migrate to BundleCompat when available
     @SuppressLint("ClassVerificationFailure") // bundle.getParcelable(key, clazz)
@@ -64,4 +59,4 @@
             emptyList()
         }
     }
-}
\ No newline at end of file
+}
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index 899aac5..046da20 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -34,8 +34,6 @@
             freeCompilerArgs += [
                     "-Werror",
                     "-Xskip-metadata-version-check",
-                    // Allow `@OptIn` and `@UseExperimental`
-                    "-opt-in=kotlin.RequiresOptIn",
                     // Issue where sam conversion in gradle's kts file causes task-out-of-date
                     // Details: KT-46445 and https://github.com/gradle/gradle/issues/17052
                     "-Xsam-conversions=class"
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt
index 846372f..c5d52ce 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt
@@ -302,7 +302,6 @@
             multiplatformExtension.sourceSets.all {
                 // Allow all experimental APIs, since MPP projects are themselves experimental
                 it.languageSettings.apply {
-                    optIn("kotlin.Experimental")
                     optIn("kotlin.ExperimentalMultiplatform")
                 }
             }
@@ -365,9 +364,6 @@
         val libraryMetricsDirectory = project.rootProject.getLibraryMetricsDirectory()
         val libraryReportsDirectory = project.rootProject.getLibraryReportsDirectory()
         project.tasks.withType(KotlinCompile::class.java).configureEach { compile ->
-            // TODO(b/157230235): remove when this is enabled by default
-            compile.kotlinOptions.freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
-
             // Append inputs to KotlinCompile so tasks get invalidated if any of these values change
             compile.inputs.files({ kotlinPlugin })
                 .withPropertyName("composeCompilerExtension")
@@ -505,7 +501,6 @@
     return results.toSet()
 }
 
-@OptIn(ExperimentalStdlibApi::class)
 @PublishedApi
 internal inline fun <reified T> deque(initialSize: Int): MutableList<T> {
     return if (KotlinVersion.CURRENT.isAtLeast(1, 4)) ArrayDeque(initialSize)
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt
index a4a6fd6..5112bec 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt
@@ -23,6 +23,7 @@
 import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginWrapper
 import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
 import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
+import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
 import org.jetbrains.kotlin.gradle.plugin.KotlinTargetPreset
 import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
 import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithHostTests
@@ -62,6 +63,17 @@
         } else { null }
     }
 
+    @JvmOverloads
+    fun android(
+        block: Action<KotlinAndroidTarget>? = null
+    ): KotlinAndroidTarget? {
+        return if (project.enableJvm()) {
+            kotlinExtension.android {
+                block?.execute(this)
+            }
+        } else { null }
+    }
+
     /**
      * Configures all mac targets supported by AndroidX.
      */
diff --git a/camera/camera-camera2-pipe-integration/build.gradle b/camera/camera-camera2-pipe-integration/build.gradle
index d971de0..9fcacd4 100644
--- a/camera/camera-camera2-pipe-integration/build.gradle
+++ b/camera/camera-camera2-pipe-integration/build.gradle
@@ -98,13 +98,6 @@
     }
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 androidx {
     name = "Jetpack Camera Camera Pipe Integration Library"
     publish = Publish.NONE
diff --git a/camera/camera-camera2-pipe-testing/build.gradle b/camera/camera-camera2-pipe-testing/build.gradle
index 5497bb7..78edf1d 100644
--- a/camera/camera-camera2-pipe-testing/build.gradle
+++ b/camera/camera-camera2-pipe-testing/build.gradle
@@ -51,13 +51,6 @@
     namespace "androidx.camera.camera2.pipe.testing"
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 androidx {
     name = "Jetpack Camera Camera Pipe Testing Library"
     publish = Publish.SNAPSHOT_AND_RELEASE
diff --git a/camera/camera-camera2-pipe/build.gradle b/camera/camera-camera2-pipe/build.gradle
index 071a5e2..11f1c61 100644
--- a/camera/camera-camera2-pipe/build.gradle
+++ b/camera/camera-camera2-pipe/build.gradle
@@ -95,10 +95,3 @@
     description = "A set of opinionated camera interfaces and implementations on top of Camera2 " +
             "that will form a flexible shim layer to power Frameserver and CameraX."
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java
index e5c45ee..fbf862e 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java
@@ -1000,7 +1000,7 @@
                 mCaptureSessionOpenerBuilder.build());
         InOrder inOrder = inOrder(mTestParameters0.mMockCameraEventCallback);
 
-        inOrder.verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onPresetSession();
+        inOrder.verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onInitSession();
         inOrder.verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onEnableSession();
         inOrder.verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onRepeating();
         verify(mTestParameters0.mMockCameraEventCallback, never()).onDisableSession();
@@ -1009,6 +1009,8 @@
 
         captureSession.close();
         verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onDisableSession();
+        captureSession.release(false);
+        verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onDeInitSession();
 
         verifyNoMoreInteractions(mTestParameters0.mMockCameraEventCallback);
     }
@@ -1021,13 +1023,15 @@
                 mCaptureSessionOpenerBuilder.build());
 
         InOrder inOrder = inOrder(mTestParameters0.mMockCameraEventCallback);
-        inOrder.verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onPresetSession();
+        inOrder.verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onInitSession();
         inOrder.verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onEnableSession();
         // Should not trigger repeating since the repeating SessionConfig is empty.
         verify(mTestParameters0.mMockCameraEventCallback, never()).onRepeating();
 
         captureSession.close();
         inOrder.verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onDisableSession();
+        captureSession.release(false);
+        verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onDeInitSession();
 
         verifyNoMoreInteractions(mTestParameters0.mMockCameraEventCallback);
     }
@@ -1618,7 +1622,7 @@
                 CameraCaptureCallback.class);
 
         @Override
-        public CaptureConfig onPresetSession() {
+        public CaptureConfig onInitSession() {
             return getCaptureConfig(CaptureRequest.CONTROL_CAPTURE_INTENT,
                     CaptureRequest.CONTROL_CAPTURE_INTENT_VIDEO_RECORD, null);
         }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallback.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallback.java
index f0269a3b..1a2d805 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallback.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallback.java
@@ -29,15 +29,17 @@
 public abstract class CameraEventCallback {
 
     /**
-     * This will be invoked before creating a {@link CameraCaptureSession}. The returned
-     * parameter in CaptureConfig will be passed to the camera device as part of the capture session
-     * initialization via setSessionParameters(). The valid parameter is a subset of the
-     * available capture request parameters.
+     * This will be invoked before creating a {@link CameraCaptureSession} for initializing the
+     * session.
+     *
+     * <p>The returned parameter in CaptureConfig will be passed to the camera device as part of
+     * the capture session initialization via setSessionParameters(). The valid parameter is a
+     * subset of the available capture request parameters.
      *
      * @return CaptureConfig The request information to customize the session.
      */
     @Nullable
-    public CaptureConfig onPresetSession() {
+    public CaptureConfig onInitSession() {
         return null;
     }
 
@@ -79,4 +81,8 @@
         return null;
     }
 
+    /**
+     * This will be invoked after the {@link CameraCaptureSession} is closed.
+     */
+    public void onDeInitSession() {}
 }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallbacks.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallbacks.java
index d792ec7..f0badc3 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallbacks.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallbacks.java
@@ -70,16 +70,18 @@
         }
 
         /**
-         * To Invoke {@link CameraEventCallback#onPresetSession()} on the set of list and
-         * aggregated the results to a set list.
+         * Invokes {@link CameraEventCallback#onInitSession()} on all registered callbacks and
+         * returns a {@link CaptureConfig} list that aggregates all the results for setting the
+         * session parameters.
          *
-         * @return List<CaptureConfig> The request information to customize the session.
+         * @return a {@link List<CaptureConfig>} that contains session parameters to be configured
+         * upon creating {@link android.hardware.camera2.CameraCaptureSession}
          */
         @NonNull
-        public List<CaptureConfig> onPresetSession() {
+        public List<CaptureConfig> onInitSession() {
             List<CaptureConfig> ret = new ArrayList<>();
             for (CameraEventCallback callback : mCallbacks) {
-                CaptureConfig presetCaptureStage = callback.onPresetSession();
+                CaptureConfig presetCaptureStage = callback.onInitSession();
                 if (presetCaptureStage != null) {
                     ret.add(presetCaptureStage);
                 }
@@ -88,10 +90,15 @@
         }
 
         /**
-         * To Invoke {@link CameraEventCallback#onEnableSession()} on the set of list and
-         * aggregated the results to a set list.
+         * Invokes {@link CameraEventCallback#onEnableSession()} on all registered callbacks and
+         * returns a {@link CaptureConfig} list that aggregates all the results. The returned
+         * list contains capture request parameters to be set on a single request that will be
+         * triggered right after {@link android.hardware.camera2.CameraCaptureSession} is
+         * configured.
          *
-         * @return List<CaptureConfig> The request information to customize the session.
+         * @return a {@link List<CaptureConfig>} that contains capture request parameters to be
+         * set on a single request that will be triggered after
+         * {@link android.hardware.camera2.CameraCaptureSession} is configured.
          */
         @NonNull
         public List<CaptureConfig> onEnableSession() {
@@ -106,10 +113,12 @@
         }
 
         /**
-         * To Invoke {@link CameraEventCallback#onRepeating()} on the set of list and
-         * aggregated the results to a set list.
+         * Invokes {@link CameraEventCallback#onRepeating()} on all registered callbacks and
+         * returns a {@link CaptureConfig} list that aggregates all the results. The returned
+         * list contains capture request parameters to be set on the repeating request.
          *
-         * @return List<CaptureConfig> The request information to customize the session.
+         * @return a {@link List<CaptureConfig>} that contains capture request parameters to be
+         * set on the repeating request.
          */
         @NonNull
         public List<CaptureConfig> onRepeating() {
@@ -124,10 +133,14 @@
         }
 
         /**
-         * To Invoke {@link CameraEventCallback#onDisableSession()} on the set of list and
-         * aggregated the results to a set list.
+         * Invokes {@link CameraEventCallback#onDisableSession()} on all registered callbacks and
+         * returns a {@link CaptureConfig} list that aggregates all the results. The returned
+         * list contains capture request parameters to be set on a single request that will be
+         * triggered right before {@link android.hardware.camera2.CameraCaptureSession} is closed.
          *
-         * @return List<CaptureConfig> The request information to customize the session.
+         * @return a {@link List<CaptureConfig>} that contains capture request parameters to be
+         * set on a single request that will be triggered right before
+         * {@link android.hardware.camera2.CameraCaptureSession} is closed.
          */
         @NonNull
         public List<CaptureConfig> onDisableSession() {
@@ -141,6 +154,15 @@
             return ret;
         }
 
+        /**
+         * Invokes {@link CameraEventCallback#onDeInitSession()} on all registered callbacks.
+         */
+        public void onDeInitSession() {
+            for (CameraEventCallback callback : mCallbacks) {
+                callback.onDeInitSession();
+            }
+        }
+
         @NonNull
         public List<CameraEventCallback> getCallbacks() {
             return mCallbacks;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java
index 7527c70..d0553ae 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java
@@ -291,7 +291,7 @@
                     mCameraEventCallbacks = camera2Config
                             .getCameraEventCallback(CameraEventCallbacks.createEmptyCallback());
                     List<CaptureConfig> presetList =
-                            mCameraEventCallbacks.createComboCallback().onPresetSession();
+                            mCameraEventCallbacks.createComboCallback().onInitSession();
 
                     // Generate the CaptureRequest builder from repeating request since Android
                     // recommend use the same template type as the initial capture request. The
@@ -490,6 +490,7 @@
                     }
                     // Fall through
                 case OPENING:
+                    mCameraEventCallbacks.createComboCallback().onDeInitSession();
                     mState = State.RELEASING;
                     Preconditions.checkNotNull(mSynchronizedCaptureSessionOpener, "The "
                             + "Opener shouldn't null in state:" + mState);
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/AfRegionFlipHorizontallyQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/AfRegionFlipHorizontallyQuirk.java
index 3491c37..2a14349 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/AfRegionFlipHorizontallyQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/AfRegionFlipHorizontallyQuirk.java
@@ -38,6 +38,7 @@
 public class AfRegionFlipHorizontallyQuirk implements Quirk {
     static boolean load(@NonNull final CameraCharacteristicsCompat cameraCharacteristicsCompat) {
         return (Build.BRAND.equalsIgnoreCase("SAMSUNG")
+                && Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU // Samsung fixed it in T.
                 && cameraCharacteristicsCompat.get(CameraCharacteristics.LENS_FACING)
                         == CameraCharacteristics.LENS_FACING_FRONT);
     }
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/quirk/AfRegionFlipHorizontallyQuirkTest.kt b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/quirk/AfRegionFlipHorizontallyQuirkTest.kt
index 3603c42..fecd0b5 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/quirk/AfRegionFlipHorizontallyQuirkTest.kt
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/quirk/AfRegionFlipHorizontallyQuirkTest.kt
@@ -66,6 +66,7 @@
     }
 
     @Test
+    @Config(maxSdk = Build.VERSION_CODES.S_V2)
     fun canEnableQuirkCorrectly() {
         // Arrange
         ShadowBuild.setBrand(brand)
@@ -79,4 +80,20 @@
         Truth.assertThat(cameraQuirks.contains(AfRegionFlipHorizontallyQuirk::class.java))
             .isEqualTo(enabled)
     }
+
+    @Test
+    @Config(minSdk = Build.VERSION_CODES.TIRAMISU)
+    fun canDisableQuirkOnSamsungAPI33() {
+        // Arrange
+        ShadowBuild.setBrand(brand)
+        ShadowBuild.setModel("DO NOT CARE")
+        ShadowBuild.setDevice("DO NOT CARE")
+
+        // Act
+        val cameraQuirks = getCameraQuirks(lensFacing)
+
+        // Verify
+        Truth.assertThat(cameraQuirks.contains(AfRegionFlipHorizontallyQuirk::class.java))
+            .isEqualTo(false)
+    }
 }
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java
index 32e1649..b60a356 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java
@@ -25,6 +25,7 @@
 import android.graphics.ImageFormat;
 import android.graphics.Rect;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.OptIn;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SdkSuppress;
@@ -71,7 +72,7 @@
         mImageProxy.addOnImageCloseListener(
                 new ForwardingImageProxy.OnImageCloseListener() {
                     @Override
-                    public void onImageClose(ImageProxy image) {
+                    public void onImageClose(@NonNull ImageProxy image) {
                         closedImage.set(image);
                         closedImageSemaphore.release();
                     }
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/SafeCloseImageReaderProxyTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/SafeCloseImageReaderProxyTest.java
index 7287460..64ae16c 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/SafeCloseImageReaderProxyTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/SafeCloseImageReaderProxyTest.java
@@ -140,4 +140,21 @@
         // Assert
         verifyZeroInteractions(onImageAvailableListener);
     }
+
+    @Test
+    public void closeTheImageInQueue_onImageCloseListenerGetsInvoked() throws InterruptedException {
+        // Arrange
+        ForwardingImageProxy.OnImageCloseListener onImageCloseListener = mock(
+                ForwardingImageProxy.OnImageCloseListener.class);
+        mSafeCloseImageReaderProxy.setOnImageCloseListener(onImageCloseListener);
+
+        // Act: send and close image.
+        mFakeImageReaderProxy.triggerImageAvailable(TagBundle.create(new Pair<>(mTagBundleKey,
+                mTag)), 1);
+        ImageProxy imageProxy = mSafeCloseImageReaderProxy.acquireLatestImage();
+        imageProxy.close();
+
+        // Assert: the callback gets invoked
+        verify(onImageCloseListener).onImageClose(any(ImageProxy.class));
+    }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java
index 92efe7d..b3e1d44 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java
@@ -41,6 +41,9 @@
     private final ImageReader mImageReader;
     private final Object mLock = new Object();
 
+    @GuardedBy("mLock")
+    private boolean mIsImageAvailableListenerCleared = true;
+
     /**
      * Creates a new instance which wraps the given image reader.
      *
@@ -153,10 +156,20 @@
             @NonNull OnImageAvailableListener listener,
             @NonNull Executor executor) {
         synchronized (mLock) {
+            mIsImageAvailableListenerCleared = false;
             // ImageReader does not accept an executor. As a workaround, the callback is run on main
             // handler then immediately posted to the executor.
-            ImageReader.OnImageAvailableListener transformedListener = (imageReader) ->
-                    executor.execute(() -> listener.onImageAvailable(AndroidImageReaderProxy.this));
+            ImageReader.OnImageAvailableListener transformedListener = (imageReader) -> {
+                synchronized (mLock) {
+                    // There might be a timing issue that the listener is executed after
+                    // clearOnImageAvailableListener() has been called. Uses a flag to skip the
+                    // execution if the listener has actually been cleared.
+                    if (!mIsImageAvailableListenerCleared) {
+                        executor.execute(
+                                () -> listener.onImageAvailable(AndroidImageReaderProxy.this));
+                    }
+                }
+            };
             mImageReader.setOnImageAvailableListener(transformedListener,
                     MainThreadAsyncHandler.getInstance());
         }
@@ -165,6 +178,7 @@
     @Override
     public void clearOnImageAvailableListener() {
         synchronized (mLock) {
+            mIsImageAvailableListenerCleared = true;
             mImageReader.setOnImageAvailableListener(null, null);
         }
     }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CaptureBundles.java b/camera/camera-core/src/main/java/androidx/camera/core/CaptureBundles.java
index e8470cf..f1fa381 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CaptureBundles.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CaptureBundles.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
 import androidx.camera.core.impl.CaptureBundle;
 import androidx.camera.core.impl.CaptureStage;
 
@@ -28,12 +29,15 @@
 
 /**
  * Different implementations of {@link CaptureBundle}.
+ *
+ * @hide
  */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-final class CaptureBundles {
+public final class CaptureBundles {
     /** Creates a {@link CaptureBundle} which contain a single default {@link CaptureStage}. */
     @NonNull
-    static CaptureBundle singleDefaultCaptureBundle() {
+    public static CaptureBundle singleDefaultCaptureBundle() {
         return createCaptureBundle(new CaptureStage.DefaultCaptureStage());
     }
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ForwardingImageProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/ForwardingImageProxy.java
index 03a638e..164a009 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ForwardingImageProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ForwardingImageProxy.java
@@ -23,6 +23,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
 
 import java.util.HashSet;
 import java.util.Set;
@@ -35,9 +36,12 @@
  *
  * <p>Listeners for the image close call can be added. When the image is closed, the listeners will
  * be notified.
+ *
+ * @hide
  */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-abstract class ForwardingImageProxy implements ImageProxy {
+public abstract class ForwardingImageProxy implements ImageProxy {
     private final Object mLock = new Object();
 
     protected final ImageProxy mImage;
@@ -50,7 +54,7 @@
      *
      * @param image to wrap
      */
-    protected ForwardingImageProxy(ImageProxy image) {
+    protected ForwardingImageProxy(@NonNull ImageProxy image) {
         mImage = image;
     }
 
@@ -98,6 +102,7 @@
         return mImage.getImageInfo();
     }
 
+    @Nullable
     @Override
     @ExperimentalGetImage
     public Image getImage() {
@@ -109,7 +114,7 @@
      *
      * @param listener to add
      */
-    void addOnImageCloseListener(OnImageCloseListener listener) {
+    public void addOnImageCloseListener(@NonNull OnImageCloseListener listener) {
         synchronized (mLock) {
             mOnImageCloseListeners.add(listener);
         }
@@ -130,12 +135,12 @@
     }
 
     /** Listener for the image close event. */
-    interface OnImageCloseListener {
+    public interface OnImageCloseListener {
         /**
          * Callback for image close.
          *
          * @param image which is closed
          */
-        void onImageClose(ImageProxy image);
+        void onImageClose(@NonNull ImageProxy image);
     }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
index 64870e3..e09c291 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
@@ -1481,7 +1481,7 @@
         }
 
         @Override
-        public void onImageClose(ImageProxy image) {
+        public void onImageClose(@NonNull ImageProxy image) {
             synchronized (mLock) {
                 mOutstandingImages--;
                 processNextRequest();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java b/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java
index 62e68b3..9f1d180f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java
@@ -255,6 +255,7 @@
     @Override
     public void clearOnImageAvailableListener() {
         synchronized (mLock) {
+            mImageReaderProxy.clearOnImageAvailableListener();
             mListener = null;
             mExecutor = null;
         }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ProcessingSurface.java b/camera/camera-core/src/main/java/androidx/camera/core/ProcessingSurface.java
index e2410a3..2352e36 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ProcessingSurface.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ProcessingSurface.java
@@ -213,6 +213,8 @@
                 return;
             }
 
+            mInputImageReader.clearOnImageAvailableListener();
+
             // Since the ProcessingSurface DeferrableSurface has been terminated, it is safe to
             // close the inputs.
             mInputImageReader.close();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java
index 775f812..159949c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java
@@ -23,6 +23,7 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
+import androidx.camera.core.ForwardingImageProxy.OnImageCloseListener;
 import androidx.camera.core.impl.ImageReaderProxy;
 
 import java.util.concurrent.Executor;
@@ -50,14 +51,20 @@
 
     @Nullable
     private final Surface mSurface;
+    private OnImageCloseListener mForwardingImageCloseListener;
 
     // Called after images are closed to check if the ImageReaderProxy should be closed
-    private final ForwardingImageProxy.OnImageCloseListener mImageCloseListener = (image) -> {
+    private final OnImageCloseListener mImageCloseListener = (image) -> {
+        OnImageCloseListener forwardingListener;
         synchronized (mLock) {
             mOutstandingImages--;
             if (mIsClosed && mOutstandingImages == 0) {
                 close();
             }
+            forwardingListener = mForwardingImageCloseListener;
+        }
+        if (forwardingListener != null) {
+            forwardingListener.onImageClose(image);
         }
     };
 
@@ -132,6 +139,25 @@
         }
     }
 
+    /**
+     * Returns the number of empty slots in the queue.
+     */
+    public int getCapacity() {
+        synchronized (mLock) {
+            return mImageReaderProxy.getMaxImages() - mOutstandingImages;
+        }
+    }
+
+    /**
+     * Sets a listener for close calls on this image.
+     * @param listener to set
+     */
+    public void setOnImageCloseListener(@NonNull OnImageCloseListener listener) {
+        synchronized (mLock) {
+            mForwardingImageCloseListener = listener;
+        }
+    }
+
     @Override
     public int getHeight() {
         synchronized (mLock) {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/CaptureNode.java b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/CaptureNode.java
index 0bcf0db..fc6d05e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/CaptureNode.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/CaptureNode.java
@@ -31,6 +31,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.VisibleForTesting;
+import androidx.camera.core.ForwardingImageProxy;
 import androidx.camera.core.ImageProxy;
 import androidx.camera.core.MetadataImageReader;
 import androidx.camera.core.SafeCloseImageReaderProxy;
@@ -56,8 +57,6 @@
  * <p>It's also responsible for managing the {@link ImageReaderProxy}. It makes sure that the
  * queue is not overflowed.
  *
- * TODO(b/242539529): expose a method that returns the number of empty slots in the queue.
- * TODO(b/242539529): accept a callback that gets invoked when a slot is freed up in the queue.
  */
 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 class CaptureNode implements Node<CaptureNode.In, CaptureNode.Out> {
@@ -125,6 +124,8 @@
             mCurrentRequest.onImageCaptured();
             mCurrentRequest = null;
         }
+
+        // Send the image downstream.
         mOutputEdge.getImageEdge().accept(imageProxy);
     }
 
@@ -132,6 +133,9 @@
     @MainThread
     void onRequestAvailable(@NonNull ProcessingRequest request) {
         checkMainThread();
+        // Unable to issue request if the queue has no capacity.
+        checkState(getCapacity() > 0,
+                "Too many acquire images. Close image to be able to process next.");
         // Check if there is already a current request. Only one concurrent request is allowed.
         checkState(mCurrentRequest == null || mPendingStageIds.isEmpty(),
                 "The previous request is not complete");
@@ -162,6 +166,28 @@
         }
     }
 
+    @VisibleForTesting
+    @NonNull
+    In getInputEdge() {
+        return mInputEdge;
+    }
+
+    @MainThread
+    public int getCapacity() {
+        checkMainThread();
+        checkState(mSafeCloseImageReaderProxy != null,
+                "The ImageReader is not initialized.");
+        return mSafeCloseImageReaderProxy.getCapacity();
+    }
+
+    @MainThread
+    public void setOnImageCloseListener(ForwardingImageProxy.OnImageCloseListener listener) {
+        checkMainThread();
+        checkState(mSafeCloseImageReaderProxy != null,
+                "The ImageReader is not initialized.");
+        mSafeCloseImageReaderProxy.setOnImageCloseListener(listener);
+    }
+
     /**
      * Input edges of a {@link CaptureNode}.
      */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ImagePipeline.java b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ImagePipeline.java
index a99683b..3b7e8d2 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ImagePipeline.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ImagePipeline.java
@@ -16,8 +16,12 @@
 
 package androidx.camera.core.imagecapture;
 
+import static androidx.camera.core.CaptureBundles.singleDefaultCaptureBundle;
 import static androidx.camera.core.impl.utils.Threads.checkMainThread;
 
+import static java.util.Objects.requireNonNull;
+
+import android.graphics.ImageFormat;
 import android.media.ImageReader;
 import android.os.Build;
 import android.util.Size;
@@ -25,13 +29,19 @@
 import androidx.annotation.MainThread;
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
+import androidx.annotation.VisibleForTesting;
 import androidx.camera.core.ImageCapture;
+import androidx.camera.core.impl.CaptureBundle;
 import androidx.camera.core.impl.CaptureConfig;
-import androidx.camera.core.impl.DeferrableSurface;
+import androidx.camera.core.impl.CaptureStage;
 import androidx.camera.core.impl.ImageCaptureConfig;
 import androidx.camera.core.impl.SessionConfig;
+import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.core.util.Pair;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * The class that builds and maintains the {@link ImageCapture} pipeline.
  *
@@ -41,21 +51,43 @@
 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 public class ImagePipeline {
 
+    // Use case configs.
     @NonNull
-    private ImageCaptureConfig mConfig;
-    @SuppressWarnings("UnusedVariable")
+    private final ImageCaptureConfig mUseCaseConfig;
     @NonNull
-    private Size mCameraSurfaceSize;
+    private final CaptureConfig mCaptureConfig;
+
+    // Post-processing pipeline.
+    @NonNull
+    private final CaptureNode mCaptureNode;
+    @NonNull
+    private final SingleBundlingNode mBundlingNode;
+    @NonNull
+    private ProcessingNode mProcessingNode;
+    @NonNull
+    private final CaptureNode.In mPipelineIn;
 
     // ===== public methods =====
 
     @MainThread
     public ImagePipeline(
-            @NonNull ImageCaptureConfig config,
+            @NonNull ImageCaptureConfig useCaseConfig,
             @NonNull Size cameraSurfaceSize) {
         checkMainThread();
-        mConfig = config;
-        mCameraSurfaceSize = cameraSurfaceSize;
+        mUseCaseConfig = useCaseConfig;
+        mCaptureConfig = CaptureConfig.Builder.createFrom(useCaseConfig).build();
+
+        // Create nodes
+        mCaptureNode = new CaptureNode();
+        mBundlingNode = new SingleBundlingNode();
+        mProcessingNode = new ProcessingNode(
+                requireNonNull(mUseCaseConfig.getIoExecutor(CameraXExecutors.ioExecutor())));
+
+        // Connect nodes
+        mPipelineIn = CaptureNode.In.of(cameraSurfaceSize, mUseCaseConfig.getInputFormat());
+        CaptureNode.Out captureOut = mCaptureNode.transform(mPipelineIn);
+        ProcessingNode.In processingIn = mBundlingNode.transform(captureOut);
+        mProcessingNode.transform(processingIn);
     }
 
     /**
@@ -63,8 +95,8 @@
      */
     @NonNull
     public SessionConfig.Builder createSessionConfigBuilder() {
-        SessionConfig.Builder builder = SessionConfig.Builder.createFrom(mConfig);
-        builder.addNonRepeatingSurface(getCameraSurface());
+        SessionConfig.Builder builder = SessionConfig.Builder.createFrom(mUseCaseConfig);
+        builder.addNonRepeatingSurface(mPipelineIn.getSurface());
         // TODO(b/242536140): enable ZSL.
         return builder;
     }
@@ -78,7 +110,9 @@
     @MainThread
     public void close() {
         checkMainThread();
-        throw new UnsupportedOperationException();
+        mCaptureNode.release();
+        mBundlingNode.release();
+        mProcessingNode.release();
     }
 
     // ===== protected methods =====
@@ -97,26 +131,87 @@
             @NonNull TakePictureRequest takePictureRequest,
             @NonNull TakePictureCallback takePictureCallback) {
         checkMainThread();
-        throw new UnsupportedOperationException();
+        CaptureBundle captureBundle = createCaptureBundle();
+        return new Pair<>(
+                createCameraRequest(
+                        captureBundle,
+                        takePictureRequest,
+                        takePictureCallback),
+                createProcessingRequest(
+                        captureBundle,
+                        takePictureRequest,
+                        takePictureCallback));
     }
 
     @MainThread
     void postProcess(@NonNull ProcessingRequest request) {
         checkMainThread();
-        throw new UnsupportedOperationException();
+        mPipelineIn.getRequestEdge().accept(request);
     }
 
     // ===== private methods =====
 
-    /**
-     * Gets the {@link DeferrableSurface} sent to camera.
-     *
-     * <p>This value is used to build {@link SessionConfig} and {@link CaptureConfig}.
-     */
-    @MainThread
     @NonNull
-    private DeferrableSurface getCameraSurface() {
-        checkMainThread();
-        throw new UnsupportedOperationException();
+    private CaptureBundle createCaptureBundle() {
+        return requireNonNull(mUseCaseConfig.getCaptureBundle(singleDefaultCaptureBundle()));
     }
+
+    @NonNull
+    private ProcessingRequest createProcessingRequest(
+            @NonNull CaptureBundle captureBundle,
+            @NonNull TakePictureRequest takePictureRequest,
+            @NonNull TakePictureCallback takePictureCallback) {
+        return new ProcessingRequest(
+                captureBundle,
+                takePictureRequest.getOutputFileOptions(),
+                takePictureRequest.getCropRect(),
+                takePictureRequest.getRotationDegrees(),
+                takePictureRequest.getJpegQuality(),
+                takePictureRequest.getSensorToBufferTransform(),
+                takePictureCallback);
+    }
+
+    private CameraRequest createCameraRequest(
+            @NonNull CaptureBundle captureBundle,
+            @NonNull TakePictureRequest takePictureRequest,
+            @NonNull TakePictureCallback takePictureCallback) {
+        List<CaptureConfig> captureConfigs = new ArrayList<>();
+        String tagBundleKey = String.valueOf(captureBundle.hashCode());
+        for (final CaptureStage captureStage : requireNonNull(captureBundle.getCaptureStages())) {
+            final CaptureConfig.Builder builder = new CaptureConfig.Builder();
+            builder.setTemplateType(mCaptureConfig.getTemplateType());
+
+            // Add the default implementation options of ImageCapture
+            builder.addImplementationOptions(mCaptureConfig.getImplementationOptions());
+            builder.addAllCameraCaptureCallbacks(
+                    takePictureRequest.getSessionConfigCameraCaptureCallbacks());
+            builder.addSurface(mPipelineIn.getSurface());
+
+            // Only sets the JPEG rotation and quality for JPEG format. Some devices do not
+            // handle these configs for non-JPEG images.See b/204375890.
+            if (mPipelineIn.getFormat() == ImageFormat.JPEG) {
+                // TODO(b/242536202): handle ExifRotationAvailability
+                builder.addImplementationOption(CaptureConfig.OPTION_JPEG_QUALITY,
+                        takePictureRequest.getJpegQuality());
+            }
+
+            // Add the implementation options required by the CaptureStage
+            builder.addImplementationOptions(
+                    captureStage.getCaptureConfig().getImplementationOptions());
+
+            // Use CaptureBundle object as the key for TagBundle
+            builder.addTag(tagBundleKey, captureStage.getId());
+            builder.addCameraCaptureCallback(mPipelineIn.getCameraCaptureCallback());
+            captureConfigs.add(builder.build());
+        }
+
+        return new CameraRequest(captureConfigs, takePictureCallback);
+    }
+
+    @NonNull
+    @VisibleForTesting
+    CaptureNode getCaptureNode() {
+        return mCaptureNode;
+    }
+
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/JpegBytes2CroppedBitmap.java b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/JpegBytes2CroppedBitmap.java
new file mode 100644
index 0000000..9bb1b2b
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/JpegBytes2CroppedBitmap.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.camera.core.imagecapture;
+
+import static androidx.camera.core.ImageCapture.ERROR_FILE_IO;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.BitmapRegionDecoder;
+import android.graphics.ImageFormat;
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.os.Build;
+import android.util.Size;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.ImageCaptureException;
+import androidx.camera.core.processing.Packet;
+import androidx.camera.core.processing.Processor;
+
+import java.io.IOException;
+
+/**
+ * Processes a JPEG image and produces a cropped {@link Bitmap} output.
+ */
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+final class JpegBytes2CroppedBitmap implements Processor<Packet<byte[]>, Packet<Bitmap>> {
+
+    @NonNull
+    @Override
+    public Packet<Bitmap> process(@NonNull Packet<byte[]> packet) throws ImageCaptureException {
+        Rect cropRect = packet.getCropRect();
+        Bitmap bitmap = createCroppedBitmap(packet.getData(), cropRect);
+        return Packet.of(
+                bitmap,
+                packet.getExif(),
+                packet.getCameraCaptureResult(),
+                ImageFormat.FLEX_RGBA_8888,
+                new Size(bitmap.getWidth(), bitmap.getHeight()),
+                new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()),
+                packet.getRotationDegrees(),
+                createSensorToBufferTransform(packet.getSensorToBufferTransform(), cropRect));
+    }
+
+    @NonNull
+    @SuppressWarnings("deprecation")
+    private Bitmap createCroppedBitmap(@NonNull byte[] jpegBytes, @NonNull Rect cropRect)
+            throws ImageCaptureException {
+        BitmapRegionDecoder decoder;
+        try {
+            decoder = BitmapRegionDecoder.newInstance(
+                    jpegBytes, 0, jpegBytes.length, false);
+        } catch (IOException e) {
+            throw new ImageCaptureException(ERROR_FILE_IO, "Failed to decode JPEG.", e);
+        }
+        return decoder.decodeRegion(cropRect, new BitmapFactory.Options());
+    }
+
+    @NonNull
+    private Matrix createSensorToBufferTransform(
+            @NonNull Matrix original,
+            @NonNull Rect cropRect) {
+        Matrix matrix = new Matrix(original);
+        matrix.postTranslate(-cropRect.left, -cropRect.top);
+        return matrix;
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ProcessingNode.java b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ProcessingNode.java
index 6add4768..3284841 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ProcessingNode.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ProcessingNode.java
@@ -76,6 +76,8 @@
         ProcessingRequest request = inputPacket.getProcessingRequest();
         ImageProxy image = inputPacket.getImageProxy();
         if (inputPacket.getProcessingRequest().isInMemoryCapture()) {
+            // TODO(b/240998057): update the transform info of the output image based on request
+            //  and/or Exif info.
             mainThreadExecutor().execute(() -> request.onFinalResult(image));
         } else {
             throw new UnsupportedOperationException();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureRequest.java b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureRequest.java
index 05e78d4..89c2c0e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureRequest.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureRequest.java
@@ -89,7 +89,7 @@
      * {@link ImageCapture#takePicture} is called.
      */
     @NonNull
-    abstract Matrix sensorToBufferTransform();
+    abstract Matrix getSensorToBufferTransform();
 
     /**
      * A snapshot of rotation degrees when {@link ImageCapture#takePicture} is called.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/Packet.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/Packet.java
new file mode 100644
index 0000000..1d84c6e
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/Packet.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.core.processing;
+
+import android.graphics.Bitmap;
+import android.graphics.ImageFormat;
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.os.Build;
+import android.util.Size;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.ImageProxy;
+import androidx.camera.core.impl.CameraCaptureResult;
+import androidx.camera.core.impl.ImageReaderProxy;
+import androidx.camera.core.impl.utils.Exif;
+
+import com.google.auto.value.AutoValue;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Represents a single image and its metadata such as Exif and transformation info.
+ *
+ * <p>The metadata of this class, e.g. {@link #getSize()} or {@link #getFormat()} must be
+ * consistent with the image data in {@link #getData()}. For example, if the {@link T} is
+ * {@link Bitmap}, then {@link #getSize()} must equal to {@link Bitmap#getWidth()}x
+ * {@link Bitmap#getHeight()}.
+ *
+ * <p>On the other hand, the metadata in {@link #getData()} should be ignored. For example, when
+ * {@link T} is {@link ImageProxy}. The value of {@link Packet#getCropRect()} should be used
+ * regardless of {@link ImageProxy#getCropRect()}. Similarly, if the {@link #getData()} is JPEG
+ * bytes, the caller should use {@link #getExif()} as the source-of-the-truth and ignore the Exif
+ * info encoded in the JPEG bytes. This enables us to modify the metadata efficiently without
+ * encoding it in the image.
+ *
+ * @param <T> image data type. Possible values are {@link ImageProxy}, {@link ByteBuffer},
+ *            {@link Bitmap} etc.
+ */
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+@AutoValue
+public abstract class Packet<T> {
+
+    /**
+     * The image data object.
+     *
+     * <p>Possible values are {@link ImageProxy}, {@link ByteBuffer}, {@link Bitmap} etc. The
+     * metadata in the data, e.g. {@link ImageProxy#getCropRect()}, should be ignored.
+     * Instead, the caller should use the metadata of the {@link Packet}. e.g.
+     * {@link #getCropRect()}.
+     */
+    @NonNull
+    public abstract T getData();
+
+    /**
+     * The Exif info extracted from JPEG bytes.
+     */
+    @Nullable
+    public abstract Exif getExif();
+
+    /**
+     * The {@link CameraCaptureResult} returned from {@link ImageReaderProxy}.
+     *
+     * <p>This value can be used to generate the Exif info in the image doesn't contain Exif info
+     * itself.
+     */
+    @NonNull
+    public abstract CameraCaptureResult getCameraCaptureResult();
+
+    /**
+     * Gets the format of the image.
+     *
+     * <p>This value must match the format of the image in {@link #getData()}.
+     */
+    public abstract int getFormat();
+
+    /**
+     * Gets the size of the image.
+     *
+     * <p>This value must match the dimension of the image in {@link #getData()}.
+     */
+    @NonNull
+    public abstract Size getSize();
+
+    /**
+     * Gets the crop rect.
+     *
+     * <p>This value is based on the coordinate system of the image in {@link #getData()}.
+     */
+    @NonNull
+    public abstract Rect getCropRect();
+
+    /**
+     * Gets rotation degrees
+     *
+     * <p>This value is based on the coordinate system of the image in {@link #getData()}.
+     */
+    public abstract int getRotationDegrees();
+
+    /**
+     * Gets sensor-to-buffer transformation.
+     *
+     * <p>This value represents the transformation from sensor coordinate system to the
+     * coordinate system of the image buffer in {@link #getData()}.
+     */
+    @NonNull
+    public abstract Matrix getSensorToBufferTransform();
+
+    /**
+     * Creates {@link Bitmap} {@link Packet}.
+     */
+    @NonNull
+    public static Packet<Bitmap> of(@NonNull Bitmap data, @Nullable Exif exif,
+            @NonNull CameraCaptureResult cameraCaptureResult, @NonNull Rect cropRect,
+            int rotationDegrees, @NonNull Matrix sensorToBufferTransform) {
+        return new AutoValue_Packet<>(data, exif, cameraCaptureResult,
+                ImageFormat.FLEX_RGBA_8888, new Size(data.getWidth(), data.getHeight()),
+                cropRect, rotationDegrees, sensorToBufferTransform);
+    }
+
+    /**
+     * Creates {@link Packet}.
+     */
+    @NonNull
+    public static <T> Packet<T> of(@NonNull T data, @Nullable Exif exif,
+            @NonNull CameraCaptureResult cameraCaptureResult,
+            int format, @NonNull Size size, @NonNull Rect cropRect,
+            int rotationDegrees, @NonNull Matrix sensorToBufferTransform) {
+        return new AutoValue_Packet<>(data, exif, cameraCaptureResult, format, size, cropRect,
+                rotationDegrees, sensorToBufferTransform);
+    }
+}
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeImagePipeline.kt b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeImagePipeline.kt
index a1888c7..8253d4d 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeImagePipeline.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeImagePipeline.kt
@@ -18,9 +18,9 @@
 
 import android.util.Size
 import androidx.annotation.MainThread
+import androidx.camera.core.imagecapture.Utils.createEmptyImageCaptureConfig
 import androidx.camera.core.impl.CaptureConfig
 import androidx.camera.core.impl.ImageCaptureConfig
-import androidx.camera.core.impl.OptionsBundle
 import androidx.core.util.Pair
 
 /**
@@ -34,7 +34,10 @@
         Pair<CameraRequest, ProcessingRequest>> = mutableMapOf()
     var captureConfigMap: MutableMap<TakePictureRequest, List<CaptureConfig>> = mutableMapOf()
 
-    constructor() : this(ImageCaptureConfig(OptionsBundle.emptyBundle()), Size(640, 480))
+    constructor() : this(
+        createEmptyImageCaptureConfig(),
+        Size(640, 480)
+    )
 
     @MainThread
     internal override fun createRequests(
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeTakePictureCallback.kt b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeTakePictureCallback.kt
index a710911..5ce1ea6 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeTakePictureCallback.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeTakePictureCallback.kt
@@ -27,6 +27,8 @@
 
     var onImageCapturedCalled = false
     var inMemoryResult: ImageProxy? = null
+    var captureFailure: ImageCaptureException? = null
+    var processFailure: ImageCaptureException? = null
 
     override fun onImageCaptured() {
         onImageCapturedCalled = true
@@ -40,8 +42,10 @@
     }
 
     override fun onCaptureFailure(imageCaptureException: ImageCaptureException) {
+        captureFailure = imageCaptureException
     }
 
     override fun onProcessFailure(imageCaptureException: ImageCaptureException) {
+        processFailure = imageCaptureException
     }
 }
\ No newline at end of file
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeTakePictureRequest.kt b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeTakePictureRequest.kt
index e67b8bd7..2c7e709 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeTakePictureRequest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeTakePictureRequest.kt
@@ -81,19 +81,19 @@
         return fileOptions
     }
 
-    override fun getCropRect(): Rect {
+    internal override fun getCropRect(): Rect {
         return Rect(0, 0, 640, 480)
     }
 
-    override fun sensorToBufferTransform(): Matrix {
+    internal override fun getSensorToBufferTransform(): Matrix {
         return Matrix()
     }
 
-    override fun getRotationDegrees(): Int {
+    internal override fun getRotationDegrees(): Int {
         return 0
     }
 
-    override fun getJpegQuality(): Int {
+    internal override fun getJpegQuality(): Int {
         return 100
     }
 
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/ImagePipelineTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/ImagePipelineTest.kt
new file mode 100644
index 0000000..4222fb2
--- /dev/null
+++ b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/ImagePipelineTest.kt
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.core.imagecapture
+
+import android.graphics.ImageFormat
+import android.hardware.camera2.CameraDevice
+import android.os.Build
+import android.os.Looper.getMainLooper
+import android.util.Size
+import androidx.camera.core.ImageCapture
+import androidx.camera.core.ImageCaptureException
+import androidx.camera.core.impl.CaptureConfig.OPTION_ROTATION
+import androidx.camera.core.impl.ImageInputConfig
+import androidx.camera.core.impl.MutableOptionsBundle
+import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
+import androidx.camera.core.internal.IoConfig.OPTION_IO_EXECUTOR
+import androidx.camera.testing.fakes.FakeImageInfo
+import androidx.camera.testing.fakes.FakeImageProxy
+import com.google.common.truth.Truth.assertThat
+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
+
+/**
+ * Unit tests for [ImagePipeline].
+ */
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class ImagePipelineTest {
+
+    companion object {
+        private val SIZE = Size(640, 480)
+        private const val TEMPLATE_TYPE = CameraDevice.TEMPLATE_STILL_CAPTURE
+        private const val ROTATION = 99
+        private val IN_MEMORY_REQUEST =
+            FakeTakePictureRequest(FakeTakePictureRequest.Type.IN_MEMORY)
+        private val CALLBACK = FakeTakePictureCallback()
+        private val FAILURE = ImageCaptureException(ImageCapture.ERROR_UNKNOWN, "", null)
+    }
+
+    private lateinit var imagePipeline: ImagePipeline
+
+    @Before
+    fun setUp() {
+        // Create ImageCaptureConfig.
+        val builder = ImageCapture.Builder().setCaptureOptionUnpacker { _, builder ->
+            builder.templateType = TEMPLATE_TYPE
+            builder.implementationOptions = MutableOptionsBundle.create().apply {
+                this.insertOption(OPTION_ROTATION, ROTATION)
+            }
+        }
+        builder.mutableConfig.insertOption(OPTION_IO_EXECUTOR, mainThreadExecutor())
+        builder.mutableConfig.insertOption(ImageInputConfig.OPTION_INPUT_FORMAT, ImageFormat.JPEG)
+        imagePipeline = ImagePipeline(builder.useCaseConfig, SIZE)
+    }
+
+    @After
+    fun tearDown() {
+        imagePipeline.close()
+    }
+
+    @Test
+    fun createRequests_verifyCameraRequest() {
+        // Assert.
+        val captureInput = imagePipeline.captureNode.inputEdge
+
+        // Act: create requests
+        val result = imagePipeline.createRequests(IN_MEMORY_REQUEST, CALLBACK)
+        // Assert: CameraRequest is constructed correctly.
+        val cameraRequest = result.first!!
+        val captureConfig = cameraRequest.captureConfigs.single()
+        assertThat(captureConfig.cameraCaptureCallbacks)
+            .containsExactly(captureInput.cameraCaptureCallback)
+        assertThat(captureConfig.surfaces).containsExactly(captureInput.surface)
+        assertThat(captureConfig.templateType).isEqualTo(TEMPLATE_TYPE)
+        assertThat(captureConfig.implementationOptions.retrieveOption(OPTION_ROTATION))
+            .isEqualTo(ROTATION)
+
+        // Act: fail the camera request.
+        cameraRequest.onCaptureFailure(FAILURE)
+        // Assert: The failure is propagated.
+        assertThat(CALLBACK.captureFailure).isEqualTo(FAILURE)
+    }
+
+    @Test
+    fun createRequests_verifyProcessingRequest() {
+        // Act: create requests
+        val result = imagePipeline.createRequests(IN_MEMORY_REQUEST, CALLBACK)
+        // Assert: ProcessingRequest is constructed correctly.
+        val processingRequest = result.second!!
+        assertThat(processingRequest.jpegQuality).isEqualTo(IN_MEMORY_REQUEST.jpegQuality)
+        assertThat(processingRequest.rotationDegrees).isEqualTo(IN_MEMORY_REQUEST.rotationDegrees)
+        assertThat(processingRequest.sensorToBufferTransform)
+            .isEqualTo(IN_MEMORY_REQUEST.sensorToBufferTransform)
+        assertThat(processingRequest.cropRect).isEqualTo(IN_MEMORY_REQUEST.cropRect)
+
+        // Act: fail the camera request.
+        processingRequest.onProcessFailure(FAILURE)
+        // Assert: The failure is propagated.
+        assertThat(CALLBACK.processFailure).isEqualTo(FAILURE)
+    }
+
+    @Test
+    fun createRequests_captureTagMatches() {
+        // Act: create requests
+        val result = imagePipeline.createRequests(IN_MEMORY_REQUEST, CALLBACK)
+
+        // Assert: ProcessingRequest's tag matches camera request.
+        val cameraRequest = result.first!!
+        val processingRequest = result.second!!
+        val captureConfig = cameraRequest.captureConfigs.single()
+        assertThat(captureConfig.tagBundle.getTag(processingRequest.tagBundleKey))
+            .isEqualTo(processingRequest.stageIds.single())
+    }
+
+    @Test
+    fun sendInMemoryRequest_receivesImageProxy() {
+        // Arrange.
+        val processingRequest = imagePipeline.createRequests(
+            IN_MEMORY_REQUEST, CALLBACK
+        ).second!!
+        val image = FakeImageProxy(FakeImageInfo().apply {
+            this.setTag(processingRequest.tagBundleKey, processingRequest.stageIds.single())
+        })
+
+        // Act: send processing request and the image.
+        imagePipeline.postProcess(processingRequest)
+        imagePipeline.captureNode.onImageProxyAvailable(image)
+        shadowOf(getMainLooper()).idle()
+
+        // Assert: the image is received by TakePictureCallback.
+        assertThat(CALLBACK.inMemoryResult!!.planes).isEqualTo(image.planes)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/JpegBytes2CroppedBitmapTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/JpegBytes2CroppedBitmapTest.kt
new file mode 100644
index 0000000..2088e54
--- /dev/null
+++ b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/JpegBytes2CroppedBitmapTest.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.core.imagecapture
+
+import android.graphics.Color.BLUE
+import android.graphics.Color.YELLOW
+import android.graphics.ImageFormat
+import android.graphics.Matrix
+import android.graphics.Rect
+import android.os.Build
+import android.util.Size
+import androidx.camera.core.processing.Packet
+import androidx.camera.testing.ExifUtil.createExif
+import androidx.camera.testing.TestImageUtil.createJpegBytes
+import androidx.camera.testing.TestImageUtil.getAverageDiff
+import androidx.camera.testing.fakes.FakeCameraCaptureResult
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+/**
+ * Unit tests for [JpegBytes2CroppedBitmap].
+ */
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class JpegBytes2CroppedBitmapTest {
+
+    companion object {
+        private const val WIDTH = 640
+        private const val HEIGHT = 480
+    }
+
+    private val processor = JpegBytes2CroppedBitmap()
+
+    @Test
+    fun process_verifyOutput() {
+        // Arrange.
+        val jpegBytes = createJpegBytes(WIDTH, HEIGHT)
+        val cropRect = Rect(0, 240, 640, 480)
+        // A mirroring on the x-axis.
+        val transform = Matrix().apply { this.setScale(-1F, 1F, 320F, 240F) }
+        val input = Packet.of(
+            jpegBytes,
+            createExif(jpegBytes),
+            FakeCameraCaptureResult(),
+            ImageFormat.JPEG,
+            Size(WIDTH, HEIGHT),
+            cropRect,
+            90,
+            transform
+        )
+
+        // Act.
+        val output = processor.process(input)
+
+        // Assert: only the yellow and blue blocks exist after the cropping.
+        assertThat(getAverageDiff(output.data, Rect(0, 0, 320, 240), YELLOW)).isEqualTo(0)
+        assertThat(getAverageDiff(output.data, Rect(321, 0, WIDTH, 240), BLUE)).isEqualTo(0)
+        // Assert: the packet info is correct.
+        assertThat(output.cropRect).isEqualTo(Rect(0, 0, cropRect.width(), cropRect.height()))
+        assertThat(output.exif).isEqualTo(input.exif)
+        assertThat(output.format).isEqualTo(ImageFormat.FLEX_RGBA_8888)
+        assertThat(output.size).isEqualTo(Size(cropRect.width(), cropRect.height()))
+        assertThat(output.rotationDegrees).isEqualTo(input.rotationDegrees)
+        // Assert: after mirroring and cropping, the bottom-right corner should map to the
+        // bottom-left corner in the new image.
+        val points = floatArrayOf(WIDTH.toFloat(), HEIGHT.toFloat())
+        output.sensorToBufferTransform.mapPoints(points)
+        assertThat(points).usingTolerance(1E-4).containsExactly(0, 240)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/TakePictureManagerTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/TakePictureManagerTest.kt
index 15ce0a4..0129158 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/TakePictureManagerTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/TakePictureManagerTest.kt
@@ -26,6 +26,7 @@
 import androidx.camera.testing.fakes.FakeImageInfo
 import androidx.camera.testing.fakes.FakeImageProxy
 import com.google.common.truth.Truth.assertThat
+import org.junit.After
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.RobolectricTestRunner
@@ -45,6 +46,11 @@
     private val imageCaptureControl = FakeImageCaptureControl()
     private val takePictureManager = TakePictureManager(imageCaptureControl, imagePipeline)
 
+    @After
+    fun tearDown() {
+        imagePipeline.close()
+    }
+
     @Test(expected = IllegalStateException::class)
     fun callOnFailureTwice_throwsException() {
         // Arrange.
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/Utils.kt b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/Utils.kt
index abb8dd7..7f3d9b0 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/Utils.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/Utils.kt
@@ -16,8 +16,12 @@
 
 package androidx.camera.core.imagecapture
 
+import android.graphics.ImageFormat
+import androidx.camera.core.ImageCapture
 import androidx.camera.core.ImageProxy
 import androidx.camera.core.impl.CaptureBundle
+import androidx.camera.core.impl.ImageCaptureConfig
+import androidx.camera.core.impl.ImageInputConfig
 import androidx.camera.testing.fakes.FakeCaptureStage
 import androidx.camera.testing.fakes.FakeImageInfo
 import androidx.camera.testing.fakes.FakeImageProxy
@@ -27,6 +31,15 @@
  */
 object Utils {
 
+    /**
+     * Creates an empty [ImageCaptureConfig] so [ImagePipeline] constructor won't crash.
+     */
+    fun createEmptyImageCaptureConfig(): ImageCaptureConfig {
+        val builder = ImageCapture.Builder().setCaptureOptionUnpacker { _, _ -> }
+        builder.mutableConfig.insertOption(ImageInputConfig.OPTION_INPUT_FORMAT, ImageFormat.JPEG)
+        return builder.useCaseConfig
+    }
+
     fun createCaptureBundle(stageIds: IntArray): CaptureBundle {
         return CaptureBundle {
             stageIds.map { stageId ->
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/processing/PacketTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/processing/PacketTest.kt
new file mode 100644
index 0000000..284357e
--- /dev/null
+++ b/camera/camera-core/src/test/java/androidx/camera/core/processing/PacketTest.kt
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.core.processing
+
+import android.graphics.Bitmap
+import android.graphics.ImageFormat
+import android.graphics.Matrix
+import android.graphics.Rect
+import android.os.Build
+import android.util.Size
+import androidx.camera.testing.fakes.FakeCameraCaptureResult
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+/**
+ * Unit test for [Packet].
+ */
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class PacketTest {
+
+    @Test
+    fun createBitmapPacket_verifySizeAndFormat() {
+        // Arrange.
+        val width = 100
+        val height = 200
+        val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
+
+        // Act.
+        val bitmapPacket =
+            Packet.of(bitmap, null, FakeCameraCaptureResult(), Rect(0, 0, 100, 200), 0, Matrix())
+
+        // Assert.
+        assertThat(bitmapPacket.size).isEqualTo(Size(100, 200))
+        assertThat(bitmapPacket.format).isEqualTo(ImageFormat.FLEX_RGBA_8888)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/ImageCaptureConfigProviderTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/ImageCaptureConfigProviderTest.kt
index dc7e11a..7085869 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/ImageCaptureConfigProviderTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/ImageCaptureConfigProviderTest.kt
@@ -128,12 +128,12 @@
             verify(mockVendorExtender, timeout(3000)).supportedCaptureOutputResolutions
 
             val inOrder = Mockito.inOrder(mockImageCaptureExtenderImpl)
+            inOrder.verify(mockImageCaptureExtenderImpl, timeout(3000).atLeastOnce()).captureStages
             inOrder.verify(mockImageCaptureExtenderImpl, timeout(3000)).onInit(
                 any(String::class.java),
                 any(CameraCharacteristics::class.java),
                 any(Context::class.java)
             )
-            inOrder.verify(mockImageCaptureExtenderImpl, timeout(3000).atLeastOnce()).captureStages
             inOrder.verify(mockImageCaptureExtenderImpl, timeout(3000).atLeastOnce())
                 .onPresetSession()
             inOrder.verify(mockImageCaptureExtenderImpl, timeout(3000).atLeastOnce())
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingCaptureProcessor.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingCaptureProcessor.java
index 88c4207..4d258ba 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingCaptureProcessor.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingCaptureProcessor.java
@@ -16,6 +16,8 @@
 
 package androidx.camera.extensions.internal;
 
+import android.content.Context;
+import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CaptureResult;
 import android.hardware.camera2.TotalCaptureResult;
 import android.media.Image;
@@ -24,6 +26,7 @@
 import android.view.Surface;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.camera.camera2.impl.Camera2CameraCaptureResultConverter;
 import androidx.camera.core.ExperimentalGetImage;
@@ -34,6 +37,7 @@
 import androidx.camera.core.impl.CaptureProcessor;
 import androidx.camera.core.impl.ImageProxyBundle;
 import androidx.camera.extensions.impl.CaptureProcessorImpl;
+import androidx.camera.extensions.impl.ExtenderStateListener;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -48,17 +52,59 @@
  * A {@link CaptureProcessor} that calls a vendor provided implementation.
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public final class AdaptingCaptureProcessor implements CaptureProcessor {
+public final class AdaptingCaptureProcessor implements CaptureProcessor, VendorProcessor {
+    @NonNull
     private final CaptureProcessorImpl mImpl;
+    @Nullable
+    private volatile Surface mSurface;
+    private volatile int mImageFormat;
+    private volatile Size mResolution;
+
+    private BlockingCloseAccessCounter mAccessCounter = new BlockingCloseAccessCounter();
 
     public AdaptingCaptureProcessor(@NonNull CaptureProcessorImpl impl) {
         mImpl = impl;
     }
 
+    /**
+     * Invoked after
+     * {@link ExtenderStateListener#onInit(String, CameraCharacteristics, Context)}()} to
+     * initialize the processor.
+     */
+    @Override
+    public void onInit() {
+        if (!mAccessCounter.tryIncrement()) {
+            return;
+        }
+
+        // Delay the onOutputSurface / onImageFormatUpdate/ onResolutionUpdate calls because on
+        // some OEM devices, these CaptureProcessImpl configuration should be performed only after
+        // onInit. Otherwise it will cause black preview issue.
+        try {
+            mImpl.onOutputSurface(mSurface, mImageFormat);
+            mImpl.onImageFormatUpdate(mImageFormat);
+            mImpl.onResolutionUpdate(mResolution);
+        } finally {
+            mAccessCounter.decrement();
+        }
+    }
+
+    @Override
+    public void close() {
+        mAccessCounter.destroyAndWaitForZeroAccess();
+        mSurface = null;
+        mResolution = null;
+    }
+
     @Override
     public void onOutputSurface(@NonNull Surface surface, int imageFormat) {
-        mImpl.onOutputSurface(surface, imageFormat);
-        mImpl.onImageFormatUpdate(imageFormat);
+        mSurface = surface;
+        mImageFormat = imageFormat;
+    }
+
+    @Override
+    public void onResolutionUpdate(@NonNull Size size) {
+        mResolution = size;
     }
 
     @Override
@@ -104,11 +150,14 @@
             }
         }
 
-        mImpl.process(bundleMap);
-    }
+        if (!mAccessCounter.tryIncrement()) {
+            return;
+        }
 
-    @Override
-    public void onResolutionUpdate(@NonNull Size size) {
-        mImpl.onResolutionUpdate(size);
+        try {
+            mImpl.process(bundleMap);
+        } finally {
+            mAccessCounter.decrement();
+        }
     }
 }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingPreviewProcessor.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingPreviewProcessor.java
index 2b2a6b3..49dfa87 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingPreviewProcessor.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingPreviewProcessor.java
@@ -16,7 +16,9 @@
 
 package androidx.camera.extensions.internal;
 
+import android.content.Context;
 import android.graphics.ImageFormat;
+import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CaptureResult;
 import android.hardware.camera2.TotalCaptureResult;
 import android.media.Image;
@@ -34,6 +36,7 @@
 import androidx.camera.core.impl.CameraCaptureResults;
 import androidx.camera.core.impl.CaptureProcessor;
 import androidx.camera.core.impl.ImageProxyBundle;
+import androidx.camera.extensions.impl.ExtenderStateListener;
 import androidx.camera.extensions.impl.PreviewImageProcessorImpl;
 import androidx.core.util.Preconditions;
 
@@ -46,9 +49,37 @@
  * A {@link CaptureProcessor} that calls a vendor provided preview processing implementation.
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public final class AdaptingPreviewProcessor implements CaptureProcessor, CloseableProcessor {
+public final class AdaptingPreviewProcessor implements CaptureProcessor, VendorProcessor {
     private static final String TAG = "AdaptingPreviewProcesso";
     private final PreviewImageProcessorImpl mImpl;
+    private volatile Surface mSurface;
+    private volatile int mImageFormat;
+    private volatile Size mResolution;
+
+    /**
+     * Invoked after
+     * {@link ExtenderStateListener#onInit(String, CameraCharacteristics, Context)}()} to
+     * initialize the processor.
+     */
+    @Override
+    public void onInit() {
+        // Delay the onOutputSurface / onImageFormatUpdate/ onResolutionUpdate calls because on
+        // some OEM devices, these CaptureProcessImpl configuration should be performed only after
+        // onInit. Otherwise it will cause black preview issue.
+        if (!mAccessCounter.tryIncrement()) {
+            return;
+        }
+
+        try {
+            mImpl.onResolutionUpdate(mResolution);
+            mImpl.onOutputSurface(mSurface, mImageFormat);
+            // No input formats other than YUV_420_888 are allowed.
+            mImpl.onImageFormatUpdate(ImageFormat.YUV_420_888);
+        } finally {
+            mAccessCounter.decrement();
+        }
+    }
+
     private BlockingCloseAccessCounter mAccessCounter = new BlockingCloseAccessCounter();
 
     public AdaptingPreviewProcessor(@NonNull PreviewImageProcessorImpl impl) {
@@ -62,9 +93,8 @@
         }
 
         try {
-            mImpl.onOutputSurface(surface, imageFormat);
-            // No input formats other than YUV_420_888 are allowed.
-            mImpl.onImageFormatUpdate(ImageFormat.YUV_420_888);
+            mSurface = surface;
+            mImageFormat = imageFormat;
         } finally {
             mAccessCounter.decrement();
         }
@@ -125,7 +155,7 @@
         }
 
         try {
-            mImpl.onResolutionUpdate(size);
+            mResolution = size;
         } finally {
             mAccessCounter.decrement();
         }
@@ -134,5 +164,7 @@
     @Override
     public void close() {
         mAccessCounter.destroyAndWaitForZeroAccess();
+        mSurface = null;
+        mResolution = null;
     }
 }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingRequestUpdateProcessor.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingRequestUpdateProcessor.java
index c8ff32f..f10a4aa 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingRequestUpdateProcessor.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingRequestUpdateProcessor.java
@@ -37,8 +37,7 @@
  * A {@link ImageInfoProcessor} that calls a vendor provided preview processing implementation.
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public final class AdaptingRequestUpdateProcessor implements ImageInfoProcessor,
-        CloseableProcessor {
+public final class AdaptingRequestUpdateProcessor implements ImageInfoProcessor, VendorProcessor {
     private final PreviewExtenderImpl mPreviewExtenderImpl;
     private final RequestUpdateProcessorImpl mProcessorImpl;
     private BlockingCloseAccessCounter mAccessCounter = new BlockingCloseAccessCounter();
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ImageCaptureConfigProvider.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ImageCaptureConfigProvider.java
index c752065..63ae0f4 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ImageCaptureConfigProvider.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ImageCaptureConfigProvider.java
@@ -22,7 +22,6 @@
 import android.util.Pair;
 import android.util.Size;
 
-import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.OptIn;
@@ -46,10 +45,10 @@
 import androidx.camera.extensions.impl.CaptureProcessorImpl;
 import androidx.camera.extensions.impl.CaptureStageImpl;
 import androidx.camera.extensions.impl.ImageCaptureExtenderImpl;
+import androidx.core.util.Preconditions;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * Provides extensions related configs for image capture
@@ -99,8 +98,10 @@
             if (imageCaptureExtenderImpl != null) {
                 CaptureProcessorImpl captureProcessor =
                         imageCaptureExtenderImpl.getCaptureProcessor();
+                AdaptingCaptureProcessor adaptingCaptureProcessor = null;
                 if (captureProcessor != null) {
-                    builder.setCaptureProcessor(new AdaptingCaptureProcessor(captureProcessor));
+                    adaptingCaptureProcessor = new AdaptingCaptureProcessor(captureProcessor);
+                    builder.setCaptureProcessor(adaptingCaptureProcessor);
                 }
 
                 if (imageCaptureExtenderImpl.getMaxCaptureStage() > 0) {
@@ -110,7 +111,7 @@
 
                 ImageCaptureEventAdapter imageCaptureEventAdapter =
                         new ImageCaptureEventAdapter(imageCaptureExtenderImpl,
-                                context);
+                                context, adaptingCaptureProcessor);
                 new Camera2ImplConfig.Extender<>(builder).setCameraEventCallback(
                         new CameraEventCallbacks(imageCaptureEventAdapter));
                 builder.setUseCaseEventCallback(imageCaptureEventAdapter);
@@ -139,123 +140,107 @@
         private final ImageCaptureExtenderImpl mImpl;
         @NonNull
         private final Context mContext;
-        private final AtomicBoolean mActive = new AtomicBoolean(true);
-        private final Object mLock = new Object();
-        @GuardedBy("mLock")
-        private volatile int mEnabledSessionCount = 0;
-        @GuardedBy("mLock")
-        private volatile boolean mUnbind = false;
+        @Nullable
+        private VendorProcessor mVendorCaptureProcessor;
+        @Nullable
+        private volatile CameraInfo mCameraInfo;
+
 
         ImageCaptureEventAdapter(@NonNull ImageCaptureExtenderImpl impl,
-                @NonNull Context context) {
+                @NonNull Context context,
+                @Nullable VendorProcessor vendorCaptureProcessor) {
             mImpl = impl;
             mContext = context;
+            mVendorCaptureProcessor = vendorCaptureProcessor;
         }
 
-        @OptIn(markerClass = ExperimentalCamera2Interop.class)
+
+        // Invoked from main thread
         @Override
         public void onAttach(@NonNull CameraInfo cameraInfo) {
-            if (mActive.get()) {
-                String cameraId = Camera2CameraInfo.from(cameraInfo).getCameraId();
-                CameraCharacteristics cameraCharacteristics =
-                        Camera2CameraInfo.extractCameraCharacteristics(cameraInfo);
-                mImpl.onInit(cameraId, cameraCharacteristics, mContext);
-            }
+            mCameraInfo = cameraInfo;
         }
 
+        // Invoked from main thread
         @Override
         public void onDetach() {
-            synchronized (mLock) {
-                mUnbind = true;
-                if (mEnabledSessionCount == 0) {
-                    callDeInit();
-                }
-            }
         }
 
-        private void callDeInit() {
-            if (mActive.get()) {
-                mImpl.onDeInit();
-                mActive.set(false);
-            }
-        }
-
+        // Invoked from camera thread
         @Override
         @Nullable
-        public CaptureConfig onPresetSession() {
-            if (mActive.get()) {
-                CaptureStageImpl captureStageImpl = mImpl.onPresetSession();
-                if (captureStageImpl != null) {
-                    if (Build.VERSION.SDK_INT >= 28) {
-                        return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
-                    } else {
-                        Logger.w(TAG, "The CaptureRequest parameters returned from "
-                                + "onPresetSession() will be passed to the camera device as part "
-                                + "of the capture session via "
-                                + "SessionConfiguration#setSessionParameters(CaptureRequest) "
-                                + "which only supported from API level 28!");
-                    }
+        @OptIn(markerClass = ExperimentalCamera2Interop.class)
+        public CaptureConfig onInitSession() {
+            Preconditions.checkNotNull(mCameraInfo,
+                    "ImageCaptureConfigProvider was not attached.");
+            String cameraId = Camera2CameraInfo.from(mCameraInfo).getCameraId();
+            CameraCharacteristics cameraCharacteristics =
+                    Camera2CameraInfo.extractCameraCharacteristics(mCameraInfo);
+            mImpl.onInit(cameraId, cameraCharacteristics, mContext);
+
+            if (mVendorCaptureProcessor != null) {
+                mVendorCaptureProcessor.onInit();
+            }
+
+            CaptureStageImpl captureStageImpl = mImpl.onPresetSession();
+            if (captureStageImpl != null) {
+                if (Build.VERSION.SDK_INT >= 28) {
+                    return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
+                } else {
+                    Logger.w(TAG, "The CaptureRequest parameters returned from "
+                            + "onPresetSession() will be passed to the camera device as part "
+                            + "of the capture session via "
+                            + "SessionConfiguration#setSessionParameters(CaptureRequest) "
+                            + "which only supported from API level 28!");
                 }
             }
             return null;
         }
 
+        // Invoked from camera thread
         @Override
         @Nullable
         public CaptureConfig onEnableSession() {
-            try {
-                if (mActive.get()) {
-                    CaptureStageImpl captureStageImpl = mImpl.onEnableSession();
-                    if (captureStageImpl != null) {
-                        return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
-                    }
-                }
-
-                return null;
-            } finally {
-                synchronized (mLock) {
-                    mEnabledSessionCount++;
-                }
-            }
-        }
-
-        @Override
-        @Nullable
-        public CaptureConfig onDisableSession() {
-            try {
-                if (mActive.get()) {
-                    CaptureStageImpl captureStageImpl = mImpl.onDisableSession();
-                    if (captureStageImpl != null) {
-                        return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
-                    }
-                }
-
-                return null;
-            } finally {
-                synchronized (mLock) {
-                    mEnabledSessionCount--;
-                    if (mEnabledSessionCount == 0 && mUnbind) {
-                        callDeInit();
-                    }
-                }
-            }
-        }
-
-        @Override
-        @Nullable
-        public List<CaptureStage> getCaptureStages() {
-            if (mActive.get()) {
-                List<CaptureStageImpl> captureStages = mImpl.getCaptureStages();
-                if (captureStages != null && !captureStages.isEmpty()) {
-                    ArrayList<CaptureStage> ret = new ArrayList<>();
-                    for (CaptureStageImpl s : captureStages) {
-                        ret.add(new AdaptingCaptureStage(s));
-                    }
-                    return ret;
-                }
+            CaptureStageImpl captureStageImpl = mImpl.onEnableSession();
+            if (captureStageImpl != null) {
+                return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
             }
 
             return null;
         }
+
+        // Invoked from camera thread
+        @Override
+        @Nullable
+        public CaptureConfig onDisableSession() {
+            CaptureStageImpl captureStageImpl = mImpl.onDisableSession();
+            if (captureStageImpl != null) {
+                return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
+            }
+
+            return null;
+        }
+
+        // Invoked from main thread
+        @Override
+        @Nullable
+        public List<CaptureStage> getCaptureStages() {
+            List<CaptureStageImpl> captureStages = mImpl.getCaptureStages();
+            if (captureStages != null && !captureStages.isEmpty()) {
+                ArrayList<CaptureStage> ret = new ArrayList<>();
+                for (CaptureStageImpl s : captureStages) {
+                    ret.add(new AdaptingCaptureStage(s));
+                }
+                return ret;
+            }
+
+            return null;
+        }
+
+        // Invoked from camera thread
+        @Override
+        public void onDeInitSession() {
+            mImpl.onDeInit();
+        }
     }
 }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/PreviewConfigProvider.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/PreviewConfigProvider.java
index 35570a0..5e75930 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/PreviewConfigProvider.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/PreviewConfigProvider.java
@@ -44,6 +44,7 @@
 import androidx.camera.extensions.impl.CaptureStageImpl;
 import androidx.camera.extensions.impl.PreviewExtenderImpl;
 import androidx.camera.extensions.impl.PreviewImageProcessorImpl;
+import androidx.core.util.Preconditions;
 
 import java.util.List;
 
@@ -141,64 +142,54 @@
         final PreviewExtenderImpl mImpl;
         @NonNull
         private final Context mContext;
-
-        final CloseableProcessor mCloseableProcessor;
+        @Nullable
+        final VendorProcessor mPreviewProcessor;
+        @Nullable
+        CameraInfo mCameraInfo;
 
         // Once the adapter has set mActive to false a new instance needs to be created
         @GuardedBy("mLock")
-        volatile boolean mActive = true;
         final Object mLock = new Object();
-        @GuardedBy("mLock")
-        private volatile int mEnabledSessionCount = 0;
-        @GuardedBy("mLock")
-        private volatile boolean mUnbind = false;
 
         PreviewEventAdapter(@NonNull PreviewExtenderImpl impl,
-                @NonNull Context context, @Nullable CloseableProcessor closeableProcessor) {
+                @NonNull Context context, @Nullable VendorProcessor previewProcessor) {
             mImpl = impl;
             mContext = context;
-            mCloseableProcessor = closeableProcessor;
+            mPreviewProcessor = previewProcessor;
         }
 
-        @OptIn(markerClass = ExperimentalCamera2Interop.class)
+        // Invoked from main thread
         @Override
         public void onAttach(@NonNull CameraInfo cameraInfo) {
             synchronized (mLock) {
-                if (mActive) {
-                    String cameraId = Camera2CameraInfo.from(cameraInfo).getCameraId();
-                    CameraCharacteristics cameraCharacteristics =
-                            Camera2CameraInfo.extractCameraCharacteristics(cameraInfo);
-                    mImpl.onInit(cameraId, cameraCharacteristics, mContext);
-                }
+                mCameraInfo = cameraInfo;
             }
         }
 
+        // Invoked from main thread
         @Override
         public void onDetach() {
             synchronized (mLock) {
-                mUnbind = true;
-                if (mEnabledSessionCount == 0) {
-                    callDeInit();
+                if (mPreviewProcessor != null) {
+                    mPreviewProcessor.close();
                 }
             }
         }
 
-        private void callDeInit() {
-            synchronized (mLock) {
-                if (mActive) {
-                    if (mCloseableProcessor != null) {
-                        mCloseableProcessor.close();
-                    }
-                    mImpl.onDeInit();
-                    mActive = false;
-                }
-            }
-        }
-
+        // Invoked from camera thread
         @Override
         @Nullable
-        public CaptureConfig onPresetSession() {
+        @OptIn(markerClass = ExperimentalCamera2Interop.class)
+        public CaptureConfig onInitSession() {
             synchronized (mLock) {
+                Preconditions.checkNotNull(mCameraInfo,
+                        "PreviewConfigProvider was not attached.");
+
+                String cameraId = Camera2CameraInfo.from(mCameraInfo).getCameraId();
+                CameraCharacteristics cameraCharacteristics =
+                        Camera2CameraInfo.extractCameraCharacteristics(mCameraInfo);
+                mImpl.onInit(cameraId, cameraCharacteristics, mContext);
+                mPreviewProcessor.onInit();
                 CaptureStageImpl captureStageImpl = mImpl.onPresetSession();
                 if (captureStageImpl != null) {
                     if (Build.VERSION.SDK_INT >= 28) {
@@ -216,64 +207,54 @@
             return null;
         }
 
+        // Invoked from camera thread
         @Override
         @Nullable
         public CaptureConfig onEnableSession() {
-            try {
-                synchronized (mLock) {
-                    if (mActive) {
-                        CaptureStageImpl captureStageImpl = mImpl.onEnableSession();
-                        if (captureStageImpl != null) {
-                            return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
-                        }
-                    }
-                }
-
-                return null;
-            } finally {
-                synchronized (mLock) {
-                    mEnabledSessionCount++;
-                }
-            }
-        }
-
-        @Override
-        @Nullable
-        public CaptureConfig onDisableSession() {
-            try {
-                synchronized (mLock) {
-                    if (mActive) {
-                        CaptureStageImpl captureStageImpl = mImpl.onDisableSession();
-                        if (captureStageImpl != null) {
-                            return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
-                        }
-                    }
-                }
-
-                return null;
-            } finally {
-                synchronized (mLock) {
-                    mEnabledSessionCount--;
-                    if (mEnabledSessionCount == 0 && mUnbind) {
-                        callDeInit();
-                    }
-                }
-            }
-        }
-
-        @Override
-        @Nullable
-        public CaptureConfig onRepeating() {
             synchronized (mLock) {
-                if (mActive) {
-                    CaptureStageImpl captureStageImpl = mImpl.getCaptureStage();
-                    if (captureStageImpl != null) {
-                        return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
-                    }
+                CaptureStageImpl captureStageImpl = mImpl.onEnableSession();
+                if (captureStageImpl != null) {
+                    return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
                 }
             }
 
             return null;
         }
+
+        // Invoked from camera thread
+        @Override
+        @Nullable
+        public CaptureConfig onDisableSession() {
+            synchronized (mLock) {
+                CaptureStageImpl captureStageImpl = mImpl.onDisableSession();
+                if (captureStageImpl != null) {
+                    return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
+                }
+            }
+
+            return null;
+        }
+
+        // Invoked from camera thread
+        @Override
+        @Nullable
+        public CaptureConfig onRepeating() {
+            synchronized (mLock) {
+                CaptureStageImpl captureStageImpl = mImpl.getCaptureStage();
+                if (captureStageImpl != null) {
+                    return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
+                }
+            }
+
+            return null;
+        }
+
+        // Invoked from camera thread
+        @Override
+        public void onDeInitSession() {
+            synchronized (mLock) {
+                mImpl.onDeInit();
+            }
+        }
     }
 }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/CloseableProcessor.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/VendorProcessor.java
similarity index 67%
rename from camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/CloseableProcessor.java
rename to camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/VendorProcessor.java
index 495a6b8d..5e2feae 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/CloseableProcessor.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/VendorProcessor.java
@@ -19,11 +19,18 @@
 import androidx.annotation.RequiresApi;
 
 /**
- * A processor that can be closed so that the underlying processing implementation is skipped,
- * if it has been closed.
+ * A processor that is used for invoking vendor extensions. {@link #onInit()} will be invoked
+ * after
+ * {@link androidx.camera.extensions.impl.ExtenderStateListener#onInit}. {@link #close()} is
+ * invoked to close the processor.
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public interface CloseableProcessor {
+public interface VendorProcessor {
+    /**
+     * Initialize the processor after
+     * {@link androidx.camera.extensions.impl.ExtenderStateListener#onInit}.
+     */
+    default void onInit() {}
 
     /**
      * Close the processor.
diff --git a/camera/camera-testing/build.gradle b/camera/camera-testing/build.gradle
index ec93470..0f1d9ca 100644
--- a/camera/camera-testing/build.gradle
+++ b/camera/camera-testing/build.gradle
@@ -75,13 +75,6 @@
     namespace "androidx.camera.testing"
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 androidx {
     name = "Jetpack Camera Testing Library"
     type = LibraryType.INTERNAL_TEST_LIBRARY
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/ExifUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/ExifUtil.java
new file mode 100644
index 0000000..85d6bdd
--- /dev/null
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/ExifUtil.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.testing;
+
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.utils.Exif;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+/**
+ * Utility class for creating fake {@link Exif}s for testing.
+ */
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+public class ExifUtil {
+
+    private ExifUtil() {
+    }
+
+    /**
+     * Create a fake {@link Exif} instance from the given JPEG bytes.
+     */
+    @NonNull
+    public static Exif createExif(@NonNull byte[] jpegBytes) throws IOException {
+        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(jpegBytes);
+        return Exif.createFromInputStream(byteArrayInputStream);
+    }
+
+}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/TestImageUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/TestImageUtil.java
new file mode 100644
index 0000000..84c1409
--- /dev/null
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/TestImageUtil.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.testing;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+
+import java.io.ByteArrayOutputStream;
+
+/**
+ * Generates images for testing.
+ *
+ * <p> The images generated by this class contains 4 color blocks follows the pattern below. Each
+ * block have the same size and covers 1/4 of the image.
+ *
+ * <pre>
+ * ------------------
+ * |   red  | green |
+ * ------------------
+ * |  blue | yellow |
+ * ------------------
+ * </pre>
+ */
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+public class TestImageUtil {
+
+    private TestImageUtil() {
+    }
+
+    /**
+     * Generates a JPEG image.
+     */
+    @NonNull
+    public static byte[] createJpegBytes(int width, int height) {
+        Bitmap bitmap = createBitmap(width, height);
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
+        return outputStream.toByteArray();
+    }
+
+    /**
+     * Generates a {@link Bitmap} image and paints it with 4 color blocks.
+     */
+    @NonNull
+    public static Bitmap createBitmap(int width, int height) {
+        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+        int centerX = width / 2;
+        int centerY = height / 2;
+        Canvas canvas = new Canvas(bitmap);
+        canvas.drawRect(0, 0, centerX, centerY, createPaint(Color.RED));
+        canvas.drawRect(centerX, 0, width, centerY, createPaint(Color.GREEN));
+        canvas.drawRect(centerX, centerY, width, height, createPaint(Color.YELLOW));
+        canvas.drawRect(0, centerY, centerX, height, createPaint(Color.BLUE));
+        return bitmap;
+    }
+
+    /**
+     * Calculates the average color difference, between the given image/crop rect and the color.
+     *
+     * <p>This method is used for checking the content of an image is correct.
+     */
+    public static int getAverageDiff(@NonNull Bitmap bitmap, @NonNull Rect rect, int color) {
+        int totalDiff = 0;
+        for (int i = rect.left; i < rect.right; i++) {
+            for (int j = rect.top; j < rect.bottom; j++) {
+                totalDiff += calculateColorDiff(bitmap.getPixel(i, j), color);
+            }
+        }
+        return totalDiff / (rect.width() * rect.height());
+    }
+
+    /**
+     * Calculates the difference between 2 colors.
+     *
+     * <p>The difference is calculated as the average difference of each R, G and B color
+     * components.
+     */
+    private static int calculateColorDiff(int color1, int color2) {
+        int diff = 0;
+        for (int shift = 0; shift <= 16; shift += 8) {
+            diff += Math.abs((color1 >> shift) & 0xFF - (color2 >> shift) & 0xFF);
+        }
+        return diff / 3;
+    }
+
+    /**
+     * Creates a FILL paint with the given color.
+     */
+    private static Paint createPaint(int color) {
+        Paint paint = new Paint();
+        paint.setStyle(Paint.Style.FILL);
+        paint.setColor(color);
+        return paint;
+    }
+}
diff --git a/camera/camera-testing/src/test/java/androidx/camera/testing/TestImageUtilTest.kt b/camera/camera-testing/src/test/java/androidx/camera/testing/TestImageUtilTest.kt
new file mode 100644
index 0000000..6cc0575
--- /dev/null
+++ b/camera/camera-testing/src/test/java/androidx/camera/testing/TestImageUtilTest.kt
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.testing
+
+import android.graphics.BitmapFactory.decodeByteArray
+import android.graphics.Color.BLUE
+import android.graphics.Color.GREEN
+import android.graphics.Color.RED
+import android.graphics.Color.YELLOW
+import android.graphics.Rect
+import android.os.Build
+import androidx.camera.testing.TestImageUtil.createJpegBytes
+import androidx.camera.testing.TestImageUtil.getAverageDiff
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+/**
+ * Unit tests for [TestImageUtil]
+ */
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class TestImageUtilTest {
+
+    companion object {
+        private const val WIDTH = 640
+        private const val HEIGHT = 480
+    }
+
+    @Test
+    fun createTestJpeg_verifyColor() {
+        // Act.
+        val jpegBytes = createJpegBytes(WIDTH, HEIGHT)
+        val bitmap = decodeByteArray(jpegBytes, 0, jpegBytes.size)
+        // Assert.
+        assertThat(getAverageDiff(bitmap, Rect(0, 0, 320, 240), RED)).isEqualTo(0)
+        assertThat(getAverageDiff(bitmap, Rect(321, 0, 640, 240), GREEN)).isEqualTo(0)
+        assertThat(getAverageDiff(bitmap, Rect(321, 241, 640, 480), YELLOW)).isEqualTo(0)
+        assertThat(getAverageDiff(bitmap, Rect(0, 241, 320, 480), BLUE)).isEqualTo(0)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-video/build.gradle b/camera/camera-video/build.gradle
index 28a054e..ce37b7e 100644
--- a/camera/camera-video/build.gradle
+++ b/camera/camera-video/build.gradle
@@ -96,10 +96,3 @@
             "consistent and reliable camera foundation that enables great camera driven " +
             "experiences across all of Android."
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/camera/integration-tests/coretestapp/build.gradle b/camera/integration-tests/coretestapp/build.gradle
index 6b8335e..8b6295b 100644
--- a/camera/integration-tests/coretestapp/build.gradle
+++ b/camera/integration-tests/coretestapp/build.gradle
@@ -106,10 +106,3 @@
     testImplementation(libs.junit)
     testImplementation(libs.truth)
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BasicUITest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BasicUITest.kt
index 2923b27..ee64676 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BasicUITest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BasicUITest.kt
@@ -39,6 +39,7 @@
 import leakcanary.DetectLeaksAfterTestSuccess
 import org.junit.After
 import org.junit.Assume
+import org.junit.Assume.assumeTrue
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
@@ -126,6 +127,12 @@
             // Arrange.
             // Wait for the Activity to be created and Preview appears before starting the test.
             scenario.waitForViewfinderIdle()
+
+            // Skips the test if ImageAnalysis can't be enabled when launching the activity. Some
+            // devices use YUV stream to take image and Preview + ImageCapture + ImageAnalysis
+            // might not be able to bind together.
+            assumeTrue(scenario.withActivity { imageAnalysis != null })
+
             // Click to disable the imageAnalysis use case.
             if (scenario.withActivity { imageAnalysis != null }) {
                 Espresso.onView(withId(R.id.AnalysisToggle)).perform(ViewActions.click())
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BindUnbindUseCasesStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BindUnbindUseCasesStressTest.kt
index 28d87a75..c01a81f 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BindUnbindUseCasesStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BindUnbindUseCasesStressTest.kt
@@ -198,6 +198,7 @@
     fun bindUnbindUseCases_checkPreviewInEachTime_withPreviewImageCaptureImageAnalysis():
         Unit = runBlocking {
         val imageAnalysis = ImageAnalysis.Builder().build()
+        assumeTrue(camera.isUseCasesCombinationSupported(preview, imageCapture, imageAnalysis))
         bindUseCases_checkOutput_thenUnbindAll_repeatedly(
             preview,
             imageCapture,
@@ -212,6 +213,7 @@
     fun bindUnbindUseCases_checkImageCaptureInEachTime_withPreviewImageCaptureImageAnalysis():
         Unit = runBlocking {
         val imageAnalysis = ImageAnalysis.Builder().build()
+        assumeTrue(camera.isUseCasesCombinationSupported(preview, imageCapture, imageAnalysis))
         bindUseCases_checkOutput_thenUnbindAll_repeatedly(
             preview,
             imageCapture,
@@ -226,6 +228,7 @@
     fun bindUnbindUseCases_checkImageAnalysisInEachTime_withPreviewImageCaptureImageAnalysis():
         Unit = runBlocking {
         val imageAnalysis = ImageAnalysis.Builder().build()
+        assumeTrue(camera.isUseCasesCombinationSupported(preview, imageCapture, imageAnalysis))
         bindUseCases_checkOutput_thenUnbindAll_repeatedly(
             preview,
             imageCapture,
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/UseCaseCombinationTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/UseCaseCombinationTest.kt
index ae9a9dd..5a6d5de1 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/UseCaseCombinationTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/UseCaseCombinationTest.kt
@@ -22,6 +22,7 @@
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.camera2.interop.Camera2Interop
 import androidx.camera.camera2.pipe.integration.CameraPipeConfig
+import androidx.camera.core.Camera
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.CameraX
 import androidx.camera.core.CameraXConfig
@@ -46,6 +47,7 @@
 import kotlinx.coroutines.withContext
 import org.junit.After
 import org.junit.Assume
+import org.junit.Assume.assumeTrue
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
@@ -79,6 +81,7 @@
     private val context: Context = ApplicationProvider.getApplicationContext()
     private lateinit var cameraProvider: ProcessCameraProvider
     private lateinit var fakeLifecycleOwner: FakeLifecycleOwner
+    private lateinit var camera: Camera
 
     @Before
     fun initializeCameraX(): Unit = runBlocking {
@@ -89,6 +92,8 @@
         withContext(Dispatchers.Main) {
             fakeLifecycleOwner = FakeLifecycleOwner()
             fakeLifecycleOwner.startAndResume()
+
+            camera = cameraProvider.bindToLifecycle(fakeLifecycleOwner, DEFAULT_SELECTOR)
         }
     }
 
@@ -112,6 +117,8 @@
         val preview = initPreview(previewMonitor)
         val imageCapture = initImageCapture()
 
+        assertThat(camera.isUseCasesCombinationSupported(preview, imageCapture)).isTrue()
+
         // TODO(b/160249108) move off of main thread once UseCases can be attached on any thread
         // Act.
         withContext(Dispatchers.Main) {
@@ -140,6 +147,8 @@
         val imageAnalysisMonitor = AnalysisMonitor()
         val imageAnalysis = initImageAnalysis(imageAnalysisMonitor)
 
+        assertThat(camera.isUseCasesCombinationSupported(preview, imageAnalysis)).isTrue()
+
         // TODO(b/160249108) move off of main thread once UseCases can be attached on any thread
         // Act.
         withContext(Dispatchers.Main) {
@@ -169,6 +178,8 @@
         val imageAnalysisMonitor = AnalysisMonitor()
         val imageAnalysis = initImageAnalysis(imageAnalysisMonitor)
 
+        assumeTrue(camera.isUseCasesCombinationSupported(preview, imageCapture, imageAnalysis))
+
         // TODO(b/160249108) move off of main thread once UseCases can be attached on any thread
         // Act.
         withContext(Dispatchers.Main) {
@@ -197,6 +208,8 @@
         val preview = initPreview(previewMonitor)
         val imageCapture = initImageCapture()
 
+        assertThat(camera.isUseCasesCombinationSupported(preview, imageCapture)).isTrue()
+
         withContext(Dispatchers.Main) {
             preview.setSurfaceProvider(SurfaceTextureProvider.createSurfaceTextureProvider())
             cameraProvider.bindToLifecycle(
@@ -232,6 +245,9 @@
         val imageCapture = initImageCapture()
         val imageAnalysisMonitor = AnalysisMonitor()
         val imageAnalysis = initImageAnalysis(imageAnalysisMonitor)
+
+        assumeTrue(camera.isUseCasesCombinationSupported(preview, imageCapture, imageAnalysis))
+
         withContext(Dispatchers.Main) {
             preview.setSurfaceProvider(SurfaceTextureProvider.createSurfaceTextureProvider())
             cameraProvider.bindToLifecycle(
@@ -279,6 +295,9 @@
         val imageCapture = initImageCapture()
         val imageAnalysisMonitor = AnalysisMonitor()
         val imageAnalysis = initImageAnalysis(imageAnalysisMonitor)
+
+        assumeTrue(camera.isUseCasesCombinationSupported(preview, imageCapture, imageAnalysis))
+
         withContext(Dispatchers.Main) {
             preview.setSurfaceProvider(SurfaceTextureProvider.createSurfaceTextureProvider())
             cameraProvider.bindToLifecycle(
@@ -313,6 +332,9 @@
         val imageCapture = initImageCapture()
         val imageAnalysisMonitor = AnalysisMonitor()
         val imageAnalysis = initImageAnalysis(imageAnalysisMonitor)
+
+        assumeTrue(camera.isUseCasesCombinationSupported(preview, imageCapture, imageAnalysis))
+
         withContext(Dispatchers.Main) {
             preview.setSurfaceProvider(SurfaceTextureProvider.createSurfaceTextureProvider())
             cameraProvider.bindToLifecycle(
@@ -348,6 +370,9 @@
         val imageCapture = initImageCapture()
         val imageAnalysisMonitor = AnalysisMonitor()
         val imageAnalysis = initImageAnalysis(imageAnalysisMonitor)
+
+        assumeTrue(camera.isUseCasesCombinationSupported(preview, imageCapture, imageAnalysis))
+
         withContext(Dispatchers.Main) {
             preview.setSurfaceProvider(SurfaceTextureProvider.createSurfaceTextureProvider())
             cameraProvider.bindToLifecycle(
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisLifecycleStatusChangeStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisLifecycleStatusChangeStressTest.kt
index 26c7632..e37c5f1 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisLifecycleStatusChangeStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisLifecycleStatusChangeStressTest.kt
@@ -42,6 +42,7 @@
     @RepeatRule.Repeat(times = LARGE_STRESS_TEST_REPEAT_COUNT)
     fun pauseResumeActivity_checkImageAnalysisInEachTime_withPreviewImageCaptureImageAnalysis() {
         val useCaseCombination = BIND_PREVIEW or BIND_IMAGE_CAPTURE or BIND_IMAGE_ANALYSIS
+        assumeCameraSupportUseCaseCombination(camera, useCaseCombination)
         pauseResumeActivity_checkOutput_repeatedly(
             cameraId,
             useCaseCombination,
@@ -67,6 +68,7 @@
     @RepeatRule.Repeat(times = LARGE_STRESS_TEST_REPEAT_COUNT)
     fun checkImageAnalysis_afterPauseResumeRepeatedly_withPreviewImageCaptureImageAnalysis() {
         val useCaseCombination = BIND_PREVIEW or BIND_IMAGE_CAPTURE or BIND_IMAGE_ANALYSIS
+        assumeCameraSupportUseCaseCombination(camera, useCaseCombination)
         pauseResumeActivityRepeatedly_thenCheckOutput(
             cameraId,
             useCaseCombination,
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisSwitchCameraStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisSwitchCameraStressTest.kt
index df3f64c..f0996e9 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisSwitchCameraStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisSwitchCameraStressTest.kt
@@ -22,6 +22,7 @@
 import androidx.camera.integration.core.CameraXActivity.BIND_VIDEO_CAPTURE
 import androidx.camera.integration.core.util.StressTestUtil.LARGE_STRESS_TEST_REPEAT_COUNT
 import androidx.camera.integration.core.util.StressTestUtil.VERIFICATION_TARGET_IMAGE_ANALYSIS
+import androidx.camera.integration.core.util.StressTestUtil.assumeCameraSupportUseCaseCombination
 import androidx.camera.testing.LabTestRule
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
@@ -41,6 +42,7 @@
     @RepeatRule.Repeat(times = LARGE_STRESS_TEST_REPEAT_COUNT)
     fun switchCamera_checkImageAnalysisInEachTime_withPreviewImageCaptureImageAnalysis() {
         val useCaseCombination = BIND_PREVIEW or BIND_IMAGE_CAPTURE or BIND_IMAGE_ANALYSIS
+        assumeCameraSupportUseCaseCombination(camera, useCaseCombination)
         switchCamera_checkOutput_repeatedly(
             cameraId,
             useCaseCombination,
@@ -66,6 +68,7 @@
     @RepeatRule.Repeat(times = LARGE_STRESS_TEST_REPEAT_COUNT)
     fun checkImageAnalysis_afterSwitchCameraRepeatedly_withPreviewImageCaptureImageAnalysis() {
         val useCaseCombination = BIND_PREVIEW or BIND_IMAGE_CAPTURE or BIND_IMAGE_ANALYSIS
+        assumeCameraSupportUseCaseCombination(camera, useCaseCombination)
         switchCamera_repeatedly_thenCheckOutput(
             cameraId,
             useCaseCombination,
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureLifecycleStatusChangeStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureLifecycleStatusChangeStressTest.kt
index 8a865e3..8e35e34 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureLifecycleStatusChangeStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureLifecycleStatusChangeStressTest.kt
@@ -54,6 +54,7 @@
     @RepeatRule.Repeat(times = LARGE_STRESS_TEST_REPEAT_COUNT)
     fun pauseResumeActivity_checkImageCaptureInEachTime_withPreviewImageCaptureImageAnalysis() {
         val useCaseCombination = BIND_PREVIEW or BIND_IMAGE_CAPTURE or BIND_IMAGE_ANALYSIS
+        assumeCameraSupportUseCaseCombination(camera, useCaseCombination)
         pauseResumeActivity_checkOutput_repeatedly(
             cameraId,
             useCaseCombination,
@@ -91,6 +92,7 @@
     @RepeatRule.Repeat(times = LARGE_STRESS_TEST_REPEAT_COUNT)
     fun checkImageCapture_afterPauseResumeRepeatedly_withPreviewImageCaptureImageAnalysis() {
         val useCaseCombination = BIND_PREVIEW or BIND_IMAGE_CAPTURE or BIND_IMAGE_ANALYSIS
+        assumeCameraSupportUseCaseCombination(camera, useCaseCombination)
         pauseResumeActivityRepeatedly_thenCheckOutput(
             cameraId,
             useCaseCombination,
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureSwitchCameraStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureSwitchCameraStressTest.kt
index 7cc74f1..c446e77 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureSwitchCameraStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureSwitchCameraStressTest.kt
@@ -22,6 +22,7 @@
 import androidx.camera.integration.core.CameraXActivity.BIND_VIDEO_CAPTURE
 import androidx.camera.integration.core.util.StressTestUtil.LARGE_STRESS_TEST_REPEAT_COUNT
 import androidx.camera.integration.core.util.StressTestUtil.VERIFICATION_TARGET_IMAGE_CAPTURE
+import androidx.camera.integration.core.util.StressTestUtil.assumeCameraSupportUseCaseCombination
 import androidx.camera.testing.LabTestRule
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
@@ -53,6 +54,7 @@
     @RepeatRule.Repeat(times = LARGE_STRESS_TEST_REPEAT_COUNT)
     fun switchCamera_checkImageCaptureInEachTime_withPreviewImageCaptureImageAnalysis() {
         val useCaseCombination = BIND_PREVIEW or BIND_IMAGE_CAPTURE or BIND_IMAGE_ANALYSIS
+        assumeCameraSupportUseCaseCombination(camera, useCaseCombination)
         switchCamera_checkOutput_repeatedly(
             cameraId,
             useCaseCombination,
@@ -90,6 +92,7 @@
     @RepeatRule.Repeat(times = LARGE_STRESS_TEST_REPEAT_COUNT)
     fun checkImageCapture_afterSwitchCameraRepeatedly_withPreviewImageCaptureImageAnalysis() {
         val useCaseCombination = BIND_PREVIEW or BIND_IMAGE_CAPTURE or BIND_IMAGE_ANALYSIS
+        assumeCameraSupportUseCaseCombination(camera, useCaseCombination)
         switchCamera_repeatedly_thenCheckOutput(
             cameraId,
             useCaseCombination,
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewLifecycleStatusChangeStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewLifecycleStatusChangeStressTest.kt
index cc2d378..04e4fe4 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewLifecycleStatusChangeStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewLifecycleStatusChangeStressTest.kt
@@ -54,6 +54,7 @@
     @RepeatRule.Repeat(times = LARGE_STRESS_TEST_REPEAT_COUNT)
     fun pauseResumeActivity_checkPreviewInEachTime_withPreviewImageCaptureImageAnalysis() {
         val useCaseCombination = BIND_PREVIEW or BIND_IMAGE_CAPTURE or BIND_IMAGE_ANALYSIS
+        assumeCameraSupportUseCaseCombination(camera, useCaseCombination)
         pauseResumeActivity_checkOutput_repeatedly(
             cameraId,
             useCaseCombination,
@@ -116,6 +117,7 @@
     @RepeatRule.Repeat(times = LARGE_STRESS_TEST_REPEAT_COUNT)
     fun checkPreview_afterPauseResumeRepeatedly_withPreviewImageCaptureImageAnalysis() {
         val useCaseCombination = BIND_PREVIEW or BIND_IMAGE_CAPTURE or BIND_IMAGE_ANALYSIS
+        assumeCameraSupportUseCaseCombination(camera, useCaseCombination)
         pauseResumeActivityRepeatedly_thenCheckOutput(
             cameraId,
             useCaseCombination,
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewSwitchCameraStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewSwitchCameraStressTest.kt
index 0fd2393..ee61902 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewSwitchCameraStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewSwitchCameraStressTest.kt
@@ -53,6 +53,7 @@
     @RepeatRule.Repeat(times = LARGE_STRESS_TEST_REPEAT_COUNT)
     fun switchCamera_checkPreviewInEachTime_withPreviewImageCaptureImageAnalysis() {
         val useCaseCombination = BIND_PREVIEW or BIND_IMAGE_CAPTURE or BIND_IMAGE_ANALYSIS
+        assumeBothLensFacingCamerasSupportUseCaseCombination(camera, useCaseCombination)
         switchCamera_checkOutput_repeatedly(
             cameraId,
             useCaseCombination,
@@ -115,6 +116,7 @@
     @RepeatRule.Repeat(times = LARGE_STRESS_TEST_REPEAT_COUNT)
     fun checkPreview_afterSwitchCameraRepeatedly_withPreviewImageCaptureImageAnalysis() {
         val useCaseCombination = BIND_PREVIEW or BIND_IMAGE_CAPTURE or BIND_IMAGE_ANALYSIS
+        assumeBothLensFacingCamerasSupportUseCaseCombination(camera, useCaseCombination)
         switchCamera_repeatedly_thenCheckOutput(
             cameraId,
             useCaseCombination,
diff --git a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
index 5e7c99f..b9f5851 100644
--- a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
+++ b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
@@ -1276,13 +1276,17 @@
             Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
 
             // Restore toggle buttons to the previous state if the bind failed.
-            mPreviewToggle.setChecked(getPreview() != null);
-            mPhotoToggle.setChecked(getImageCapture() != null);
-            mAnalysisToggle.setChecked(getImageAnalysis() != null);
-            mVideoToggle.setChecked(getVideoCapture() != null);
+            if (mUseCases != null) {
+                mPreviewToggle.setChecked(getPreview() != null);
+                mPhotoToggle.setChecked(getImageCapture() != null);
+                mAnalysisToggle.setChecked(getImageAnalysis() != null);
+                mVideoToggle.setChecked(getVideoCapture() != null);
+            }
             // Reset video quality to avoid always fail by quality too large.
             mRecordUi.getButtonQuality().setText(getQualityIconName(mVideoQuality = QUALITY_AUTO));
 
+            reduceUseCaseToFindSupportedCombination();
+
             if (!calledBySelf) {
                 // Only call self if not already calling self to avoid an infinite loop.
                 tryBindUseCases(true);
@@ -1292,6 +1296,44 @@
     }
 
     /**
+     * Checks whether currently checked use cases combination can be supported or not.
+     */
+    private boolean isCheckedUseCasesCombinationSupported() {
+        return mCamera.isUseCasesCombinationSupported(buildUseCases().toArray(new UseCase[0]));
+    }
+
+    /**
+     * Unchecks use case to find a supported use cases combination.
+     *
+     * Only VideoCapture or ImageAnalysis will be tried to uncheck. If only Preview and
+     * ImageCapture are remained, the combination should always be supported.
+     */
+    private void reduceUseCaseToFindSupportedCombination() {
+        // Checks whether current combination can be supported
+        if (isCheckedUseCasesCombinationSupported()) {
+            return;
+        }
+
+        // Remove VideoCapture to check whether the new use cases combination can be supported.
+        if (mVideoToggle.isChecked()) {
+            mVideoToggle.setChecked(false);
+            if (isCheckedUseCasesCombinationSupported()) {
+                return;
+            }
+        }
+
+        // Remove ImageAnalysis to check whether the new use cases combination can be supported.
+        if (mAnalysisToggle.isChecked()) {
+            mAnalysisToggle.setChecked(false);
+            if (isCheckedUseCasesCombinationSupported()) {
+                return;
+            }
+        }
+
+        // Preview + ImageCapture should be always supported.
+    }
+
+    /**
      * Builds all use cases based on current settings and return as an array.
      */
     private List<UseCase> buildUseCases() {
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewTest.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewTest.kt
index 23690eb..ce867cc 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewTest.kt
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewTest.kt
@@ -25,6 +25,7 @@
 import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.launchCameraExtensionsActivity
 import androidx.camera.integration.extensions.util.HOME_TIMEOUT_MS
 import androidx.camera.integration.extensions.util.waitForPreviewIdle
+import androidx.camera.integration.extensions.utils.CameraSelectorUtil
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraUtil.PreTestCameraIdList
@@ -34,6 +35,7 @@
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.rule.GrantPermissionRule
 import androidx.test.uiautomator.UiDevice
+import androidx.testutils.withActivity
 import java.util.concurrent.TimeUnit
 import org.junit.After
 import org.junit.Assume.assumeTrue
@@ -61,6 +63,7 @@
         GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE)!!
 
     private val context = ApplicationProvider.getApplicationContext<Context>()
+    private lateinit var extensionsManager: ExtensionsManager
 
     companion object {
         @Parameterized.Parameters(name = "cameraId = {0}, extensionMode = {1}")
@@ -84,7 +87,7 @@
         val cameraProvider =
             ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
 
-        val extensionsManager = ExtensionsManager.getInstanceAsync(
+        extensionsManager = ExtensionsManager.getInstanceAsync(
             context,
             cameraProvider
         )[10000, TimeUnit.MILLISECONDS]
@@ -125,4 +128,35 @@
             }
         }
     }
+
+    private fun assumeNextCameraIdExtensionModeSupported(cameraId: String, extensionsMode: Int) {
+        val nextCameraId = CameraSelectorUtil.findNextSupportedCameraId(
+            ApplicationProvider.getApplicationContext(),
+            extensionsManager,
+            cameraId,
+            extensionMode
+        )
+        assumeTrue(
+            "Cannot find next camera id that supports extensions mode($extensionsMode)",
+            nextCameraId != null)
+    }
+    /**
+     * Checks that Preview can successfully enter the STREAMING state to show the preview when an
+     * extension mode is enabled and after switching cameras.
+     */
+    @Test
+    fun previewCanEnterStreamingStateAfterSwitchingCamera() {
+        assumeNextCameraIdExtensionModeSupported(cameraId, extensionMode)
+        val activityScenario = launchCameraExtensionsActivity(cameraId, extensionMode)
+
+        with(activityScenario) {
+            use {
+                waitForPreviewIdle()
+                withActivity {
+                    switchCameras()
+                }
+                waitForPreviewIdle()
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/CameraXExtensionsTestUtil.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/CameraXExtensionsTestUtil.kt
index fbece45..fc805cd 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/CameraXExtensionsTestUtil.kt
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/CameraXExtensionsTestUtil.kt
@@ -152,7 +152,8 @@
         extensionMode: Int
     ) {
         val cameraIdCameraSelector = createCameraSelectorById(cameraId)
-        assumeTrue(extensionsManager.isExtensionAvailable(cameraIdCameraSelector, extensionMode))
+        assumeTrue("Extensions mode($extensionMode) not supported",
+            extensionsManager.isExtensionAvailable(cameraIdCameraSelector, extensionMode))
     }
 
     @JvmStatic
diff --git a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
index 8064fd3..22346ee 100644
--- a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
+++ b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
@@ -139,6 +139,8 @@
     Map<Long, Long> mFrameTimestampMap = new HashMap<>();
     TextView mFrameInfo;
 
+    String mCurrentCameraId = null;
+
     void setupButtons() {
         Button btnToggleMode = findViewById(R.id.PhotoToggle);
         Button btnSwitchCamera = findViewById(R.id.Switch);
@@ -148,8 +150,18 @@
 
     void switchCameras() {
         mCameraProvider.unbindAll();
-        mCurrentCameraSelector = (mCurrentCameraSelector == CameraSelector.DEFAULT_BACK_CAMERA)
-                ? CameraSelector.DEFAULT_FRONT_CAMERA : CameraSelector.DEFAULT_BACK_CAMERA;
+        if (mCurrentCameraId != null) {
+            String nextCameraId = CameraSelectorUtil.findNextSupportedCameraId(
+                    this, mExtensionsManager, mCurrentCameraId, mCurrentExtensionMode);
+            if (nextCameraId == null) {
+                Log.e(TAG, "Cannot find next camera id that supports the extensions mode");
+                return;
+            }
+            mCurrentCameraSelector = CameraSelectorUtil.createCameraSelectorById(mCurrentCameraId);
+        } else {
+            mCurrentCameraSelector = (mCurrentCameraSelector == CameraSelector.DEFAULT_BACK_CAMERA)
+                    ? CameraSelector.DEFAULT_FRONT_CAMERA : CameraSelector.DEFAULT_BACK_CAMERA;
+        }
         if (!bindUseCasesWithCurrentExtensionMode()) {
             bindUseCasesWithNextExtensionMode();
         }
@@ -341,9 +353,9 @@
 
         mInitializationIdlingResource.increment();
 
-        String cameraId = getIntent().getStringExtra(INTENT_EXTRA_KEY_CAMERA_ID);
-        if (cameraId != null) {
-            mCurrentCameraSelector = CameraSelectorUtil.createCameraSelectorById(cameraId);
+        mCurrentCameraId = getIntent().getStringExtra(INTENT_EXTRA_KEY_CAMERA_ID);
+        if (mCurrentCameraId != null) {
+            mCurrentCameraSelector = CameraSelectorUtil.createCameraSelectorById(mCurrentCameraId);
         }
 
         // Get params from adb extra string for the e2e test cases.
diff --git a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/utils/CameraSelectorUtil.kt b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/utils/CameraSelectorUtil.kt
index 7b731c6..b04f493 100644
--- a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/utils/CameraSelectorUtil.kt
+++ b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/utils/CameraSelectorUtil.kt
@@ -16,12 +16,17 @@
 
 package androidx.camera.integration.extensions.utils
 
+import android.content.Context
+import android.hardware.camera2.CameraAccessException
+import android.hardware.camera2.CameraManager
 import androidx.annotation.OptIn
 import androidx.camera.camera2.interop.Camera2CameraInfo
 import androidx.camera.camera2.interop.ExperimentalCamera2Interop
 import androidx.camera.core.CameraFilter
 import androidx.camera.core.CameraInfo
 import androidx.camera.core.CameraSelector
+import androidx.camera.extensions.ExtensionMode
+import androidx.camera.extensions.ExtensionsManager
 
 object CameraSelectorUtil {
 
@@ -37,4 +42,34 @@
 
             throw IllegalArgumentException("No camera can be find for id: $cameraId")
         }).build()
+
+    @JvmStatic
+    fun findNextSupportedCameraId(
+        context: Context,
+        extensionsManager: ExtensionsManager,
+        currentCameraId: String,
+        @ExtensionMode.Mode extensionsMode: Int
+    ): String? {
+        val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
+        try {
+            val supportedCameraIdList = cameraManager.cameraIdList.filter {
+                extensionsManager.isExtensionAvailable(
+                        createCameraSelectorById(it),
+                        extensionsMode
+                )
+            }
+
+            if (supportedCameraIdList.size == 1) {
+                return null
+            }
+
+            supportedCameraIdList.forEachIndexed { index, id ->
+                if (currentCameraId == id) {
+                    return supportedCameraIdList[(index + 1) % supportedCameraIdList.size]
+                }
+            }
+        } catch (e: CameraAccessException) {
+        }
+        return null
+    }
 }
\ No newline at end of file
diff --git a/camera/integration-tests/timingtestapp/build.gradle b/camera/integration-tests/timingtestapp/build.gradle
index 5a42db1..3a494e0 100644
--- a/camera/integration-tests/timingtestapp/build.gradle
+++ b/camera/integration-tests/timingtestapp/build.gradle
@@ -45,9 +45,6 @@
     buildFeatures {
         viewBinding true
     }
-    kotlinOptions {
-        freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
-    }
     namespace "androidx.camera.integration.antelope"
 }
 
diff --git a/car/app/app-automotive/api/1.3.0-beta01.txt b/car/app/app-automotive/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..57edaf4
--- /dev/null
+++ b/car/app/app-automotive/api/1.3.0-beta01.txt
@@ -0,0 +1,41 @@
+// Signature format: 4.0
+package androidx.car.app.activity {
+
+  public abstract class BaseCarAppActivity extends androidx.fragment.app.FragmentActivity implements androidx.lifecycle.LifecycleOwner {
+    ctor public BaseCarAppActivity();
+    method public void bindToViewModel(androidx.car.app.SessionInfo);
+    method public android.content.ComponentName? getServiceComponentName();
+  }
+
+  public final class CarAppActivity extends androidx.car.app.activity.BaseCarAppActivity implements androidx.lifecycle.LifecycleOwner {
+    ctor public CarAppActivity();
+  }
+
+}
+
+package androidx.car.app.activity.renderer.surface {
+
+  public final class LegacySurfacePackage {
+    ctor public LegacySurfacePackage(androidx.car.app.activity.renderer.surface.SurfaceControlCallback);
+  }
+
+  public interface SurfaceControlCallback {
+    method public default void onError(String, Throwable);
+    method public void onKeyEvent(android.view.KeyEvent);
+    method public void onTouchEvent(android.view.MotionEvent);
+    method public void onWindowFocusChanged(boolean, boolean);
+    method public void setSurfaceWrapper(androidx.car.app.activity.renderer.surface.SurfaceWrapper);
+  }
+
+  public final class SurfaceWrapper {
+    ctor public SurfaceWrapper(android.os.IBinder?, @Dimension int, @Dimension int, int, int, android.view.Surface);
+    method public int getDensityDpi();
+    method public int getDisplayId();
+    method @Dimension public int getHeight();
+    method public android.os.IBinder? getHostToken();
+    method public android.view.Surface getSurface();
+    method @Dimension public int getWidth();
+  }
+
+}
+
diff --git a/car/app/app-automotive/api/current.txt b/car/app/app-automotive/api/current.txt
index fbc3e22..57edaf4 100644
--- a/car/app/app-automotive/api/current.txt
+++ b/car/app/app-automotive/api/current.txt
@@ -4,7 +4,7 @@
   public abstract class BaseCarAppActivity extends androidx.fragment.app.FragmentActivity implements androidx.lifecycle.LifecycleOwner {
     ctor public BaseCarAppActivity();
     method public void bindToViewModel(androidx.car.app.SessionInfo);
-    method public android.content.ComponentName? retrieveServiceComponentName();
+    method public android.content.ComponentName? getServiceComponentName();
   }
 
   public final class CarAppActivity extends androidx.car.app.activity.BaseCarAppActivity implements androidx.lifecycle.LifecycleOwner {
@@ -39,50 +39,3 @@
 
 }
 
-package androidx.car.app.hardware.common {
-
-  public final class CarZoneAreaIdConstants {
-    field public static final int AREA_ID_GLOBAL = 0; // 0x0
-  }
-
-  public static final class CarZoneAreaIdConstants.VehicleAreaSeat {
-    field public static final int COL_ALL = 1911; // 0x777
-    field public static final int COL_CENTER = 546; // 0x222
-    field public static final int COL_LEFT = 273; // 0x111
-    field public static final int COL_RIGHT = 1092; // 0x444
-    field public static final int ROW_1_CENTER = 2; // 0x2
-    field public static final int ROW_1_LEFT = 1; // 0x1
-    field public static final int ROW_1_RIGHT = 4; // 0x4
-    field public static final int ROW_2_CENTER = 32; // 0x20
-    field public static final int ROW_2_LEFT = 16; // 0x10
-    field public static final int ROW_2_RIGHT = 64; // 0x40
-    field public static final int ROW_3_CENTER = 512; // 0x200
-    field public static final int ROW_3_LEFT = 256; // 0x100
-    field public static final int ROW_3_RIGHT = 1024; // 0x400
-    field public static final int ROW_ALL = 1911; // 0x777
-    field public static final int ROW_FIRST = 7; // 0x7
-    field public static final int ROW_SECOND = 112; // 0x70
-    field public static final int ROW_THIRD = 1792; // 0x700
-  }
-
-  public interface CarZoneAreaIdConverter {
-    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
-  }
-
-  public final class CarZoneUtils {
-    method public static com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int, int);
-    method public static androidx.car.app.hardware.common.CarZoneAreaIdConverter getZoneAreaIdConverter(int);
-  }
-
-  public class GlobalCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
-    ctor public GlobalCarZoneAreaIdConverter();
-    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
-  }
-
-  public class SeatCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
-    ctor public SeatCarZoneAreaIdConverter();
-    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
-  }
-
-}
-
diff --git a/car/app/app-automotive/api/public_plus_experimental_1.3.0-beta01.txt b/car/app/app-automotive/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..f0fc8af
--- /dev/null
+++ b/car/app/app-automotive/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,97 @@
+// Signature format: 4.0
+package androidx.car.app.activity {
+
+  public abstract class BaseCarAppActivity extends androidx.fragment.app.FragmentActivity implements androidx.lifecycle.LifecycleOwner {
+    ctor public BaseCarAppActivity();
+    method public void bindToViewModel(androidx.car.app.SessionInfo);
+    method public android.content.ComponentName? getServiceComponentName();
+    method @androidx.car.app.annotations.ExperimentalCarApi public android.content.ComponentName? retrieveServiceComponentName();
+  }
+
+  public final class CarAppActivity extends androidx.car.app.activity.BaseCarAppActivity implements androidx.lifecycle.LifecycleOwner {
+    ctor public CarAppActivity();
+  }
+
+}
+
+package androidx.car.app.activity.renderer.surface {
+
+  public final class LegacySurfacePackage {
+    ctor public LegacySurfacePackage(androidx.car.app.activity.renderer.surface.SurfaceControlCallback);
+  }
+
+  public interface SurfaceControlCallback {
+    method public default void onError(String, Throwable);
+    method public void onKeyEvent(android.view.KeyEvent);
+    method public void onTouchEvent(android.view.MotionEvent);
+    method public void onWindowFocusChanged(boolean, boolean);
+    method public void setSurfaceWrapper(androidx.car.app.activity.renderer.surface.SurfaceWrapper);
+  }
+
+  public final class SurfaceWrapper {
+    ctor public SurfaceWrapper(android.os.IBinder?, @Dimension int, @Dimension int, int, int, android.view.Surface);
+    method public int getDensityDpi();
+    method public int getDisplayId();
+    method @Dimension public int getHeight();
+    method public android.os.IBinder? getHostToken();
+    method public android.view.Surface getSurface();
+    method @Dimension public int getWidth();
+  }
+
+}
+
+package androidx.car.app.hardware {
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class AutomotiveCarHardwareManager implements androidx.car.app.hardware.CarHardwareManager {
+    ctor public AutomotiveCarHardwareManager(android.content.Context);
+  }
+
+}
+
+package androidx.car.app.hardware.common {
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class CarZoneAreaIdConstants {
+    field public static final int AREA_ID_GLOBAL = 0; // 0x0
+  }
+
+  public static final class CarZoneAreaIdConstants.VehicleAreaSeat {
+    field public static final int COL_ALL = 1911; // 0x777
+    field public static final int COL_CENTER = 546; // 0x222
+    field public static final int COL_LEFT = 273; // 0x111
+    field public static final int COL_RIGHT = 1092; // 0x444
+    field public static final int ROW_1_CENTER = 2; // 0x2
+    field public static final int ROW_1_LEFT = 1; // 0x1
+    field public static final int ROW_1_RIGHT = 4; // 0x4
+    field public static final int ROW_2_CENTER = 32; // 0x20
+    field public static final int ROW_2_LEFT = 16; // 0x10
+    field public static final int ROW_2_RIGHT = 64; // 0x40
+    field public static final int ROW_3_CENTER = 512; // 0x200
+    field public static final int ROW_3_LEFT = 256; // 0x100
+    field public static final int ROW_3_RIGHT = 1024; // 0x400
+    field public static final int ROW_ALL = 1911; // 0x777
+    field public static final int ROW_FIRST = 7; // 0x7
+    field public static final int ROW_SECOND = 112; // 0x70
+    field public static final int ROW_THIRD = 1792; // 0x700
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public interface CarZoneAreaIdConverter {
+    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class CarZoneUtils {
+    method public static com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int, int);
+    method public static androidx.car.app.hardware.common.CarZoneAreaIdConverter getZoneAreaIdConverter(int);
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public class GlobalCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
+    ctor public GlobalCarZoneAreaIdConverter();
+    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public class SeatCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
+    ctor public SeatCarZoneAreaIdConverter();
+    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
+  }
+
+}
+
diff --git a/car/app/app-automotive/api/public_plus_experimental_current.txt b/car/app/app-automotive/api/public_plus_experimental_current.txt
index 6e7e9f6..f0fc8af 100644
--- a/car/app/app-automotive/api/public_plus_experimental_current.txt
+++ b/car/app/app-automotive/api/public_plus_experimental_current.txt
@@ -4,7 +4,8 @@
   public abstract class BaseCarAppActivity extends androidx.fragment.app.FragmentActivity implements androidx.lifecycle.LifecycleOwner {
     ctor public BaseCarAppActivity();
     method public void bindToViewModel(androidx.car.app.SessionInfo);
-    method public android.content.ComponentName? retrieveServiceComponentName();
+    method public android.content.ComponentName? getServiceComponentName();
+    method @androidx.car.app.annotations.ExperimentalCarApi public android.content.ComponentName? retrieveServiceComponentName();
   }
 
   public final class CarAppActivity extends androidx.car.app.activity.BaseCarAppActivity implements androidx.lifecycle.LifecycleOwner {
@@ -49,7 +50,7 @@
 
 package androidx.car.app.hardware.common {
 
-  public final class CarZoneAreaIdConstants {
+  @androidx.car.app.annotations.ExperimentalCarApi public final class CarZoneAreaIdConstants {
     field public static final int AREA_ID_GLOBAL = 0; // 0x0
   }
 
@@ -73,21 +74,21 @@
     field public static final int ROW_THIRD = 1792; // 0x700
   }
 
-  public interface CarZoneAreaIdConverter {
+  @androidx.car.app.annotations.ExperimentalCarApi public interface CarZoneAreaIdConverter {
     method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
   }
 
-  public final class CarZoneUtils {
+  @androidx.car.app.annotations.ExperimentalCarApi public final class CarZoneUtils {
     method public static com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int, int);
     method public static androidx.car.app.hardware.common.CarZoneAreaIdConverter getZoneAreaIdConverter(int);
   }
 
-  public class GlobalCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
+  @androidx.car.app.annotations.ExperimentalCarApi public class GlobalCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
     ctor public GlobalCarZoneAreaIdConverter();
     method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
   }
 
-  public class SeatCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
+  @androidx.car.app.annotations.ExperimentalCarApi public class SeatCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
     ctor public SeatCarZoneAreaIdConverter();
     method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
   }
diff --git a/car/app/app-automotive/api/res-1.3.0-beta01.txt b/car/app/app-automotive/api/res-1.3.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/car/app/app-automotive/api/res-1.3.0-beta01.txt
diff --git a/car/app/app-automotive/api/restricted_1.3.0-beta01.txt b/car/app/app-automotive/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..2ac21e9a
--- /dev/null
+++ b/car/app/app-automotive/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,41 @@
+// Signature format: 4.0
+package androidx.car.app.activity {
+
+  public abstract class BaseCarAppActivity extends androidx.fragment.app.FragmentActivity {
+    ctor public BaseCarAppActivity();
+    method public void bindToViewModel(androidx.car.app.SessionInfo);
+    method public android.content.ComponentName? getServiceComponentName();
+  }
+
+  public final class CarAppActivity extends androidx.car.app.activity.BaseCarAppActivity {
+    ctor public CarAppActivity();
+  }
+
+}
+
+package androidx.car.app.activity.renderer.surface {
+
+  public final class LegacySurfacePackage {
+    ctor public LegacySurfacePackage(androidx.car.app.activity.renderer.surface.SurfaceControlCallback);
+  }
+
+  public interface SurfaceControlCallback {
+    method public default void onError(String, Throwable);
+    method public void onKeyEvent(android.view.KeyEvent);
+    method public void onTouchEvent(android.view.MotionEvent);
+    method public void onWindowFocusChanged(boolean, boolean);
+    method public void setSurfaceWrapper(androidx.car.app.activity.renderer.surface.SurfaceWrapper);
+  }
+
+  public final class SurfaceWrapper {
+    ctor public SurfaceWrapper(android.os.IBinder?, @Dimension int, @Dimension int, int, int, android.view.Surface);
+    method public int getDensityDpi();
+    method public int getDisplayId();
+    method @Dimension public int getHeight();
+    method public android.os.IBinder? getHostToken();
+    method public android.view.Surface getSurface();
+    method @Dimension public int getWidth();
+  }
+
+}
+
diff --git a/car/app/app-automotive/api/restricted_current.txt b/car/app/app-automotive/api/restricted_current.txt
index 0517edf..2ac21e9a 100644
--- a/car/app/app-automotive/api/restricted_current.txt
+++ b/car/app/app-automotive/api/restricted_current.txt
@@ -4,7 +4,7 @@
   public abstract class BaseCarAppActivity extends androidx.fragment.app.FragmentActivity {
     ctor public BaseCarAppActivity();
     method public void bindToViewModel(androidx.car.app.SessionInfo);
-    method public android.content.ComponentName? retrieveServiceComponentName();
+    method public android.content.ComponentName? getServiceComponentName();
   }
 
   public final class CarAppActivity extends androidx.car.app.activity.BaseCarAppActivity {
@@ -39,50 +39,3 @@
 
 }
 
-package androidx.car.app.hardware.common {
-
-  public final class CarZoneAreaIdConstants {
-    field public static final int AREA_ID_GLOBAL = 0; // 0x0
-  }
-
-  public static final class CarZoneAreaIdConstants.VehicleAreaSeat {
-    field public static final int COL_ALL = 1911; // 0x777
-    field public static final int COL_CENTER = 546; // 0x222
-    field public static final int COL_LEFT = 273; // 0x111
-    field public static final int COL_RIGHT = 1092; // 0x444
-    field public static final int ROW_1_CENTER = 2; // 0x2
-    field public static final int ROW_1_LEFT = 1; // 0x1
-    field public static final int ROW_1_RIGHT = 4; // 0x4
-    field public static final int ROW_2_CENTER = 32; // 0x20
-    field public static final int ROW_2_LEFT = 16; // 0x10
-    field public static final int ROW_2_RIGHT = 64; // 0x40
-    field public static final int ROW_3_CENTER = 512; // 0x200
-    field public static final int ROW_3_LEFT = 256; // 0x100
-    field public static final int ROW_3_RIGHT = 1024; // 0x400
-    field public static final int ROW_ALL = 1911; // 0x777
-    field public static final int ROW_FIRST = 7; // 0x7
-    field public static final int ROW_SECOND = 112; // 0x70
-    field public static final int ROW_THIRD = 1792; // 0x700
-  }
-
-  public interface CarZoneAreaIdConverter {
-    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
-  }
-
-  public final class CarZoneUtils {
-    method public static com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int, int);
-    method public static androidx.car.app.hardware.common.CarZoneAreaIdConverter getZoneAreaIdConverter(int);
-  }
-
-  public class GlobalCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
-    ctor public GlobalCarZoneAreaIdConverter();
-    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
-  }
-
-  public class SeatCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
-    ctor public SeatCarZoneAreaIdConverter();
-    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
-  }
-
-}
-
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/activity/BaseCarAppActivity.java b/car/app/app-automotive/src/main/java/androidx/car/app/activity/BaseCarAppActivity.java
index f261aaa..53007fd 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/activity/BaseCarAppActivity.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/activity/BaseCarAppActivity.java
@@ -56,6 +56,7 @@
 import androidx.car.app.activity.renderer.surface.TemplateSurfaceView;
 import androidx.car.app.activity.ui.ErrorMessageView;
 import androidx.car.app.activity.ui.LoadingView;
+import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.automotive.R;
 import androidx.car.app.serialization.Bundleable;
 import androidx.car.app.serialization.BundlerException;
@@ -265,7 +266,7 @@
      * Binds the {@link BaseCarAppActivity} and it's view against the view model.
      */
     public void bindToViewModel(@NonNull SessionInfo sessionInfo) {
-        ComponentName serviceComponentName = retrieveServiceComponentName();
+        ComponentName serviceComponentName = getServiceComponentName();
         if (serviceComponentName == null) {
             Log.e(LogTags.TAG, "Unspecified service class name");
             finish();
@@ -448,12 +449,21 @@
     }
 
     /**
+     * @see #getServiceComponentName()
+     */
+    @Nullable
+    @ExperimentalCarApi
+    public ComponentName retrieveServiceComponentName() {
+        return getServiceComponentName();
+    }
+
+    /**
      * Retrieves the {@link  ComponentName} to which the view model will talk
      * in order to render.
      */
     @Nullable
     @SuppressWarnings("deprecation")
-    public ComponentName retrieveServiceComponentName() {
+    public ComponentName getServiceComponentName() {
         Intent intent = new Intent(SERVICE_INTERFACE);
         intent.setPackage(getPackageName());
         List<ResolveInfo> infos = getPackageManager().queryIntentServices(intent, 0);
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/climate/AutomotiveCarClimate.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/climate/AutomotiveCarClimate.java
index 86d94fb3..52873967 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/climate/AutomotiveCarClimate.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/climate/AutomotiveCarClimate.java
@@ -359,14 +359,14 @@
                         );
                         break;
                     case FEATURE_FAN_DIRECTION:
-                        if (carPropertyProfile.getCarZoneSetsToMinMaxRange() == null) {
-                            Log.e(LogTags.TAG_CAR_HARDWARE, "Failed to fetch direction speed"
-                                    + " value with profile: " + carPropertyProfile);
+                        if (carPropertyProfile.getHvacFanDirection() == null) {
+                            Log.e(LogTags.TAG_CAR_HARDWARE, "Failed to fetch direction value"
+                                    + " with profile: " + carPropertyProfile);
                             break;
                         }
                         onCarClimateProfileCallback.onFanDirectionProfileAvailable(
-                                new FanDirectionProfile.Builder(getMinMaxProfileIntegerMap(
-                                        carPropertyProfile.getCarZoneSetsToMinMaxRange()))
+                                new FanDirectionProfile.Builder(
+                                        carPropertyProfile.getHvacFanDirection())
                                         .build()
                         );
                         break;
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarPropertyProfile.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarPropertyProfile.java
index 6e28852..d0acd5b 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarPropertyProfile.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarPropertyProfile.java
@@ -18,8 +18,11 @@
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 
+import static java.lang.annotation.ElementType.TYPE_USE;
+
 import android.util.Pair;
 
+import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
@@ -28,6 +31,9 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -48,9 +54,82 @@
 @AutoValue
 public abstract class CarPropertyProfile<T> {
 
+    /**
+     * Possible hvac fan direction values.
+     */
+    @IntDef({
+            UNKNOWN,
+            FACE,
+            FLOOR,
+            DEFROST,
+            /**
+             * FACE_FLOOR = FACE | FLOOR
+             */
+            FACE_FLOOR,
+            /**
+             * FLOOR_DEFROST = FLOOR | DEFROST
+             */
+            FLOOR_DEFROST,
+            /**
+             * FACE_DEFROST = FACE | DEFROST | FLOOR
+             */
+            FACE_DEFROST,
+            /**
+             * FACE_FLOOR_DEFROST = FACE | FLOOR | DEFROST
+             */
+            FACE_FLOOR_DEFROST
+    })
+    @Target(value = TYPE_USE)
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface HvacFanDirection {
+    }
+
+    /** Refers to 'unknown' value of fan direction. */
+    @HvacFanDirection
+    public static final int UNKNOWN = 0x0;
+
+    /** Refers to 'face' value of fan direction. */
+    @HvacFanDirection
+    public static final int FACE = 0x1;
+
+    /** Refers to 'floor' value of fan direction. */
+    @HvacFanDirection
+    public static final int FLOOR = 0x2;
+
+    /** Refers to 'fan and floor' value of fan direction. */
+    @HvacFanDirection
+    public static final int FACE_FLOOR = 0x3;
+
+    /** Refers to 'defrost' value of fan direction. */
+    @HvacFanDirection
+    public static final int DEFROST = 0x4;
+
+    /** Refers to 'face and defrost' value of fan direction. */
+    @HvacFanDirection
+    public static final int FACE_DEFROST = 0x5;
+
+    /** Refers to 'defrost and floor' value of fan direction. */
+    @HvacFanDirection
+    public static final int FLOOR_DEFROST = 0x6;
+
+    /** Refers to 'face, floor and defrost' value of fan direction. */
+    @HvacFanDirection
+    public static final int FACE_FLOOR_DEFROST = 0x7;
+
     /** Returns one of the values in {@link android.car.VehiclePropertyIds}. */
     public abstract int getPropertyId();
 
+    /**
+     * Returns combination of the values in HvacFanDirection corresponding to a set of car zones.
+     *
+     * <p>The set of car zones represent the zones in which the associated feature can be regulated
+     * together.
+     */
+    @Nullable
+    @HvacFanDirection
+    public abstract ImmutableMap<Set<CarZone>, Set<Integer>> getHvacFanDirection();
+
+
     /** Returns a map of min/max values for a property corresponding to a set of car zones.
      *
      * <p>The set of car zones represent the zones in which the associated feature can be regulated
@@ -101,7 +180,8 @@
                 .setCelsiusRange(null)
                 .setFahrenheitRange(null)
                 .setCelsiusIncrement(-1f)
-                .setFahrenheitIncrement(-1f);
+                .setFahrenheitIncrement(-1f)
+                .setHvacFanDirection(null);
     }
 
     /**
@@ -116,6 +196,14 @@
         public abstract Builder<T> setPropertyId(int propertyId);
 
         /**
+         * Sets the fan direction values grouped per car zone for the
+         * {@link CarPropertyProfile}.
+         */
+        @NonNull
+        public abstract Builder<T> setHvacFanDirection(@Nullable Map<Set<CarZone>,
+                Set<@HvacFanDirection Integer>> hvacFanDirection);
+
+        /**
          * Sets a status code for the {@link CarPropertyProfile}.
          */
         @NonNull
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneAreaIdConstants.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneAreaIdConstants.java
index 8f7deb1..601c680 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneAreaIdConstants.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneAreaIdConstants.java
@@ -16,7 +16,10 @@
 
 package androidx.car.app.hardware.common;
 
+import androidx.car.app.annotations.ExperimentalCarApi;
+
 /** Car Zone area mapping constants */
+@ExperimentalCarApi
 public final class CarZoneAreaIdConstants {
 
     /** Area Id for global (non-zoned) properties */
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneAreaIdConverter.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneAreaIdConverter.java
index df95abf..454b9e1 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneAreaIdConverter.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneAreaIdConverter.java
@@ -17,10 +17,12 @@
 package androidx.car.app.hardware.common;
 
 import androidx.annotation.NonNull;
+import androidx.car.app.annotations.ExperimentalCarApi;
 
 import com.google.common.collect.ImmutableSet;
 
 /** Interface for zone to area mapping functionality */
+@ExperimentalCarApi
 public interface CarZoneAreaIdConverter {
     /** Converts {@code areaId} into a list of Car zones. */
     @NonNull
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneUtils.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneUtils.java
index 64bcec6..4d511fe 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneUtils.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneUtils.java
@@ -21,6 +21,7 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
+import androidx.car.app.annotations.ExperimentalCarApi;
 
 import com.google.common.collect.ImmutableSet;
 
@@ -28,6 +29,7 @@
 import java.lang.annotation.RetentionPolicy;
 
 /** Car zone utility methods. */
+@ExperimentalCarApi
 public final class CarZoneUtils {
 
     /**
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/GlobalCarZoneAreaIdConverter.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/GlobalCarZoneAreaIdConverter.java
index 861c340..fc451c8 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/GlobalCarZoneAreaIdConverter.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/GlobalCarZoneAreaIdConverter.java
@@ -17,10 +17,12 @@
 package androidx.car.app.hardware.common;
 
 import androidx.annotation.NonNull;
+import androidx.car.app.annotations.ExperimentalCarApi;
 
 import com.google.common.collect.ImmutableSet;
 
 /** CarZone to areaId converter for Global zones. */
+@ExperimentalCarApi
 public class GlobalCarZoneAreaIdConverter implements CarZoneAreaIdConverter {
     @NonNull
     @Override
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyRequestProcessor.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyRequestProcessor.java
index 78fb4fa..aa1cbd7 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyRequestProcessor.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyRequestProcessor.java
@@ -18,6 +18,8 @@
 
 import static android.car.VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL;
 import static android.car.VehicleAreaType.VEHICLE_AREA_TYPE_SEAT;
+import static android.car.VehiclePropertyIds.HVAC_FAN_DIRECTION;
+import static android.car.VehiclePropertyIds.HVAC_FAN_DIRECTION_AVAILABLE;
 import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_SET;
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY;
@@ -30,18 +32,22 @@
 import android.car.hardware.property.CarPropertyManager;
 import android.content.Context;
 import android.util.ArraySet;
+import android.util.Log;
 import android.util.Pair;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
+import androidx.car.app.utils.LogTags;
 
 import com.google.common.collect.ImmutableList;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import javax.annotation.Nullable;
 
@@ -177,12 +183,44 @@
                         || (propertyConfig.getAreaType() != VEHICLE_AREA_TYPE_GLOBAL
                         && propertyConfig.getAreaType() != VEHICLE_AREA_TYPE_SEAT)) {
                     errors.add(CarInternalError.create(propertyId, CarValue.STATUS_UNIMPLEMENTED));
+                } else if (propertyId == HVAC_FAN_DIRECTION) {
+                    CarPropertyConfig<?> fanDirectionPropertyConfig = getPropertyConfig(
+                            HVAC_FAN_DIRECTION_AVAILABLE);
+                    if (fanDirectionPropertyConfig == null) {
+                        Log.e(LogTags.TAG_CAR_HARDWARE, "Failed to fetch fan direction"
+                                + " config.");
+                        errors.add(CarInternalError.create(HVAC_FAN_DIRECTION_AVAILABLE,
+                                CarValue.STATUS_UNIMPLEMENTED));
+                        continue;
+                    }
+                    if (fanDirectionPropertyConfig.getAreaType() != VEHICLE_AREA_TYPE_SEAT) {
+                        Log.e(LogTags.TAG_CAR_HARDWARE,
+                                "Invalid area type for fan direction.");
+                        errors.add(CarInternalError.create(HVAC_FAN_DIRECTION_AVAILABLE,
+                                CarValue.STATUS_UNIMPLEMENTED));
+                        continue;
+                    }
+                    Map<Set<CarZone>, Set<Integer>> fanDirectionValues = new HashMap<>();
+                    for (int areaId : fanDirectionPropertyConfig.getAreaIds()) {
+                        CarPropertyValue<Integer[]> hvacFanDirectionAvailableValue =
+                                mCarPropertyManager.getProperty(
+                                        HVAC_FAN_DIRECTION_AVAILABLE, areaId);
+                        Integer[] fanDirectionsAvailable =
+                                (Integer[]) hvacFanDirectionAvailableValue.getValue();
+                        fanDirectionValues.put(convertAreaIdToCarZones(CarZoneUtils.AreaType.SEAT,
+                                areaId), Arrays.stream(fanDirectionsAvailable)
+                                .collect(Collectors.toSet()));
+                    }
+                    carPropertyProfile.add(CarPropertyProfile.builder()
+                            .setPropertyId(propertyId)
+                            .setStatus(STATUS_SUCCESS)
+                            .setHvacFanDirection(fanDirectionValues).build());
                 } else {
                     int areaType = propertyConfig.getAreaType() == VEHICLE_AREA_TYPE_SEAT
                             ? CarZoneUtils.AreaType.SEAT : CarZoneUtils.AreaType.NONE;
                     Map<Set<CarZone>, Pair<Object, Object>> minMaxRange = new HashMap<>();
                     List<Set<CarZone>> carZones = new ArrayList<>();
-                    for (Integer areaId : propertyConfig.getAreaIds()) {
+                    for (int areaId : propertyConfig.getAreaIds()) {
                         if (propertyConfig.getMinValue(areaId) != null
                                 && propertyConfig.getMaxValue(areaId) != null) {
                             minMaxRange.put(convertAreaIdToCarZones(areaType,
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/SeatCarZoneAreaIdConverter.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/SeatCarZoneAreaIdConverter.java
index 294e51e..02f83dd 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/SeatCarZoneAreaIdConverter.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/SeatCarZoneAreaIdConverter.java
@@ -24,10 +24,12 @@
 import static androidx.car.app.hardware.common.CarZone.CAR_ZONE_ROW_THIRD;
 
 import androidx.annotation.NonNull;
+import androidx.car.app.annotations.ExperimentalCarApi;
 
 import com.google.common.collect.ImmutableSet;
 
 /** CarZone to areaId converter for Seat */
+@ExperimentalCarApi
 public class SeatCarZoneAreaIdConverter implements CarZoneAreaIdConverter {
 
     public SeatCarZoneAreaIdConverter() {}
diff --git a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/climate/AutomotiveCarClimateTest.java b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/climate/AutomotiveCarClimateTest.java
index a011014..eb913ae 100644
--- a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/climate/AutomotiveCarClimateTest.java
+++ b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/climate/AutomotiveCarClimateTest.java
@@ -443,14 +443,14 @@
 
     @Test
     public void fetchFanDirection_verifyResponse() throws InterruptedException {
-        Map<Set<CarZone>, Pair<Object, Object>> minMaxValueMap = new HashMap<>();
-        minMaxValueMap.put(Collections.singleton(FRONT_LEFT_ZONE), new Pair<>(1, 7));
-        minMaxValueMap.put(Collections.singleton(FRONT_RIGHT_ZONE), new Pair<>(2, 6));
+        Map<Set<CarZone>, Set<Integer>> fanDirectionValues = new HashMap<>();
+        fanDirectionValues.put(Collections.singleton(FRONT_LEFT_ZONE), Collections.singleton(1));
+        fanDirectionValues.put(Collections.singleton(FRONT_RIGHT_ZONE), Collections.singleton(6));
         List<Set<CarZone>> carZones = new ArrayList<>();
         carZones.add(Collections.singleton(FRONT_LEFT_ZONE));
         carZones.add(Collections.singleton(FRONT_RIGHT_ZONE));
         mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_FAN_DIRECTION)
-                .setCarZones(carZones).setCarZoneSetsToMinMaxRange(minMaxValueMap)
+                .setCarZones(carZones).setHvacFanDirection(fanDirectionValues)
                 .setStatus(STATUS_SUCCESS).build());
         ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
                 Futures.immediateFuture(mCarPropertyProfiles);
@@ -485,7 +485,7 @@
         mCountDownLatch.await();
 
         assertThat(loadedResult.get().getCarZoneSetsToFanDirectionValues()).isEqualTo(
-                minMaxValueMap);
+                fanDirectionValues);
     }
 
     @Test
diff --git a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/MockedCarTestBase.java b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/MockedCarTestBase.java
index 04cafe8..9b2f0da 100644
--- a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/MockedCarTestBase.java
+++ b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/MockedCarTestBase.java
@@ -74,6 +74,11 @@
                     Pair<Integer, Integer>>builder()
             .put(CAR_ZONES.get(0), new Pair<>(MIN_PROPERTY_VALUE,
                     MAX_PROPERTY_VALUE)).buildKeepingLast();
+    public static final ImmutableMap<Set<CarZone>, Set<Integer>>
+            CAR_ZONE_SET_TO_FAN_DIRECTION_VALUES = ImmutableMap.<Set<CarZone>,
+                    Set<Integer>>builder()
+            .put(CAR_ZONES.get(0), Set.of(1, 2)).buildKeepingLast();
+    public static final Integer[] FAN_DIRECTION_VALUE = {1, 2};
 
     @Mock
     private CarPropertyValue<Integer> mModelYearValueMock;
@@ -98,6 +103,14 @@
     @Mock
     private CarPropertyConfig<Integer> mCabinTempConfigMock;
     @Mock
+    private CarPropertyConfig<Integer> mHvacFanDirectionConfigMock;
+    @Mock
+    private CarPropertyProfile<Integer> mHvacFanDirectionProfileMock;
+    @Mock
+    private CarPropertyConfig<Integer[]> mHvacFanDirectionAvailableConfigMock;
+    @Mock
+    private CarPropertyValue<Integer[]> mHvacFanDirectionAvailableValueMock;
+    @Mock
     private Car mCarMock;
     @Mock
     private CarPropertyManager mCarPropertyManagerMock;
@@ -130,6 +143,15 @@
         doReturn(Collections.singletonList(mCabinTempConfigMock))
                 .when(mCarPropertyManagerMock).getPropertyList(
                         argThat((set) -> set.contains(VehiclePropertyIds.HVAC_TEMPERATURE_SET)));
+        doReturn(Collections.singletonList(mHvacFanDirectionConfigMock))
+                .when(mCarPropertyManagerMock).getPropertyList(
+                        argThat((set) -> set.contains(VehiclePropertyIds.HVAC_FAN_DIRECTION)));
+        doReturn(Collections.singletonList(mHvacFanDirectionAvailableConfigMock))
+                .when(mCarPropertyManagerMock).getPropertyList(
+                        argThat((set) -> set.contains(
+                                VehiclePropertyIds.HVAC_FAN_DIRECTION_AVAILABLE)));
+        doReturn(mHvacFanDirectionAvailableValueMock).when(mCarPropertyManagerMock).getProperty(
+                eq(VehiclePropertyIds.HVAC_FAN_DIRECTION_AVAILABLE), anyInt());
 
         // Sets up property configs
         when(mModelYearConfigMock.getPropertyType()).thenReturn(Integer.class);
@@ -145,6 +167,9 @@
                 Arrays.asList(160, 280, 5, 605, 855, 10));
         when(mHvacPowerOnMinMaxConfigMock.getMinValue(AREA_IDS[0])).thenReturn(MIN_PROPERTY_VALUE);
         when(mHvacPowerOnMinMaxConfigMock.getMaxValue(AREA_IDS[0])).thenReturn(MAX_PROPERTY_VALUE);
+        when(mHvacFanDirectionAvailableConfigMock.getPropertyType()).thenReturn(Integer[].class);
+        when(mHvacFanDirectionAvailableConfigMock.getAreaType()).thenReturn(VEHICLE_AREA_TYPE_SEAT);
+        when(mHvacFanDirectionAvailableConfigMock.getAreaIds()).thenReturn(AREA_IDS);
 
         // Sets up property values
         when(mModelYearValueMock.getPropertyId()).thenReturn(VehiclePropertyIds.INFO_MODEL_YEAR);
@@ -165,6 +190,11 @@
                 .thenReturn(CAR_ZONE_SET_TO_MIN_MAX_RANGE);
         when(mCabinTempConfigMock.getPropertyId())
                 .thenReturn(VehiclePropertyIds.HVAC_TEMPERATURE_SET);
+        when(mHvacFanDirectionProfileMock.getPropertyId()).thenReturn(
+                VehiclePropertyIds.HVAC_FAN_DIRECTION);
+        when(mHvacFanDirectionProfileMock.getHvacFanDirection())
+                .thenReturn(CAR_ZONE_SET_TO_FAN_DIRECTION_VALUES);
+        when(mHvacFanDirectionAvailableValueMock.getValue()).thenReturn(FAN_DIRECTION_VALUE);
 
         // Adds fuel_door config and value for testing permission
         doReturn(mFuelDoorConfigMock).when(mCarPropertyManagerMock)
diff --git a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/PropertyRequestProcessorTest.java b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/PropertyRequestProcessorTest.java
index 082f109..94253fa 100644
--- a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/PropertyRequestProcessorTest.java
+++ b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/PropertyRequestProcessorTest.java
@@ -16,6 +16,7 @@
 
 package androidx.car.app.hardware.common;
 
+import static android.car.VehiclePropertyIds.HVAC_FAN_DIRECTION;
 import static android.car.VehiclePropertyIds.HVAC_POWER_ON;
 import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_SET;
 
@@ -131,10 +132,6 @@
     public void fetchCarPropertyCabinTemperatureProfilesTest() throws Exception {
         TestPropertyProfileListener listener = new TestPropertyProfileListener();
         List<Integer> propertyIds = new ArrayList<>();
-        ImmutableList<Set<CarZone>> carZones =
-                ImmutableList.<Set<CarZone>>builder().add(Collections.singleton(
-                        new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
-                                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build())).build();
 
         propertyIds.add(HVAC_TEMPERATURE_SET);
         mRequestProcessor.fetchCarPropertyProfiles(propertyIds, listener);
@@ -155,6 +152,27 @@
                 .isEqualTo(1f);
     }
 
+    /**
+     * Tests for
+     * {@link PropertyRequestProcessor#fetchCarPropertyProfiles(
+     * List, OnGetCarPropertyProfilesListener)} for HVAC_FAN_DIRECTION property.
+     */
+    @Test
+    public void fetchCarPropertyFanDirectionProfilesTest() throws Exception {
+        TestPropertyProfileListener listener = new TestPropertyProfileListener();
+        List<Integer> propertyIds = new ArrayList<>();
+
+        propertyIds.add(HVAC_FAN_DIRECTION);
+        mRequestProcessor.fetchCarPropertyProfiles(propertyIds, listener);
+        listener.assertOnGetCarPropertyProfilesCalled();
+        List<CarPropertyProfile<?>> carPropertyProfiles = listener.getCarPropertyProfiles();
+
+        assertThat(carPropertyProfiles.size()).isEqualTo(1);
+        assertThat(carPropertyProfiles.get(0).getPropertyId()).isEqualTo(HVAC_FAN_DIRECTION);
+        assertThat(carPropertyProfiles.get(0).getHvacFanDirection())
+                .isEqualTo(CAR_ZONE_SET_TO_FAN_DIRECTION_VALUES);
+    }
+
     private static class TestListener implements PropertyRequestProcessor.OnGetPropertiesListener {
         private final CountDownLatch mCountDownLatch = new CountDownLatch(1);
         private List<CarPropertyValue<?>> mCarPropertyValues = new ArrayList<>();
diff --git a/car/app/app-projected/api/1.3.0-beta01.txt b/car/app/app-projected/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/car/app/app-projected/api/1.3.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/car/app/app-projected/api/public_plus_experimental_1.3.0-beta01.txt b/car/app/app-projected/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/car/app/app-projected/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/car/app/app-projected/api/res-1.3.0-beta01.txt b/car/app/app-projected/api/res-1.3.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/car/app/app-projected/api/res-1.3.0-beta01.txt
diff --git a/car/app/app-projected/api/restricted_1.3.0-beta01.txt b/car/app/app-projected/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/car/app/app-projected/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/car/app/app-testing/api/1.3.0-beta01.txt b/car/app/app-testing/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..d148064
--- /dev/null
+++ b/car/app/app-testing/api/1.3.0-beta01.txt
@@ -0,0 +1,65 @@
+// Signature format: 4.0
+package androidx.car.app.testing {
+
+  public class FakeHost {
+    method public void performNotificationActionClick(android.app.PendingIntent);
+  }
+
+  public class ScreenController {
+    ctor public ScreenController(androidx.car.app.Screen);
+    method public androidx.car.app.Screen getScreen();
+    method public Object? getScreenResult();
+    method public java.util.List<androidx.car.app.model.Template!> getTemplatesReturned();
+    method public androidx.car.app.testing.ScreenController moveToState(androidx.lifecycle.Lifecycle.State);
+    method public void reset();
+  }
+
+  public class SessionController {
+    ctor public SessionController(androidx.car.app.Session, androidx.car.app.testing.TestCarContext, android.content.Intent);
+    method public androidx.car.app.Session getSession();
+    method public androidx.car.app.testing.SessionController moveToState(androidx.lifecycle.Lifecycle.State);
+  }
+
+  public class TestAppManager extends androidx.car.app.AppManager {
+    method public androidx.car.app.SurfaceCallback? getSurfaceCallback();
+    method public java.util.List<android.util.Pair<androidx.car.app.Screen!,androidx.car.app.model.Template!>!> getTemplatesReturned();
+    method public java.util.List<java.lang.CharSequence!> getToastsShown();
+    method public void reset();
+  }
+
+  public class TestCarContext extends androidx.car.app.CarContext {
+    method public static androidx.car.app.testing.TestCarContext createCarContext(android.content.Context);
+    method public androidx.car.app.testing.FakeHost getFakeHost();
+    method public androidx.car.app.testing.TestCarContext.PermissionRequestInfo? getLastPermissionRequestInfo();
+    method public java.util.List<android.content.Intent!> getStartCarAppIntents();
+    method public boolean hasCalledFinishCarApp();
+    method public void reset();
+  }
+
+  public static class TestCarContext.PermissionRequestInfo {
+    method public androidx.car.app.OnRequestPermissionsListener getListener();
+    method public java.util.List<java.lang.String!> getPermissionsRequested();
+  }
+
+  public class TestScreenManager extends androidx.car.app.ScreenManager {
+    method public java.util.List<androidx.car.app.Screen!> getScreensPushed();
+    method public java.util.List<androidx.car.app.Screen!> getScreensRemoved();
+    method public boolean hasScreens();
+    method public void reset();
+  }
+
+}
+
+package androidx.car.app.testing.navigation {
+
+  public class TestNavigationManager extends androidx.car.app.navigation.NavigationManager {
+    ctor public TestNavigationManager(androidx.car.app.testing.TestCarContext, androidx.car.app.HostDispatcher);
+    method public int getNavigationEndedCount();
+    method public androidx.car.app.navigation.NavigationManagerCallback? getNavigationManagerCallback();
+    method public int getNavigationStartedCount();
+    method public java.util.List<androidx.car.app.navigation.model.Trip!> getTripsSent();
+    method public void reset();
+  }
+
+}
+
diff --git a/car/app/app-testing/api/public_plus_experimental_1.3.0-beta01.txt b/car/app/app-testing/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..06cdd5f
--- /dev/null
+++ b/car/app/app-testing/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,66 @@
+// Signature format: 4.0
+package androidx.car.app.testing {
+
+  public class FakeHost {
+    method public void performNotificationActionClick(android.app.PendingIntent);
+    method @androidx.car.app.annotations.ExperimentalCarApi public void setMicrophoneInputData(java.io.InputStream);
+  }
+
+  public class ScreenController {
+    ctor public ScreenController(androidx.car.app.Screen);
+    method public androidx.car.app.Screen getScreen();
+    method public Object? getScreenResult();
+    method public java.util.List<androidx.car.app.model.Template!> getTemplatesReturned();
+    method public androidx.car.app.testing.ScreenController moveToState(androidx.lifecycle.Lifecycle.State);
+    method public void reset();
+  }
+
+  public class SessionController {
+    ctor public SessionController(androidx.car.app.Session, androidx.car.app.testing.TestCarContext, android.content.Intent);
+    method public androidx.car.app.Session getSession();
+    method public androidx.car.app.testing.SessionController moveToState(androidx.lifecycle.Lifecycle.State);
+  }
+
+  public class TestAppManager extends androidx.car.app.AppManager {
+    method public androidx.car.app.SurfaceCallback? getSurfaceCallback();
+    method public java.util.List<android.util.Pair<androidx.car.app.Screen!,androidx.car.app.model.Template!>!> getTemplatesReturned();
+    method public java.util.List<java.lang.CharSequence!> getToastsShown();
+    method public void reset();
+  }
+
+  public class TestCarContext extends androidx.car.app.CarContext {
+    method public static androidx.car.app.testing.TestCarContext createCarContext(android.content.Context);
+    method public androidx.car.app.testing.FakeHost getFakeHost();
+    method public androidx.car.app.testing.TestCarContext.PermissionRequestInfo? getLastPermissionRequestInfo();
+    method public java.util.List<android.content.Intent!> getStartCarAppIntents();
+    method public boolean hasCalledFinishCarApp();
+    method public void reset();
+  }
+
+  public static class TestCarContext.PermissionRequestInfo {
+    method public androidx.car.app.OnRequestPermissionsListener getListener();
+    method public java.util.List<java.lang.String!> getPermissionsRequested();
+  }
+
+  public class TestScreenManager extends androidx.car.app.ScreenManager {
+    method public java.util.List<androidx.car.app.Screen!> getScreensPushed();
+    method public java.util.List<androidx.car.app.Screen!> getScreensRemoved();
+    method public boolean hasScreens();
+    method public void reset();
+  }
+
+}
+
+package androidx.car.app.testing.navigation {
+
+  public class TestNavigationManager extends androidx.car.app.navigation.NavigationManager {
+    ctor public TestNavigationManager(androidx.car.app.testing.TestCarContext, androidx.car.app.HostDispatcher);
+    method public int getNavigationEndedCount();
+    method public androidx.car.app.navigation.NavigationManagerCallback? getNavigationManagerCallback();
+    method public int getNavigationStartedCount();
+    method public java.util.List<androidx.car.app.navigation.model.Trip!> getTripsSent();
+    method public void reset();
+  }
+
+}
+
diff --git a/car/app/app-testing/api/res-1.3.0-beta01.txt b/car/app/app-testing/api/res-1.3.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/car/app/app-testing/api/res-1.3.0-beta01.txt
diff --git a/car/app/app-testing/api/restricted_1.3.0-beta01.txt b/car/app/app-testing/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..d148064
--- /dev/null
+++ b/car/app/app-testing/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,65 @@
+// Signature format: 4.0
+package androidx.car.app.testing {
+
+  public class FakeHost {
+    method public void performNotificationActionClick(android.app.PendingIntent);
+  }
+
+  public class ScreenController {
+    ctor public ScreenController(androidx.car.app.Screen);
+    method public androidx.car.app.Screen getScreen();
+    method public Object? getScreenResult();
+    method public java.util.List<androidx.car.app.model.Template!> getTemplatesReturned();
+    method public androidx.car.app.testing.ScreenController moveToState(androidx.lifecycle.Lifecycle.State);
+    method public void reset();
+  }
+
+  public class SessionController {
+    ctor public SessionController(androidx.car.app.Session, androidx.car.app.testing.TestCarContext, android.content.Intent);
+    method public androidx.car.app.Session getSession();
+    method public androidx.car.app.testing.SessionController moveToState(androidx.lifecycle.Lifecycle.State);
+  }
+
+  public class TestAppManager extends androidx.car.app.AppManager {
+    method public androidx.car.app.SurfaceCallback? getSurfaceCallback();
+    method public java.util.List<android.util.Pair<androidx.car.app.Screen!,androidx.car.app.model.Template!>!> getTemplatesReturned();
+    method public java.util.List<java.lang.CharSequence!> getToastsShown();
+    method public void reset();
+  }
+
+  public class TestCarContext extends androidx.car.app.CarContext {
+    method public static androidx.car.app.testing.TestCarContext createCarContext(android.content.Context);
+    method public androidx.car.app.testing.FakeHost getFakeHost();
+    method public androidx.car.app.testing.TestCarContext.PermissionRequestInfo? getLastPermissionRequestInfo();
+    method public java.util.List<android.content.Intent!> getStartCarAppIntents();
+    method public boolean hasCalledFinishCarApp();
+    method public void reset();
+  }
+
+  public static class TestCarContext.PermissionRequestInfo {
+    method public androidx.car.app.OnRequestPermissionsListener getListener();
+    method public java.util.List<java.lang.String!> getPermissionsRequested();
+  }
+
+  public class TestScreenManager extends androidx.car.app.ScreenManager {
+    method public java.util.List<androidx.car.app.Screen!> getScreensPushed();
+    method public java.util.List<androidx.car.app.Screen!> getScreensRemoved();
+    method public boolean hasScreens();
+    method public void reset();
+  }
+
+}
+
+package androidx.car.app.testing.navigation {
+
+  public class TestNavigationManager extends androidx.car.app.navigation.NavigationManager {
+    ctor public TestNavigationManager(androidx.car.app.testing.TestCarContext, androidx.car.app.HostDispatcher);
+    method public int getNavigationEndedCount();
+    method public androidx.car.app.navigation.NavigationManagerCallback? getNavigationManagerCallback();
+    method public int getNavigationStartedCount();
+    method public java.util.List<androidx.car.app.navigation.model.Trip!> getTripsSent();
+    method public void reset();
+  }
+
+}
+
diff --git a/car/app/app/api/1.3.0-beta01.txt b/car/app/app/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..306320a
--- /dev/null
+++ b/car/app/app/api/1.3.0-beta01.txt
@@ -0,0 +1,1645 @@
+// Signature format: 4.0
+package androidx.car.app {
+
+  @androidx.car.app.annotations.CarProtocol public final class AppInfo {
+    ctor @VisibleForTesting public AppInfo(int, int, String);
+    method public int getLatestCarAppApiLevel();
+    method public String getLibraryDisplayVersion();
+    method public int getMinCarAppApiLevel();
+    field public static final String MIN_API_LEVEL_METADATA_KEY = "androidx.car.app.minCarApiLevel";
+  }
+
+  public class AppManager implements androidx.car.app.managers.Manager {
+    method @androidx.car.app.annotations.RequiresCarApi(5) public void dismissAlert(int);
+    method public void invalidate();
+    method public void setSurfaceCallback(androidx.car.app.SurfaceCallback?);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public void showAlert(androidx.car.app.model.Alert);
+    method public void showToast(CharSequence, int);
+  }
+
+  public final class CarAppPermission {
+    method public static void checkHasLibraryPermission(android.content.Context, String);
+    method public static void checkHasPermission(android.content.Context, String);
+    field public static final String ACCESS_SURFACE = "androidx.car.app.ACCESS_SURFACE";
+    field public static final String MAP_TEMPLATES = "androidx.car.app.MAP_TEMPLATES";
+    field public static final String NAVIGATION_TEMPLATES = "androidx.car.app.NAVIGATION_TEMPLATES";
+  }
+
+  public abstract class CarAppService extends android.app.Service {
+    ctor public CarAppService();
+    method public abstract androidx.car.app.validation.HostValidator createHostValidator();
+    method @CallSuper public final void dump(java.io.FileDescriptor, java.io.PrintWriter, String![]?);
+    method @Deprecated public final androidx.car.app.Session? getCurrentSession();
+    method public final androidx.car.app.HostInfo? getHostInfo();
+    method public final androidx.car.app.Session? getSession(androidx.car.app.SessionInfo);
+    method @CallSuper public final android.os.IBinder onBind(android.content.Intent);
+    method public androidx.car.app.Session onCreateSession();
+    method @androidx.car.app.annotations.RequiresCarApi(6) public androidx.car.app.Session onCreateSession(androidx.car.app.SessionInfo);
+    method public final boolean onUnbind(android.content.Intent);
+    field @Deprecated public static final String CATEGORY_CHARGING_APP = "androidx.car.app.category.CHARGING";
+    field @androidx.car.app.annotations.RequiresCarApi(6) public static final String CATEGORY_FEATURE_CLUSTER = "androidx.car.app.category.FEATURE_CLUSTER";
+    field public static final String CATEGORY_NAVIGATION_APP = "androidx.car.app.category.NAVIGATION";
+    field @Deprecated public static final String CATEGORY_PARKING_APP = "androidx.car.app.category.PARKING";
+    field public static final String CATEGORY_POI_APP = "androidx.car.app.category.POI";
+    field public static final String SERVICE_INTERFACE = "androidx.car.app.CarAppService";
+  }
+
+  public class CarContext extends android.content.ContextWrapper {
+    method public void finishCarApp();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public android.content.ComponentName? getCallingComponent();
+    method public int getCarAppApiLevel();
+    method public Object getCarService(String);
+    method public <T> T getCarService(Class<T!>);
+    method public String getCarServiceName(Class<?>);
+    method public androidx.car.app.HostInfo? getHostInfo();
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public boolean isDarkMode();
+    method public void requestPermissions(java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsListener);
+    method public void requestPermissions(java.util.List<java.lang.String!>, java.util.concurrent.Executor, androidx.car.app.OnRequestPermissionsListener);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public void setCarAppResult(int, android.content.Intent?);
+    method public void startCarApp(android.content.Intent);
+    method @Deprecated public static void startCarApp(android.content.Intent, android.content.Intent);
+    field public static final String ACTION_NAVIGATE = "androidx.car.app.action.NAVIGATE";
+    field public static final String APP_SERVICE = "app";
+    field public static final String CAR_SERVICE = "car";
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final String CONSTRAINT_SERVICE = "constraints";
+    field public static final String EXTRA_START_CAR_APP_BINDER_KEY = "androidx.car.app.extra.START_CAR_APP_BINDER_KEY";
+    field @androidx.car.app.annotations.RequiresCarApi(3) public static final String HARDWARE_SERVICE = "hardware";
+    field public static final String NAVIGATION_SERVICE = "navigation";
+    field public static final String SCREEN_SERVICE = "screen";
+    field public static final String SUGGESTION_SERVICE = "suggestion";
+  }
+
+  public final class CarToast {
+    method public static androidx.car.app.CarToast makeText(androidx.car.app.CarContext, @StringRes int, int);
+    method public static androidx.car.app.CarToast makeText(androidx.car.app.CarContext, CharSequence, int);
+    method public void setDuration(int);
+    method public void setText(@StringRes int);
+    method public void setText(CharSequence);
+    method public void show();
+    field public static final int LENGTH_LONG = 1; // 0x1
+    field public static final int LENGTH_SHORT = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class FailureResponse {
+    ctor public FailureResponse(Throwable);
+    method public int getErrorType();
+    method public String getStackTrace();
+    field public static final int BUNDLER_EXCEPTION = 1; // 0x1
+    field public static final int ILLEGAL_STATE_EXCEPTION = 2; // 0x2
+    field public static final int INVALID_PARAMETER_EXCEPTION = 3; // 0x3
+    field public static final int REMOTE_EXCEPTION = 6; // 0x6
+    field public static final int RUNTIME_EXCEPTION = 5; // 0x5
+    field public static final int SECURITY_EXCEPTION = 4; // 0x4
+    field public static final int UNKNOWN_ERROR = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class HandshakeInfo {
+    ctor public HandshakeInfo(String, int);
+    method public int getHostCarAppApiLevel();
+    method public String getHostPackageName();
+  }
+
+  public final class HostException extends java.lang.RuntimeException {
+    ctor public HostException(String);
+    ctor public HostException(String, Throwable);
+    ctor public HostException(Throwable);
+  }
+
+  public final class HostInfo {
+    ctor public HostInfo(String, int);
+    method public String getPackageName();
+    method public int getUid();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnDoneCallback {
+    method public default void onFailure(androidx.car.app.serialization.Bundleable);
+    method public default void onSuccess(androidx.car.app.serialization.Bundleable?);
+  }
+
+  public interface OnRequestPermissionsListener {
+    method public void onRequestPermissionsResult(java.util.List<java.lang.String!>, java.util.List<java.lang.String!>);
+  }
+
+  public interface OnScreenResultListener {
+    method public void onScreenResult(Object?);
+  }
+
+  public abstract class Screen implements androidx.lifecycle.LifecycleOwner {
+    ctor protected Screen(androidx.car.app.CarContext);
+    method public final void finish();
+    method public final androidx.car.app.CarContext getCarContext();
+    method public final androidx.lifecycle.Lifecycle getLifecycle();
+    method public String? getMarker();
+    method public final androidx.car.app.ScreenManager getScreenManager();
+    method public final void invalidate();
+    method public abstract androidx.car.app.model.Template onGetTemplate();
+    method public void setMarker(String?);
+    method public void setResult(Object?);
+  }
+
+  @MainThread public class ScreenManager implements androidx.car.app.managers.Manager {
+    method public int getStackSize();
+    method public androidx.car.app.Screen getTop();
+    method public void pop();
+    method public void popTo(String);
+    method public void popToRoot();
+    method public void push(androidx.car.app.Screen);
+    method public void pushForResult(androidx.car.app.Screen, androidx.car.app.OnScreenResultListener);
+    method public void remove(androidx.car.app.Screen);
+  }
+
+  public abstract class Session implements androidx.lifecycle.LifecycleOwner {
+    ctor public Session();
+    method public final androidx.car.app.CarContext getCarContext();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public void onCarConfigurationChanged(android.content.res.Configuration);
+    method public abstract androidx.car.app.Screen onCreateScreen(android.content.Intent);
+    method public void onNewIntent(android.content.Intent);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(6) public class SessionInfo {
+    ctor public SessionInfo(int, String);
+    method public int getDisplayType();
+    method public String getSessionId();
+    method public java.util.Set<java.lang.Class<? extends androidx.car.app.model.Template>!>? getSupportedTemplates(int);
+    field public static final androidx.car.app.SessionInfo DEFAULT_SESSION_INFO;
+    field public static final int DISPLAY_TYPE_CLUSTER = 1; // 0x1
+    field public static final int DISPLAY_TYPE_MAIN = 0; // 0x0
+  }
+
+  public class SessionInfoIntentEncoder {
+    method public static boolean containsSessionInfo(android.content.Intent);
+    method public static androidx.car.app.SessionInfo decode(android.content.Intent);
+    method public static void encode(androidx.car.app.SessionInfo, android.content.Intent);
+  }
+
+  public interface SurfaceCallback {
+    method @androidx.car.app.annotations.RequiresCarApi(5) public default void onClick(float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onFling(float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScale(float, float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScroll(float, float);
+    method public default void onStableAreaChanged(android.graphics.Rect);
+    method public default void onSurfaceAvailable(androidx.car.app.SurfaceContainer);
+    method public default void onSurfaceDestroyed(androidx.car.app.SurfaceContainer);
+    method public default void onVisibleAreaChanged(android.graphics.Rect);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SurfaceContainer {
+    ctor public SurfaceContainer(android.view.Surface?, int, int, int);
+    method public int getDpi();
+    method public int getHeight();
+    method public android.view.Surface? getSurface();
+    method public int getWidth();
+  }
+
+}
+
+package androidx.car.app.annotations {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface CarProtocol {
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface RequiresCarApi {
+    method public abstract int value();
+  }
+
+}
+
+package androidx.car.app.connection {
+
+  public final class CarConnection {
+    ctor @MainThread public CarConnection(android.content.Context);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getType();
+    field public static final String ACTION_CAR_CONNECTION_UPDATED = "androidx.car.app.connection.action.CAR_CONNECTION_UPDATED";
+    field public static final String CAR_CONNECTION_STATE = "CarConnectionState";
+    field public static final int CONNECTION_TYPE_NATIVE = 1; // 0x1
+    field public static final int CONNECTION_TYPE_NOT_CONNECTED = 0; // 0x0
+    field public static final int CONNECTION_TYPE_PROJECTION = 2; // 0x2
+  }
+
+}
+
+package androidx.car.app.constraints {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public class ConstraintManager implements androidx.car.app.managers.Manager {
+    method public int getContentLimit(int);
+    field public static final int CONTENT_LIMIT_TYPE_GRID = 1; // 0x1
+    field public static final int CONTENT_LIMIT_TYPE_LIST = 0; // 0x0
+    field public static final int CONTENT_LIMIT_TYPE_PANE = 4; // 0x4
+    field public static final int CONTENT_LIMIT_TYPE_PLACE_LIST = 2; // 0x2
+    field public static final int CONTENT_LIMIT_TYPE_ROUTE_LIST = 3; // 0x3
+  }
+
+}
+
+package androidx.car.app.hardware {
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarHardwareManager extends androidx.car.app.managers.Manager {
+    method public default androidx.car.app.hardware.info.CarInfo getCarInfo();
+    method public default androidx.car.app.hardware.info.CarSensors getCarSensors();
+  }
+
+}
+
+package androidx.car.app.hardware.common {
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarUnit {
+    method public static String toString(int);
+    field public static final int KILOMETER = 3; // 0x3
+    field public static final int KILOMETERS_PER_HOUR = 102; // 0x66
+    field public static final int METER = 2; // 0x2
+    field public static final int METERS_PER_SEC = 101; // 0x65
+    field public static final int MILE = 4; // 0x4
+    field public static final int MILES_PER_HOUR = 103; // 0x67
+    field public static final int MILLIMETER = 1; // 0x1
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarValue<T> {
+    ctor public CarValue(T?, long, int);
+    method public int getStatus();
+    method public long getTimestampMillis();
+    method public T? getValue();
+    field public static final int STATUS_SUCCESS = 1; // 0x1
+    field public static final int STATUS_UNAVAILABLE = 3; // 0x3
+    field public static final int STATUS_UNIMPLEMENTED = 2; // 0x2
+    field public static final int STATUS_UNKNOWN = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public interface OnCarDataAvailableListener<T> {
+    method public void onCarDataAvailable(T);
+  }
+
+}
+
+package androidx.car.app.hardware.info {
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Accelerometer {
+    ctor public Accelerometer(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getForces();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarHardwareLocation {
+    ctor public CarHardwareLocation(androidx.car.app.hardware.common.CarValue<android.location.Location!>);
+    method public androidx.car.app.hardware.common.CarValue<android.location.Location!> getLocation();
+  }
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarInfo {
+    method public void addEnergyLevelListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyLevel!>);
+    method public void addMileageListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Mileage!>);
+    method public void addSpeedListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Speed!>);
+    method public void addTollListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.TollCard!>);
+    method public void fetchEnergyProfile(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyProfile!>);
+    method public void fetchModel(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Model!>);
+    method public void removeEnergyLevelListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyLevel!>);
+    method public void removeMileageListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Mileage!>);
+    method public void removeSpeedListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Speed!>);
+    method public void removeTollListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.TollCard!>);
+  }
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarSensors {
+    method public void addAccelerometerListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Accelerometer!>);
+    method public void addCarHardwareLocationListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.CarHardwareLocation!>);
+    method public void addCompassListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Compass!>);
+    method public void addGyroscopeListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Gyroscope!>);
+    method public void removeAccelerometerListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Accelerometer!>);
+    method public void removeCarHardwareLocationListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.CarHardwareLocation!>);
+    method public void removeCompassListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Compass!>);
+    method public void removeGyroscopeListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Gyroscope!>);
+    field public static final int UPDATE_RATE_FASTEST = 3; // 0x3
+    field public static final int UPDATE_RATE_NORMAL = 1; // 0x1
+    field public static final int UPDATE_RATE_UI = 2; // 0x2
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Compass {
+    ctor public Compass(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getOrientations();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyLevel {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getBatteryPercent();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Boolean!> getEnergyIsLow();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getFuelPercent();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getRangeRemainingMeters();
+  }
+
+  public static final class EnergyLevel.Builder {
+    ctor public EnergyLevel.Builder();
+    method public androidx.car.app.hardware.info.EnergyLevel build();
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setBatteryPercent(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setDistanceDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setEnergyIsLow(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setFuelPercent(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setRangeRemainingMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyProfile {
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!> getEvConnectorTypes();
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!> getFuelTypes();
+    field public static final int EVCONNECTOR_TYPE_CHADEMO = 3; // 0x3
+    field public static final int EVCONNECTOR_TYPE_COMBO_1 = 4; // 0x4
+    field public static final int EVCONNECTOR_TYPE_COMBO_2 = 5; // 0x5
+    field public static final int EVCONNECTOR_TYPE_GBT = 9; // 0x9
+    field public static final int EVCONNECTOR_TYPE_GBT_DC = 10; // 0xa
+    field public static final int EVCONNECTOR_TYPE_J1772 = 1; // 0x1
+    field public static final int EVCONNECTOR_TYPE_MENNEKES = 2; // 0x2
+    field public static final int EVCONNECTOR_TYPE_OTHER = 101; // 0x65
+    field public static final int EVCONNECTOR_TYPE_SCAME = 11; // 0xb
+    field public static final int EVCONNECTOR_TYPE_TESLA_HPWC = 7; // 0x7
+    field public static final int EVCONNECTOR_TYPE_TESLA_ROADSTER = 6; // 0x6
+    field public static final int EVCONNECTOR_TYPE_TESLA_SUPERCHARGER = 8; // 0x8
+    field public static final int EVCONNECTOR_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int FUEL_TYPE_BIODIESEL = 5; // 0x5
+    field public static final int FUEL_TYPE_CNG = 8; // 0x8
+    field public static final int FUEL_TYPE_DIESEL_1 = 3; // 0x3
+    field public static final int FUEL_TYPE_DIESEL_2 = 4; // 0x4
+    field public static final int FUEL_TYPE_E85 = 6; // 0x6
+    field public static final int FUEL_TYPE_ELECTRIC = 10; // 0xa
+    field public static final int FUEL_TYPE_HYDROGEN = 11; // 0xb
+    field public static final int FUEL_TYPE_LEADED = 2; // 0x2
+    field public static final int FUEL_TYPE_LNG = 9; // 0x9
+    field public static final int FUEL_TYPE_LPG = 7; // 0x7
+    field public static final int FUEL_TYPE_OTHER = 12; // 0xc
+    field public static final int FUEL_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int FUEL_TYPE_UNLEADED = 1; // 0x1
+  }
+
+  public static final class EnergyProfile.Builder {
+    ctor public EnergyProfile.Builder();
+    method public androidx.car.app.hardware.info.EnergyProfile build();
+    method public androidx.car.app.hardware.info.EnergyProfile.Builder setEvConnectorTypes(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!>);
+    method public androidx.car.app.hardware.info.EnergyProfile.Builder setFuelTypes(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Gyroscope {
+    ctor public Gyroscope(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getRotations();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Mileage {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getOdometerMeters();
+  }
+
+  public static final class Mileage.Builder {
+    ctor public Mileage.Builder();
+    method public androidx.car.app.hardware.info.Mileage build();
+    method public androidx.car.app.hardware.info.Mileage.Builder setDistanceDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public androidx.car.app.hardware.info.Mileage.Builder setOdometerMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Model {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.String!> getManufacturer();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.String!> getName();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getYear();
+  }
+
+  public static final class Model.Builder {
+    ctor public Model.Builder();
+    method public androidx.car.app.hardware.info.Model build();
+    method public androidx.car.app.hardware.info.Model.Builder setManufacturer(androidx.car.app.hardware.common.CarValue<java.lang.String!>);
+    method public androidx.car.app.hardware.info.Model.Builder setName(androidx.car.app.hardware.common.CarValue<java.lang.String!>);
+    method public androidx.car.app.hardware.info.Model.Builder setYear(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Speed {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getDisplaySpeedMetersPerSecond();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getRawSpeedMetersPerSecond();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getSpeedDisplayUnit();
+  }
+
+  public static final class Speed.Builder {
+    ctor public Speed.Builder();
+    method public androidx.car.app.hardware.info.Speed build();
+    method public androidx.car.app.hardware.info.Speed.Builder setDisplaySpeedMetersPerSecond(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.Speed.Builder setRawSpeedMetersPerSecond(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.Speed.Builder setSpeedDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class TollCard {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getCardState();
+    field public static final int TOLLCARD_STATE_INVALID = 2; // 0x2
+    field public static final int TOLLCARD_STATE_NOT_INSERTED = 3; // 0x3
+    field public static final int TOLLCARD_STATE_UNKNOWN = 0; // 0x0
+    field public static final int TOLLCARD_STATE_VALID = 1; // 0x1
+  }
+
+  public static final class TollCard.Builder {
+    ctor public TollCard.Builder();
+    method public androidx.car.app.hardware.info.TollCard build();
+    method public androidx.car.app.hardware.info.TollCard.Builder setCardState(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+}
+
+package androidx.car.app.managers {
+
+  public interface Manager {
+  }
+
+}
+
+package androidx.car.app.media {
+
+  @androidx.car.app.annotations.RequiresCarApi(5) public interface CarAudioCallback {
+    method public void onStopRecording();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public class CarAudioCallbackDelegate {
+    method public void onStopRecording();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(5) public abstract class CarAudioRecord {
+    method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public static androidx.car.app.media.CarAudioRecord create(androidx.car.app.CarContext);
+    method public int read(byte[], int, int);
+    method public void startRecording();
+    method public void stopRecording();
+    field public static final int AUDIO_CONTENT_BUFFER_SIZE = 512; // 0x200
+    field public static final String AUDIO_CONTENT_MIME = "audio/l16";
+    field public static final int AUDIO_CONTENT_SAMPLING_RATE = 16000; // 0x3e80
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class OpenMicrophoneRequest {
+    method public androidx.car.app.media.CarAudioCallbackDelegate getCarAudioCallbackDelegate();
+  }
+
+  public static final class OpenMicrophoneRequest.Builder {
+    ctor public OpenMicrophoneRequest.Builder(androidx.car.app.media.CarAudioCallback);
+    method public androidx.car.app.media.OpenMicrophoneRequest build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class OpenMicrophoneResponse {
+    method public androidx.car.app.media.CarAudioCallbackDelegate getCarAudioCallback();
+    method public java.io.InputStream getCarMicrophoneInputStream();
+  }
+
+  public static final class OpenMicrophoneResponse.Builder {
+    ctor public OpenMicrophoneResponse.Builder(androidx.car.app.media.CarAudioCallback);
+    method public androidx.car.app.media.OpenMicrophoneResponse build();
+    method public androidx.car.app.media.OpenMicrophoneResponse.Builder setCarMicrophoneDescriptor(android.os.ParcelFileDescriptor);
+  }
+
+}
+
+package androidx.car.app.model {
+
+  @androidx.car.app.annotations.CarProtocol public final class Action {
+    method public androidx.car.app.model.CarColor? getBackgroundColor();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public int getFlags();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public int getType();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public boolean isEnabled();
+    method public boolean isStandard();
+    method public static String typeToString(int);
+    field public static final androidx.car.app.model.Action APP_ICON;
+    field public static final androidx.car.app.model.Action BACK;
+    field @androidx.car.app.annotations.RequiresCarApi(5) public static final int FLAG_DEFAULT = 4; // 0x4
+    field @androidx.car.app.annotations.RequiresCarApi(5) public static final int FLAG_IS_PERSISTENT = 2; // 0x2
+    field @androidx.car.app.annotations.RequiresCarApi(4) public static final int FLAG_PRIMARY = 1; // 0x1
+    field public static final androidx.car.app.model.Action PAN;
+    field public static final int TYPE_APP_ICON = 65538; // 0x10002
+    field public static final int TYPE_BACK = 65539; // 0x10003
+    field public static final int TYPE_CUSTOM = 1; // 0x1
+    field public static final int TYPE_PAN = 65540; // 0x10004
+  }
+
+  public static final class Action.Builder {
+    ctor public Action.Builder();
+    ctor @androidx.car.app.annotations.RequiresCarApi(2) public Action.Builder(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Action build();
+    method public androidx.car.app.model.Action.Builder setBackgroundColor(androidx.car.app.model.CarColor);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Action.Builder setEnabled(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.Action.Builder setFlags(int);
+    method public androidx.car.app.model.Action.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Action.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.Action.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Action.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ActionStrip {
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.Action? getFirstActionOfType(int);
+  }
+
+  public static final class ActionStrip.Builder {
+    ctor public ActionStrip.Builder();
+    method public androidx.car.app.model.ActionStrip.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.ActionStrip build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class Alert {
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.AlertCallbackDelegate? getCallbackDelegate();
+    method public long getDurationMillis();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public int getId();
+    method public androidx.car.app.model.CarText? getSubtitle();
+    method public androidx.car.app.model.CarText getTitle();
+  }
+
+  public static final class Alert.Builder {
+    ctor public Alert.Builder(int, androidx.car.app.model.CarText, long);
+    method public androidx.car.app.model.Alert.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Alert build();
+    method public androidx.car.app.model.Alert.Builder setCallback(androidx.car.app.model.AlertCallback);
+    method public androidx.car.app.model.Alert.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Alert.Builder setSubtitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public interface AlertCallback {
+    method public void onCancel(int);
+    method public void onDismiss();
+    field public static final int REASON_NOT_SUPPORTED = 3; // 0x3
+    field public static final int REASON_TIMEOUT = 1; // 0x1
+    field public static final int REASON_USER_ACTION = 2; // 0x2
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public interface AlertCallbackDelegate {
+    method public void sendCancel(int, androidx.car.app.OnDoneCallback);
+    method public void sendDismiss(androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarColor {
+    method public static androidx.car.app.model.CarColor createCustom(@ColorInt int, @ColorInt int);
+    method @ColorInt public int getColor();
+    method @ColorInt public int getColorDark();
+    method public int getType();
+    field public static final androidx.car.app.model.CarColor BLUE;
+    field public static final androidx.car.app.model.CarColor DEFAULT;
+    field public static final androidx.car.app.model.CarColor GREEN;
+    field public static final androidx.car.app.model.CarColor PRIMARY;
+    field public static final androidx.car.app.model.CarColor RED;
+    field public static final androidx.car.app.model.CarColor SECONDARY;
+    field public static final int TYPE_BLUE = 6; // 0x6
+    field public static final int TYPE_CUSTOM = 0; // 0x0
+    field public static final int TYPE_DEFAULT = 1; // 0x1
+    field public static final int TYPE_GREEN = 5; // 0x5
+    field public static final int TYPE_PRIMARY = 2; // 0x2
+    field public static final int TYPE_RED = 4; // 0x4
+    field public static final int TYPE_SECONDARY = 3; // 0x3
+    field public static final int TYPE_YELLOW = 7; // 0x7
+    field public static final androidx.car.app.model.CarColor YELLOW;
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarIcon {
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public androidx.car.app.model.CarColor? getTint();
+    method public int getType();
+    field public static final androidx.car.app.model.CarIcon ALERT;
+    field public static final androidx.car.app.model.CarIcon APP_ICON;
+    field public static final androidx.car.app.model.CarIcon BACK;
+    field public static final androidx.car.app.model.CarIcon ERROR;
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final androidx.car.app.model.CarIcon PAN;
+    field public static final int TYPE_ALERT = 4; // 0x4
+    field public static final int TYPE_APP_ICON = 5; // 0x5
+    field public static final int TYPE_BACK = 3; // 0x3
+    field public static final int TYPE_CUSTOM = 1; // 0x1
+    field public static final int TYPE_ERROR = 6; // 0x6
+    field public static final int TYPE_PAN = 7; // 0x7
+  }
+
+  public static final class CarIcon.Builder {
+    ctor public CarIcon.Builder(androidx.core.graphics.drawable.IconCompat);
+    ctor public CarIcon.Builder(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.CarIcon build();
+    method public androidx.car.app.model.CarIcon.Builder setTint(androidx.car.app.model.CarColor);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarIconSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.CarIconSpan create(androidx.car.app.model.CarIcon);
+    method public static androidx.car.app.model.CarIconSpan create(androidx.car.app.model.CarIcon, int);
+    method public int getAlignment();
+    method public androidx.car.app.model.CarIcon getIcon();
+    field public static final int ALIGN_BASELINE = 1; // 0x1
+    field public static final int ALIGN_BOTTOM = 0; // 0x0
+    field public static final int ALIGN_CENTER = 2; // 0x2
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarLocation {
+    method public static androidx.car.app.model.CarLocation create(double, double);
+    method public static androidx.car.app.model.CarLocation create(android.location.Location);
+    method public double getLatitude();
+    method public double getLongitude();
+  }
+
+  @Keep @androidx.car.app.annotations.CarProtocol public class CarSpan extends android.text.style.CharacterStyle {
+    ctor public CarSpan();
+    method public void updateDrawState(android.text.TextPaint);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarText {
+    method public static androidx.car.app.model.CarText create(CharSequence);
+    method public java.util.List<java.lang.CharSequence!> getVariants();
+    method public boolean isEmpty();
+    method public static boolean isNullOrEmpty(androidx.car.app.model.CarText?);
+    method public CharSequence toCharSequence();
+  }
+
+  public static final class CarText.Builder {
+    ctor public CarText.Builder(CharSequence);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.CarText.Builder addVariant(CharSequence);
+    method public androidx.car.app.model.CarText build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public final class ClickableSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.ClickableSpan create(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.OnClickDelegate getOnClickDelegate();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DateTimeWithZone {
+    method public static androidx.car.app.model.DateTimeWithZone create(long, @IntRange(from=0xffff02e0, to=64800) int, String);
+    method public static androidx.car.app.model.DateTimeWithZone create(long, java.util.TimeZone);
+    method @RequiresApi(26) public static androidx.car.app.model.DateTimeWithZone create(java.time.ZonedDateTime);
+    method public long getTimeSinceEpochMillis();
+    method public int getZoneOffsetSeconds();
+    method public String? getZoneShortName();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Distance {
+    method public static androidx.car.app.model.Distance create(double, int);
+    method public double getDisplayDistance();
+    method public int getDisplayUnit();
+    field public static final int UNIT_FEET = 6; // 0x6
+    field public static final int UNIT_KILOMETERS = 2; // 0x2
+    field public static final int UNIT_KILOMETERS_P1 = 3; // 0x3
+    field public static final int UNIT_METERS = 1; // 0x1
+    field public static final int UNIT_MILES = 4; // 0x4
+    field public static final int UNIT_MILES_P1 = 5; // 0x5
+    field public static final int UNIT_YARDS = 7; // 0x7
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DistanceSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.DistanceSpan create(androidx.car.app.model.Distance);
+    method public androidx.car.app.model.Distance getDistance();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DurationSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.DurationSpan create(long);
+    method @RequiresApi(26) public static androidx.car.app.model.DurationSpan create(java.time.Duration);
+    method public long getDurationSeconds();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ForegroundCarColorSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.ForegroundCarColorSpan create(androidx.car.app.model.CarColor);
+    method public androidx.car.app.model.CarColor getColor();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class GridItem implements androidx.car.app.model.Item {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public int getImageType();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public androidx.car.app.model.CarText? getText();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+    field public static final int IMAGE_TYPE_ICON = 1; // 0x1
+    field public static final int IMAGE_TYPE_LARGE = 2; // 0x2
+  }
+
+  public static final class GridItem.Builder {
+    ctor public GridItem.Builder();
+    method public androidx.car.app.model.GridItem build();
+    method public androidx.car.app.model.GridItem.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.GridItem.Builder setImage(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.GridItem.Builder setLoading(boolean);
+    method public androidx.car.app.model.GridItem.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.GridItem.Builder setText(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setText(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.GridItem.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class GridTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getSingleList();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class GridTemplate.Builder {
+    ctor public GridTemplate.Builder();
+    method public androidx.car.app.model.GridTemplate build();
+    method public androidx.car.app.model.GridTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.GridTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.GridTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.GridTemplate.Builder setSingleList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.GridTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class Header {
+    method public java.util.List<androidx.car.app.model.Action!> getEndHeaderActions();
+    method public androidx.car.app.model.Action? getStartHeaderAction();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  public static final class Header.Builder {
+    ctor public Header.Builder();
+    method public androidx.car.app.model.Header.Builder addEndHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Header build();
+    method public androidx.car.app.model.Header.Builder setStartHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Header.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Header.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallback {
+    method public default void onInputSubmitted(String);
+    method public default void onInputTextChanged(String);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallbackDelegate {
+    method public void sendInputSubmitted(String, androidx.car.app.OnDoneCallback);
+    method public void sendInputTextChanged(String, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface Item {
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ItemList {
+    method public java.util.List<androidx.car.app.model.Item!> getItems();
+    method public androidx.car.app.model.CarText? getNoItemsMessage();
+    method public androidx.car.app.model.OnItemVisibilityChangedDelegate? getOnItemVisibilityChangedDelegate();
+    method public androidx.car.app.model.OnSelectedDelegate? getOnSelectedDelegate();
+    method public int getSelectedIndex();
+  }
+
+  public static final class ItemList.Builder {
+    ctor public ItemList.Builder();
+    method public androidx.car.app.model.ItemList.Builder addItem(androidx.car.app.model.Item);
+    method public androidx.car.app.model.ItemList build();
+    method public androidx.car.app.model.ItemList.Builder setNoItemsMessage(CharSequence);
+    method public androidx.car.app.model.ItemList.Builder setOnItemsVisibilityChangedListener(androidx.car.app.model.ItemList.OnItemVisibilityChangedListener);
+    method public androidx.car.app.model.ItemList.Builder setOnSelectedListener(androidx.car.app.model.ItemList.OnSelectedListener);
+    method public androidx.car.app.model.ItemList.Builder setSelectedIndex(@IntRange(from=0) int);
+  }
+
+  public static interface ItemList.OnItemVisibilityChangedListener {
+    method public void onItemVisibilityChanged(int, int);
+  }
+
+  public static interface ItemList.OnSelectedListener {
+    method public void onSelected(int);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ListTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public java.util.List<androidx.car.app.model.SectionedItemList!> getSectionedLists();
+    method public androidx.car.app.model.ItemList? getSingleList();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class ListTemplate.Builder {
+    ctor public ListTemplate.Builder();
+    method public androidx.car.app.model.ListTemplate.Builder addSectionedList(androidx.car.app.model.SectionedItemList);
+    method public androidx.car.app.model.ListTemplate build();
+    method public androidx.car.app.model.ListTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.ListTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.ListTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.ListTemplate.Builder setSingleList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.ListTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class LongMessageTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText getMessage();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class LongMessageTemplate.Builder {
+    ctor public LongMessageTemplate.Builder(CharSequence);
+    method public androidx.car.app.model.LongMessageTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate build();
+    method public androidx.car.app.model.LongMessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class MessageTemplate implements androidx.car.app.model.Template {
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.CarText? getDebugMessage();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public androidx.car.app.model.CarText getMessage();
+    method public androidx.car.app.model.CarText? getTitle();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public boolean isLoading();
+  }
+
+  public static final class MessageTemplate.Builder {
+    ctor public MessageTemplate.Builder(CharSequence);
+    ctor public MessageTemplate.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.MessageTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.MessageTemplate build();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(Throwable);
+    method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(String);
+    method public androidx.car.app.model.MessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.MessageTemplate.Builder setIcon(androidx.car.app.model.CarIcon);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.MessageTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Metadata {
+    method public androidx.car.app.model.Place? getPlace();
+    field public static final androidx.car.app.model.Metadata EMPTY_METADATA;
+  }
+
+  public static final class Metadata.Builder {
+    ctor public Metadata.Builder();
+    ctor public Metadata.Builder(androidx.car.app.model.Metadata);
+    method public androidx.car.app.model.Metadata build();
+    method public androidx.car.app.model.Metadata.Builder setPlace(androidx.car.app.model.Place);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnCheckedChangeDelegate {
+    method public void sendCheckedChange(boolean, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnClickDelegate {
+    method public boolean isParkedOnly();
+    method public void sendClick(androidx.car.app.OnDoneCallback);
+  }
+
+  public interface OnClickListener {
+    method public void onClick();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public interface OnContentRefreshDelegate {
+    method public void sendContentRefreshRequested(androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(5) public interface OnContentRefreshListener {
+    method public void onContentRefreshRequested();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnItemVisibilityChangedDelegate {
+    method public void sendItemVisibilityChanged(int, int, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnSelectedDelegate {
+    method public void sendSelected(int, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Pane {
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.CarIcon? getImage();
+    method public java.util.List<androidx.car.app.model.Row!> getRows();
+    method public boolean isLoading();
+  }
+
+  public static final class Pane.Builder {
+    ctor public Pane.Builder();
+    method public androidx.car.app.model.Pane.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Pane.Builder addRow(androidx.car.app.model.Row);
+    method public androidx.car.app.model.Pane build();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.Pane.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Pane.Builder setLoading(boolean);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PaneTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.Pane getPane();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  public static final class PaneTemplate.Builder {
+    ctor public PaneTemplate.Builder(androidx.car.app.model.Pane);
+    method public androidx.car.app.model.PaneTemplate build();
+    method public androidx.car.app.model.PaneTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.PaneTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.PaneTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ParkedOnlyOnClickListener implements androidx.car.app.model.OnClickListener {
+    method public static androidx.car.app.model.ParkedOnlyOnClickListener create(androidx.car.app.model.OnClickListener);
+    method public void onClick();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Place {
+    method public androidx.car.app.model.CarLocation getLocation();
+    method public androidx.car.app.model.PlaceMarker? getMarker();
+  }
+
+  public static final class Place.Builder {
+    ctor public Place.Builder(androidx.car.app.model.CarLocation);
+    ctor public Place.Builder(androidx.car.app.model.Place);
+    method public androidx.car.app.model.Place build();
+    method public androidx.car.app.model.Place.Builder setMarker(androidx.car.app.model.PlaceMarker);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceListMapTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Place? getAnchor();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.OnContentRefreshDelegate? getOnContentRefreshDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isCurrentLocationEnabled();
+    method public boolean isLoading();
+  }
+
+  public static final class PlaceListMapTemplate.Builder {
+    ctor public PlaceListMapTemplate.Builder();
+    method public androidx.car.app.model.PlaceListMapTemplate build();
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setAnchor(androidx.car.app.model.Place);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setCurrentLocationEnabled(boolean);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.PlaceListMapTemplate.Builder setOnContentRefreshListener(androidx.car.app.model.OnContentRefreshListener);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceMarker {
+    method public androidx.car.app.model.CarColor? getColor();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public int getIconType();
+    method public androidx.car.app.model.CarText? getLabel();
+    field public static final int TYPE_ICON = 0; // 0x0
+    field public static final int TYPE_IMAGE = 1; // 0x1
+  }
+
+  public static final class PlaceMarker.Builder {
+    ctor public PlaceMarker.Builder();
+    method public androidx.car.app.model.PlaceMarker build();
+    method public androidx.car.app.model.PlaceMarker.Builder setColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.model.PlaceMarker.Builder setIcon(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.PlaceMarker.Builder setLabel(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Row implements androidx.car.app.model.Item {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.Metadata? getMetadata();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public int getRowImageType();
+    method public java.util.List<androidx.car.app.model.CarText!> getTexts();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public androidx.car.app.model.Toggle? getToggle();
+    method public boolean isBrowsable();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public boolean isEnabled();
+    method public androidx.car.app.model.Row row();
+    method public CharSequence yourBoat();
+    field public static final int IMAGE_TYPE_ICON = 4; // 0x4
+    field public static final int IMAGE_TYPE_LARGE = 2; // 0x2
+    field public static final int IMAGE_TYPE_SMALL = 1; // 0x1
+    field public static final int NO_DECORATION = -1; // 0xffffffff
+  }
+
+  public static final class Row.Builder {
+    ctor public Row.Builder();
+    method public androidx.car.app.model.Row.Builder addText(CharSequence);
+    method public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.Row build();
+    method public androidx.car.app.model.Row.Builder setBrowsable(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Row.Builder setEnabled(boolean);
+    method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.Row.Builder setMetadata(androidx.car.app.model.Metadata);
+    method public androidx.car.app.model.Row.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.Row.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.Row.Builder setToggle(androidx.car.app.model.Toggle);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface SearchCallbackDelegate {
+    method public void sendSearchSubmitted(String, androidx.car.app.OnDoneCallback);
+    method public void sendSearchTextChanged(String, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SearchTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public String? getInitialSearchText();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method public androidx.car.app.model.SearchCallbackDelegate getSearchCallbackDelegate();
+    method public String? getSearchHint();
+    method public boolean isLoading();
+    method public boolean isShowKeyboardByDefault();
+  }
+
+  public static final class SearchTemplate.Builder {
+    ctor public SearchTemplate.Builder(androidx.car.app.model.SearchTemplate.SearchCallback);
+    method public androidx.car.app.model.SearchTemplate build();
+    method public androidx.car.app.model.SearchTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.SearchTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.SearchTemplate.Builder setInitialSearchText(String);
+    method public androidx.car.app.model.SearchTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.SearchTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.SearchTemplate.Builder setSearchHint(String);
+    method public androidx.car.app.model.SearchTemplate.Builder setShowKeyboardByDefault(boolean);
+  }
+
+  public static interface SearchTemplate.SearchCallback {
+    method public default void onSearchSubmitted(String);
+    method public default void onSearchTextChanged(String);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SectionedItemList {
+    method public static androidx.car.app.model.SectionedItemList create(androidx.car.app.model.ItemList, CharSequence);
+    method public androidx.car.app.model.CarText getHeader();
+    method public androidx.car.app.model.ItemList getItemList();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface Template {
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TemplateInfo {
+    ctor public TemplateInfo(Class<? extends androidx.car.app.model.Template>, String);
+    method public Class<? extends androidx.car.app.model.Template> getTemplateClass();
+    method public String getTemplateId();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TemplateWrapper {
+    method public static androidx.car.app.model.TemplateWrapper copyOf(androidx.car.app.model.TemplateWrapper);
+    method public int getCurrentTaskStep();
+    method public String getId();
+    method public androidx.car.app.model.Template getTemplate();
+    method public java.util.List<androidx.car.app.model.TemplateInfo!> getTemplateInfosForScreenStack();
+    method public boolean isRefresh();
+    method public void setCurrentTaskStep(int);
+    method public void setId(String);
+    method public void setRefresh(boolean);
+    method public void setTemplate(androidx.car.app.model.Template);
+    method public static androidx.car.app.model.TemplateWrapper wrap(androidx.car.app.model.Template);
+    method public static androidx.car.app.model.TemplateWrapper wrap(androidx.car.app.model.Template, String);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Toggle {
+    method public androidx.car.app.model.OnCheckedChangeDelegate getOnCheckedChangeDelegate();
+    method public boolean isChecked();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public boolean isEnabled();
+  }
+
+  public static final class Toggle.Builder {
+    ctor public Toggle.Builder(androidx.car.app.model.Toggle.OnCheckedChangeListener);
+    method public androidx.car.app.model.Toggle build();
+    method public androidx.car.app.model.Toggle.Builder setChecked(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Toggle.Builder setEnabled(boolean);
+  }
+
+  public static interface Toggle.OnCheckedChangeListener {
+    method public void onCheckedChange(boolean);
+  }
+
+}
+
+package androidx.car.app.model.signin {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class InputSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    method public androidx.car.app.model.CarText? getDefaultValue();
+    method public androidx.car.app.model.CarText? getErrorMessage();
+    method public androidx.car.app.model.CarText? getHint();
+    method public androidx.car.app.model.InputCallbackDelegate getInputCallbackDelegate();
+    method public int getInputType();
+    method public int getKeyboardType();
+    method public boolean isShowKeyboardByDefault();
+    field public static final int INPUT_TYPE_DEFAULT = 1; // 0x1
+    field public static final int INPUT_TYPE_PASSWORD = 2; // 0x2
+    field public static final int KEYBOARD_DEFAULT = 1; // 0x1
+    field public static final int KEYBOARD_EMAIL = 2; // 0x2
+    field public static final int KEYBOARD_NUMBER = 4; // 0x4
+    field public static final int KEYBOARD_PHONE = 3; // 0x3
+  }
+
+  public static final class InputSignInMethod.Builder {
+    ctor public InputSignInMethod.Builder(androidx.car.app.model.InputCallback);
+    method public androidx.car.app.model.signin.InputSignInMethod build();
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setDefaultValue(String);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setErrorMessage(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setHint(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setInputType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setKeyboardType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setShowKeyboardByDefault(boolean);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class PinSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public PinSignInMethod(CharSequence);
+    method public androidx.car.app.model.CarText getPinCode();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class ProviderSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public ProviderSignInMethod(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Action getAction();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(4) public final class QRCodeSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public QRCodeSignInMethod(android.net.Uri);
+    method public android.net.Uri getUri();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class SignInTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.CarText? getAdditionalText();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText? getInstructions();
+    method public androidx.car.app.model.signin.SignInTemplate.SignInMethod getSignInMethod();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class SignInTemplate.Builder {
+    ctor public SignInTemplate.Builder(androidx.car.app.model.signin.SignInTemplate.SignInMethod);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate build();
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setAdditionalText(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setInstructions(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setTitle(CharSequence);
+  }
+
+  public static interface SignInTemplate.SignInMethod {
+  }
+
+}
+
+package androidx.car.app.navigation {
+
+  public class NavigationManager implements androidx.car.app.managers.Manager {
+    method @MainThread public void clearNavigationManagerCallback();
+    method @MainThread public void navigationEnded();
+    method @MainThread public void navigationStarted();
+    method @MainThread public void setNavigationManagerCallback(androidx.car.app.navigation.NavigationManagerCallback);
+    method @MainThread public void setNavigationManagerCallback(java.util.concurrent.Executor, androidx.car.app.navigation.NavigationManagerCallback);
+    method @MainThread public void updateTrip(androidx.car.app.navigation.model.Trip);
+  }
+
+  public interface NavigationManagerCallback {
+    method public default void onAutoDriveEnabled();
+    method public default void onStopNavigation();
+  }
+
+}
+
+package androidx.car.app.navigation.model {
+
+  @androidx.car.app.annotations.CarProtocol public final class Destination {
+    method public androidx.car.app.model.CarText? getAddress();
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.CarText? getName();
+  }
+
+  public static final class Destination.Builder {
+    ctor public Destination.Builder();
+    method public androidx.car.app.navigation.model.Destination build();
+    method public androidx.car.app.navigation.model.Destination.Builder setAddress(CharSequence);
+    method public androidx.car.app.navigation.model.Destination.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Destination.Builder setName(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Lane {
+    method public java.util.List<androidx.car.app.navigation.model.LaneDirection!> getDirections();
+  }
+
+  public static final class Lane.Builder {
+    ctor public Lane.Builder();
+    method public androidx.car.app.navigation.model.Lane.Builder addDirection(androidx.car.app.navigation.model.LaneDirection);
+    method public androidx.car.app.navigation.model.Lane build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class LaneDirection {
+    method public static androidx.car.app.navigation.model.LaneDirection create(int, boolean);
+    method public int getShape();
+    method public boolean isRecommended();
+    field public static final int SHAPE_NORMAL_LEFT = 5; // 0x5
+    field public static final int SHAPE_NORMAL_RIGHT = 6; // 0x6
+    field public static final int SHAPE_SHARP_LEFT = 7; // 0x7
+    field public static final int SHAPE_SHARP_RIGHT = 8; // 0x8
+    field public static final int SHAPE_SLIGHT_LEFT = 3; // 0x3
+    field public static final int SHAPE_SLIGHT_RIGHT = 4; // 0x4
+    field public static final int SHAPE_STRAIGHT = 2; // 0x2
+    field public static final int SHAPE_UNKNOWN = 1; // 0x1
+    field public static final int SHAPE_U_TURN_LEFT = 9; // 0x9
+    field public static final int SHAPE_U_TURN_RIGHT = 10; // 0xa
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Maneuver {
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public int getRoundaboutExitAngle();
+    method public int getRoundaboutExitNumber();
+    method public int getType();
+    field public static final int TYPE_DEPART = 1; // 0x1
+    field public static final int TYPE_DESTINATION = 39; // 0x27
+    field public static final int TYPE_DESTINATION_LEFT = 41; // 0x29
+    field public static final int TYPE_DESTINATION_RIGHT = 42; // 0x2a
+    field public static final int TYPE_DESTINATION_STRAIGHT = 40; // 0x28
+    field public static final int TYPE_FERRY_BOAT = 37; // 0x25
+    field public static final int TYPE_FERRY_BOAT_LEFT = 47; // 0x2f
+    field public static final int TYPE_FERRY_BOAT_RIGHT = 48; // 0x30
+    field public static final int TYPE_FERRY_TRAIN = 38; // 0x26
+    field public static final int TYPE_FERRY_TRAIN_LEFT = 49; // 0x31
+    field public static final int TYPE_FERRY_TRAIN_RIGHT = 50; // 0x32
+    field public static final int TYPE_FORK_LEFT = 25; // 0x19
+    field public static final int TYPE_FORK_RIGHT = 26; // 0x1a
+    field public static final int TYPE_KEEP_LEFT = 3; // 0x3
+    field public static final int TYPE_KEEP_RIGHT = 4; // 0x4
+    field public static final int TYPE_MERGE_LEFT = 27; // 0x1b
+    field public static final int TYPE_MERGE_RIGHT = 28; // 0x1c
+    field public static final int TYPE_MERGE_SIDE_UNSPECIFIED = 29; // 0x1d
+    field public static final int TYPE_NAME_CHANGE = 2; // 0x2
+    field public static final int TYPE_OFF_RAMP_NORMAL_LEFT = 23; // 0x17
+    field public static final int TYPE_OFF_RAMP_NORMAL_RIGHT = 24; // 0x18
+    field public static final int TYPE_OFF_RAMP_SLIGHT_LEFT = 21; // 0x15
+    field public static final int TYPE_OFF_RAMP_SLIGHT_RIGHT = 22; // 0x16
+    field public static final int TYPE_ON_RAMP_NORMAL_LEFT = 15; // 0xf
+    field public static final int TYPE_ON_RAMP_NORMAL_RIGHT = 16; // 0x10
+    field public static final int TYPE_ON_RAMP_SHARP_LEFT = 17; // 0x11
+    field public static final int TYPE_ON_RAMP_SHARP_RIGHT = 18; // 0x12
+    field public static final int TYPE_ON_RAMP_SLIGHT_LEFT = 13; // 0xd
+    field public static final int TYPE_ON_RAMP_SLIGHT_RIGHT = 14; // 0xe
+    field public static final int TYPE_ON_RAMP_U_TURN_LEFT = 19; // 0x13
+    field public static final int TYPE_ON_RAMP_U_TURN_RIGHT = 20; // 0x14
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW = 34; // 0x22
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW_WITH_ANGLE = 35; // 0x23
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW = 32; // 0x20
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW_WITH_ANGLE = 33; // 0x21
+    field public static final int TYPE_ROUNDABOUT_ENTER_CCW = 45; // 0x2d
+    field public static final int TYPE_ROUNDABOUT_ENTER_CW = 43; // 0x2b
+    field public static final int TYPE_ROUNDABOUT_EXIT_CCW = 46; // 0x2e
+    field public static final int TYPE_ROUNDABOUT_EXIT_CW = 44; // 0x2c
+    field public static final int TYPE_STRAIGHT = 36; // 0x24
+    field public static final int TYPE_TURN_NORMAL_LEFT = 7; // 0x7
+    field public static final int TYPE_TURN_NORMAL_RIGHT = 8; // 0x8
+    field public static final int TYPE_TURN_SHARP_LEFT = 9; // 0x9
+    field public static final int TYPE_TURN_SHARP_RIGHT = 10; // 0xa
+    field public static final int TYPE_TURN_SLIGHT_LEFT = 5; // 0x5
+    field public static final int TYPE_TURN_SLIGHT_RIGHT = 6; // 0x6
+    field public static final int TYPE_UNKNOWN = 0; // 0x0
+    field public static final int TYPE_U_TURN_LEFT = 11; // 0xb
+    field public static final int TYPE_U_TURN_RIGHT = 12; // 0xc
+  }
+
+  public static final class Maneuver.Builder {
+    ctor public Maneuver.Builder(int);
+    method public androidx.car.app.navigation.model.Maneuver build();
+    method public androidx.car.app.navigation.model.Maneuver.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Maneuver.Builder setRoundaboutExitAngle(@IntRange(from=1, to=360) int);
+    method public androidx.car.app.navigation.model.Maneuver.Builder setRoundaboutExitNumber(@IntRange(from=1) int);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class MapController {
+    method public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+  }
+
+  public static final class MapController.Builder {
+    ctor public MapController.Builder();
+    method public androidx.car.app.navigation.model.MapController build();
+    method public androidx.car.app.navigation.model.MapController.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.MapController.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class MapTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Header? getHeader();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method public androidx.car.app.navigation.model.MapController? getMapController();
+    method public androidx.car.app.model.Pane? getPane();
+  }
+
+  public static final class MapTemplate.Builder {
+    ctor public MapTemplate.Builder();
+    method public androidx.car.app.navigation.model.MapTemplate build();
+    method public androidx.car.app.navigation.model.MapTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.MapTemplate.Builder setHeader(androidx.car.app.model.Header);
+    method public androidx.car.app.navigation.model.MapTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.navigation.model.MapTemplate.Builder setMapController(androidx.car.app.navigation.model.MapController);
+    method public androidx.car.app.navigation.model.MapTemplate.Builder setPane(androidx.car.app.model.Pane);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class MessageInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.CarText? getText();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  public static final class MessageInfo.Builder {
+    ctor public MessageInfo.Builder(CharSequence);
+    ctor public MessageInfo.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.MessageInfo build();
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setText(CharSequence);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setText(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class NavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.CarColor? getBackgroundColor();
+    method public androidx.car.app.navigation.model.TravelEstimate? getDestinationTravelEstimate();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo? getNavigationInfo();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method @Deprecated @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.Toggle? getPanModeToggle();
+  }
+
+  public static final class NavigationTemplate.Builder {
+    ctor public NavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.NavigationTemplate build();
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setBackgroundColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setDestinationTravelEstimate(androidx.car.app.navigation.model.TravelEstimate);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setNavigationInfo(androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+  }
+
+  public static interface NavigationTemplate.NavigationInfo {
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public interface PanModeDelegate {
+    method public void sendPanModeChanged(boolean, androidx.car.app.OnDoneCallback);
+  }
+
+  public interface PanModeListener {
+    method public void onPanModeChanged(boolean);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceListNavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Header? getHeader();
+    method @Deprecated public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.model.OnContentRefreshDelegate? getOnContentRefreshDelegate();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method @Deprecated public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class PlaceListNavigationTemplate.Builder {
+    ctor public PlaceListNavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate build();
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setHeader(androidx.car.app.model.Header);
+    method @Deprecated public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setOnContentRefreshListener(androidx.car.app.model.OnContentRefreshListener);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+    method @Deprecated public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(CharSequence);
+    method @Deprecated public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class RoutePreviewNavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Header? getHeader();
+    method @Deprecated public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.model.Action? getNavigateAction();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method @Deprecated public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class RoutePreviewNavigationTemplate.Builder {
+    ctor public RoutePreviewNavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate build();
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setHeader(androidx.car.app.model.Header);
+    method @Deprecated public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setNavigateAction(androidx.car.app.model.Action);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+    method @Deprecated public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(CharSequence);
+    method @Deprecated public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class RoutingInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
+    method public androidx.car.app.model.Distance? getCurrentDistance();
+    method public androidx.car.app.navigation.model.Step? getCurrentStep();
+    method public androidx.car.app.model.CarIcon? getJunctionImage();
+    method public androidx.car.app.navigation.model.Step? getNextStep();
+    method public boolean isLoading();
+  }
+
+  public static final class RoutingInfo.Builder {
+    ctor public RoutingInfo.Builder();
+    method public androidx.car.app.navigation.model.RoutingInfo build();
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setCurrentStep(androidx.car.app.navigation.model.Step, androidx.car.app.model.Distance);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setJunctionImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setLoading(boolean);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setNextStep(androidx.car.app.navigation.model.Step);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Step {
+    method public androidx.car.app.model.CarText? getCue();
+    method public java.util.List<androidx.car.app.navigation.model.Lane!> getLanes();
+    method public androidx.car.app.model.CarIcon? getLanesImage();
+    method public androidx.car.app.navigation.model.Maneuver? getManeuver();
+    method public androidx.car.app.model.CarText? getRoad();
+  }
+
+  public static final class Step.Builder {
+    ctor public Step.Builder();
+    ctor public Step.Builder(CharSequence);
+    ctor public Step.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.Step.Builder addLane(androidx.car.app.navigation.model.Lane);
+    method public androidx.car.app.navigation.model.Step build();
+    method public androidx.car.app.navigation.model.Step.Builder setCue(CharSequence);
+    method public androidx.car.app.navigation.model.Step.Builder setLanesImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Step.Builder setManeuver(androidx.car.app.navigation.model.Maneuver);
+    method public androidx.car.app.navigation.model.Step.Builder setRoad(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TravelEstimate {
+    method public androidx.car.app.model.DateTimeWithZone? getArrivalTimeAtDestination();
+    method public androidx.car.app.model.Distance? getRemainingDistance();
+    method public androidx.car.app.model.CarColor? getRemainingDistanceColor();
+    method public androidx.car.app.model.CarColor? getRemainingTimeColor();
+    method public long getRemainingTimeSeconds();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.CarIcon? getTripIcon();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.CarText? getTripText();
+    field public static final long REMAINING_TIME_UNKNOWN = -1L; // 0xffffffffffffffffL
+  }
+
+  public static final class TravelEstimate.Builder {
+    ctor public TravelEstimate.Builder(androidx.car.app.model.Distance, androidx.car.app.model.DateTimeWithZone);
+    ctor @RequiresApi(26) public TravelEstimate.Builder(androidx.car.app.model.Distance, java.time.ZonedDateTime);
+    method public androidx.car.app.navigation.model.TravelEstimate build();
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingDistanceColor(androidx.car.app.model.CarColor);
+    method @RequiresApi(26) public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTime(java.time.Duration);
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTimeColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTimeSeconds(@IntRange(from=0xffffffff) long);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.navigation.model.TravelEstimate.Builder setTripIcon(androidx.car.app.model.CarIcon);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.navigation.model.TravelEstimate.Builder setTripText(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Trip {
+    method public androidx.car.app.model.CarText? getCurrentRoad();
+    method public java.util.List<androidx.car.app.navigation.model.TravelEstimate!> getDestinationTravelEstimates();
+    method public java.util.List<androidx.car.app.navigation.model.Destination!> getDestinations();
+    method public java.util.List<androidx.car.app.navigation.model.TravelEstimate!> getStepTravelEstimates();
+    method public java.util.List<androidx.car.app.navigation.model.Step!> getSteps();
+    method public boolean isLoading();
+  }
+
+  public static final class Trip.Builder {
+    ctor public Trip.Builder();
+    method public androidx.car.app.navigation.model.Trip.Builder addDestination(androidx.car.app.navigation.model.Destination, androidx.car.app.navigation.model.TravelEstimate);
+    method public androidx.car.app.navigation.model.Trip.Builder addStep(androidx.car.app.navigation.model.Step, androidx.car.app.navigation.model.TravelEstimate);
+    method public androidx.car.app.navigation.model.Trip build();
+    method public androidx.car.app.navigation.model.Trip.Builder setCurrentRoad(CharSequence);
+    method public androidx.car.app.navigation.model.Trip.Builder setLoading(boolean);
+  }
+
+}
+
+package androidx.car.app.notification {
+
+  public final class CarAppExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public CarAppExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<android.app.Notification.Action!> getActions();
+    method public String? getChannelId();
+    method public androidx.car.app.model.CarColor? getColor();
+    method public android.app.PendingIntent? getContentIntent();
+    method public CharSequence? getContentText();
+    method public CharSequence? getContentTitle();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method public int getImportance();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @DrawableRes public int getSmallIcon();
+    method public static boolean isExtended(android.app.Notification);
+  }
+
+  public static final class CarAppExtender.Builder {
+    ctor public CarAppExtender.Builder();
+    method public androidx.car.app.notification.CarAppExtender.Builder addAction(@DrawableRes int, CharSequence, android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender build();
+    method public androidx.car.app.notification.CarAppExtender.Builder setChannelId(String);
+    method public androidx.car.app.notification.CarAppExtender.Builder setColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentIntent(android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentText(CharSequence);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentTitle(CharSequence);
+    method public androidx.car.app.notification.CarAppExtender.Builder setDeleteIntent(android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender.Builder setImportance(int);
+    method public androidx.car.app.notification.CarAppExtender.Builder setLargeIcon(android.graphics.Bitmap);
+    method public androidx.car.app.notification.CarAppExtender.Builder setSmallIcon(int);
+  }
+
+  public final class CarNotificationManager {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.car.app.notification.CarNotificationManager from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroup(String);
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannels();
+    method public void notify(int, androidx.core.app.NotificationCompat.Builder);
+    method public void notify(String?, int, androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public final class CarPendingIntent {
+    method public static android.app.PendingIntent getCarApp(android.content.Context, int, android.content.Intent, int);
+  }
+
+}
+
+package androidx.car.app.serialization {
+
+  public final class Bundleable implements android.os.Parcelable {
+    method public static androidx.car.app.serialization.Bundleable create(Object) throws androidx.car.app.serialization.BundlerException;
+    method public int describeContents();
+    method public Object get() throws androidx.car.app.serialization.BundlerException;
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.car.app.serialization.Bundleable!> CREATOR;
+  }
+
+  public class BundlerException extends java.lang.Exception {
+    ctor public BundlerException(String?, Throwable);
+    ctor public BundlerException(String?);
+  }
+
+}
+
+package androidx.car.app.suggestion {
+
+  @androidx.car.app.annotations.RequiresCarApi(5) public class SuggestionManager implements androidx.car.app.managers.Manager {
+    method @MainThread public void updateSuggestions(java.util.List<androidx.car.app.suggestion.model.Suggestion!>);
+  }
+
+}
+
+package androidx.car.app.suggestion.model {
+
+  @androidx.car.app.annotations.CarProtocol public final class Suggestion {
+    method public android.app.PendingIntent? getAction();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public String getIdentifier();
+    method public androidx.car.app.model.CarText? getSubtitle();
+    method public androidx.car.app.model.CarText getTitle();
+  }
+
+  public static final class Suggestion.Builder {
+    ctor public Suggestion.Builder();
+    method public androidx.car.app.suggestion.model.Suggestion build();
+    method public androidx.car.app.suggestion.model.Suggestion.Builder setAction(android.app.PendingIntent);
+    method public androidx.car.app.suggestion.model.Suggestion.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.suggestion.model.Suggestion.Builder setIdentifier(String);
+    method public androidx.car.app.suggestion.model.Suggestion.Builder setSubtitle(CharSequence);
+    method public androidx.car.app.suggestion.model.Suggestion.Builder setTitle(CharSequence);
+  }
+
+}
+
+package androidx.car.app.validation {
+
+  public final class HostValidator {
+    method public java.util.Map<java.lang.String!,java.util.List<java.lang.String!>!> getAllowedHosts();
+    method public boolean isValidHost(androidx.car.app.HostInfo);
+    field public static final androidx.car.app.validation.HostValidator ALLOW_ALL_HOSTS_VALIDATOR;
+    field public static final String TEMPLATE_RENDERER_PERMISSION = "android.car.permission.TEMPLATE_RENDERER";
+  }
+
+  public static final class HostValidator.Builder {
+    ctor public HostValidator.Builder(android.content.Context);
+    method public androidx.car.app.validation.HostValidator.Builder addAllowedHost(String, String);
+    method public androidx.car.app.validation.HostValidator.Builder addAllowedHosts(@ArrayRes int);
+    method public androidx.car.app.validation.HostValidator build();
+  }
+
+}
+
+package androidx.car.app.versioning {
+
+  public final class CarAppApiLevels {
+    method public static int getLatest();
+    method public static int getOldest();
+    field public static final int LEVEL_1 = 1; // 0x1
+    field public static final int LEVEL_2 = 2; // 0x2
+    field public static final int LEVEL_3 = 3; // 0x3
+    field public static final int LEVEL_4 = 4; // 0x4
+    field public static final int LEVEL_5 = 5; // 0x5
+    field public static final int LEVEL_6 = 6; // 0x6
+  }
+
+}
+
diff --git a/car/app/app/api/current.txt b/car/app/app/api/current.txt
index 0751150..306320a 100644
--- a/car/app/app/api/current.txt
+++ b/car/app/app/api/current.txt
@@ -977,10 +977,8 @@
   }
 
   @androidx.car.app.annotations.CarProtocol public final class Row implements androidx.car.app.model.Item {
-    method public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.CarIcon? getImage();
     method public androidx.car.app.model.Metadata? getMetadata();
-    method @androidx.car.app.annotations.RequiresCarApi(6) public int getNumericDecoration();
     method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
     method public int getRowImageType();
     method public java.util.List<androidx.car.app.model.CarText!> getTexts();
@@ -998,7 +996,6 @@
 
   public static final class Row.Builder {
     ctor public Row.Builder();
-    method public androidx.car.app.model.Row.Builder addAction(androidx.car.app.model.Action);
     method public androidx.car.app.model.Row.Builder addText(CharSequence);
     method public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
     method public androidx.car.app.model.Row build();
@@ -1007,7 +1004,6 @@
     method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon);
     method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon, int);
     method public androidx.car.app.model.Row.Builder setMetadata(androidx.car.app.model.Metadata);
-    method @androidx.car.app.annotations.RequiresCarApi(6) public androidx.car.app.model.Row.Builder setNumericDecoration(int);
     method public androidx.car.app.model.Row.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.Row.Builder setTitle(CharSequence);
     method public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
diff --git a/car/app/app/api/public_plus_experimental_1.3.0-beta01.txt b/car/app/app/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..108129b
--- /dev/null
+++ b/car/app/app/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,2008 @@
+// Signature format: 4.0
+package androidx.car.app {
+
+  @androidx.car.app.annotations.CarProtocol public final class AppInfo {
+    ctor @VisibleForTesting public AppInfo(int, int, String);
+    method public int getLatestCarAppApiLevel();
+    method public String getLibraryDisplayVersion();
+    method public int getMinCarAppApiLevel();
+    field public static final String MIN_API_LEVEL_METADATA_KEY = "androidx.car.app.minCarApiLevel";
+  }
+
+  public class AppManager implements androidx.car.app.managers.Manager {
+    method @androidx.car.app.annotations.RequiresCarApi(5) public void dismissAlert(int);
+    method public void invalidate();
+    method public void setSurfaceCallback(androidx.car.app.SurfaceCallback?);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public void showAlert(androidx.car.app.model.Alert);
+    method public void showToast(CharSequence, int);
+  }
+
+  public final class CarAppPermission {
+    method public static void checkHasLibraryPermission(android.content.Context, String);
+    method public static void checkHasPermission(android.content.Context, String);
+    field public static final String ACCESS_SURFACE = "androidx.car.app.ACCESS_SURFACE";
+    field public static final String MAP_TEMPLATES = "androidx.car.app.MAP_TEMPLATES";
+    field public static final String NAVIGATION_TEMPLATES = "androidx.car.app.NAVIGATION_TEMPLATES";
+  }
+
+  public abstract class CarAppService extends android.app.Service {
+    ctor public CarAppService();
+    method public abstract androidx.car.app.validation.HostValidator createHostValidator();
+    method @CallSuper public final void dump(java.io.FileDescriptor, java.io.PrintWriter, String![]?);
+    method @Deprecated public final androidx.car.app.Session? getCurrentSession();
+    method public final androidx.car.app.HostInfo? getHostInfo();
+    method public final androidx.car.app.Session? getSession(androidx.car.app.SessionInfo);
+    method @CallSuper public final android.os.IBinder onBind(android.content.Intent);
+    method public androidx.car.app.Session onCreateSession();
+    method @androidx.car.app.annotations.RequiresCarApi(6) public androidx.car.app.Session onCreateSession(androidx.car.app.SessionInfo);
+    method public final boolean onUnbind(android.content.Intent);
+    field @Deprecated public static final String CATEGORY_CHARGING_APP = "androidx.car.app.category.CHARGING";
+    field @androidx.car.app.annotations.RequiresCarApi(6) public static final String CATEGORY_FEATURE_CLUSTER = "androidx.car.app.category.FEATURE_CLUSTER";
+    field public static final String CATEGORY_NAVIGATION_APP = "androidx.car.app.category.NAVIGATION";
+    field @Deprecated public static final String CATEGORY_PARKING_APP = "androidx.car.app.category.PARKING";
+    field public static final String CATEGORY_POI_APP = "androidx.car.app.category.POI";
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final String CATEGORY_SETTINGS_APP = "androidx.car.app.category.SETTINGS";
+    field public static final String SERVICE_INTERFACE = "androidx.car.app.CarAppService";
+  }
+
+  public class CarContext extends android.content.ContextWrapper {
+    method public void finishCarApp();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public android.content.ComponentName? getCallingComponent();
+    method public int getCarAppApiLevel();
+    method public Object getCarService(String);
+    method public <T> T getCarService(Class<T!>);
+    method public String getCarServiceName(Class<?>);
+    method public androidx.car.app.HostInfo? getHostInfo();
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public boolean isDarkMode();
+    method public void requestPermissions(java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsListener);
+    method public void requestPermissions(java.util.List<java.lang.String!>, java.util.concurrent.Executor, androidx.car.app.OnRequestPermissionsListener);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public void setCarAppResult(int, android.content.Intent?);
+    method public void startCarApp(android.content.Intent);
+    method @Deprecated public static void startCarApp(android.content.Intent, android.content.Intent);
+    field public static final String ACTION_NAVIGATE = "androidx.car.app.action.NAVIGATE";
+    field public static final String APP_SERVICE = "app";
+    field public static final String CAR_SERVICE = "car";
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final String CONSTRAINT_SERVICE = "constraints";
+    field public static final String EXTRA_START_CAR_APP_BINDER_KEY = "androidx.car.app.extra.START_CAR_APP_BINDER_KEY";
+    field @androidx.car.app.annotations.RequiresCarApi(3) public static final String HARDWARE_SERVICE = "hardware";
+    field public static final String NAVIGATION_SERVICE = "navigation";
+    field public static final String SCREEN_SERVICE = "screen";
+    field public static final String SUGGESTION_SERVICE = "suggestion";
+  }
+
+  public final class CarToast {
+    method public static androidx.car.app.CarToast makeText(androidx.car.app.CarContext, @StringRes int, int);
+    method public static androidx.car.app.CarToast makeText(androidx.car.app.CarContext, CharSequence, int);
+    method public void setDuration(int);
+    method public void setText(@StringRes int);
+    method public void setText(CharSequence);
+    method public void show();
+    field public static final int LENGTH_LONG = 1; // 0x1
+    field public static final int LENGTH_SHORT = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class FailureResponse {
+    ctor public FailureResponse(Throwable);
+    method public int getErrorType();
+    method public String getStackTrace();
+    field public static final int BUNDLER_EXCEPTION = 1; // 0x1
+    field public static final int ILLEGAL_STATE_EXCEPTION = 2; // 0x2
+    field public static final int INVALID_PARAMETER_EXCEPTION = 3; // 0x3
+    field public static final int REMOTE_EXCEPTION = 6; // 0x6
+    field public static final int RUNTIME_EXCEPTION = 5; // 0x5
+    field public static final int SECURITY_EXCEPTION = 4; // 0x4
+    field public static final int UNKNOWN_ERROR = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class HandshakeInfo {
+    ctor public HandshakeInfo(String, int);
+    method public int getHostCarAppApiLevel();
+    method public String getHostPackageName();
+  }
+
+  public final class HostException extends java.lang.RuntimeException {
+    ctor public HostException(String);
+    ctor public HostException(String, Throwable);
+    ctor public HostException(Throwable);
+  }
+
+  public final class HostInfo {
+    ctor public HostInfo(String, int);
+    method public String getPackageName();
+    method public int getUid();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnDoneCallback {
+    method public default void onFailure(androidx.car.app.serialization.Bundleable);
+    method public default void onSuccess(androidx.car.app.serialization.Bundleable?);
+  }
+
+  public interface OnRequestPermissionsListener {
+    method public void onRequestPermissionsResult(java.util.List<java.lang.String!>, java.util.List<java.lang.String!>);
+  }
+
+  public interface OnScreenResultListener {
+    method public void onScreenResult(Object?);
+  }
+
+  public abstract class Screen implements androidx.lifecycle.LifecycleOwner {
+    ctor protected Screen(androidx.car.app.CarContext);
+    method public final void finish();
+    method public final androidx.car.app.CarContext getCarContext();
+    method public final androidx.lifecycle.Lifecycle getLifecycle();
+    method public String? getMarker();
+    method public final androidx.car.app.ScreenManager getScreenManager();
+    method public final void invalidate();
+    method public abstract androidx.car.app.model.Template onGetTemplate();
+    method public void setMarker(String?);
+    method public void setResult(Object?);
+  }
+
+  @MainThread public class ScreenManager implements androidx.car.app.managers.Manager {
+    method public int getStackSize();
+    method public androidx.car.app.Screen getTop();
+    method public void pop();
+    method public void popTo(String);
+    method public void popToRoot();
+    method public void push(androidx.car.app.Screen);
+    method public void pushForResult(androidx.car.app.Screen, androidx.car.app.OnScreenResultListener);
+    method public void remove(androidx.car.app.Screen);
+  }
+
+  public abstract class Session implements androidx.lifecycle.LifecycleOwner {
+    ctor public Session();
+    method public final androidx.car.app.CarContext getCarContext();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public void onCarConfigurationChanged(android.content.res.Configuration);
+    method public abstract androidx.car.app.Screen onCreateScreen(android.content.Intent);
+    method public void onNewIntent(android.content.Intent);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(6) public class SessionInfo {
+    ctor public SessionInfo(int, String);
+    method public int getDisplayType();
+    method public String getSessionId();
+    method public java.util.Set<java.lang.Class<? extends androidx.car.app.model.Template>!>? getSupportedTemplates(int);
+    field public static final androidx.car.app.SessionInfo DEFAULT_SESSION_INFO;
+    field public static final int DISPLAY_TYPE_CLUSTER = 1; // 0x1
+    field public static final int DISPLAY_TYPE_MAIN = 0; // 0x0
+  }
+
+  public class SessionInfoIntentEncoder {
+    method public static boolean containsSessionInfo(android.content.Intent);
+    method public static androidx.car.app.SessionInfo decode(android.content.Intent);
+    method public static void encode(androidx.car.app.SessionInfo, android.content.Intent);
+  }
+
+  public interface SurfaceCallback {
+    method @androidx.car.app.annotations.RequiresCarApi(5) public default void onClick(float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onFling(float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScale(float, float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScroll(float, float);
+    method public default void onStableAreaChanged(android.graphics.Rect);
+    method public default void onSurfaceAvailable(androidx.car.app.SurfaceContainer);
+    method public default void onSurfaceDestroyed(androidx.car.app.SurfaceContainer);
+    method public default void onVisibleAreaChanged(android.graphics.Rect);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SurfaceContainer {
+    ctor public SurfaceContainer(android.view.Surface?, int, int, int);
+    method public int getDpi();
+    method public int getHeight();
+    method public android.view.Surface? getSurface();
+    method public int getWidth();
+  }
+
+}
+
+package androidx.car.app.annotations {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface CarProtocol {
+  }
+
+  @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface ExperimentalCarApi {
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface RequiresCarApi {
+    method public abstract int value();
+  }
+
+}
+
+package androidx.car.app.connection {
+
+  public final class CarConnection {
+    ctor @MainThread public CarConnection(android.content.Context);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getType();
+    field public static final String ACTION_CAR_CONNECTION_UPDATED = "androidx.car.app.connection.action.CAR_CONNECTION_UPDATED";
+    field public static final String CAR_CONNECTION_STATE = "CarConnectionState";
+    field public static final int CONNECTION_TYPE_NATIVE = 1; // 0x1
+    field public static final int CONNECTION_TYPE_NOT_CONNECTED = 0; // 0x0
+    field public static final int CONNECTION_TYPE_PROJECTION = 2; // 0x2
+  }
+
+}
+
+package androidx.car.app.constraints {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public class ConstraintManager implements androidx.car.app.managers.Manager {
+    method public int getContentLimit(int);
+    field public static final int CONTENT_LIMIT_TYPE_GRID = 1; // 0x1
+    field public static final int CONTENT_LIMIT_TYPE_LIST = 0; // 0x0
+    field public static final int CONTENT_LIMIT_TYPE_PANE = 4; // 0x4
+    field public static final int CONTENT_LIMIT_TYPE_PLACE_LIST = 2; // 0x2
+    field public static final int CONTENT_LIMIT_TYPE_ROUTE_LIST = 3; // 0x3
+  }
+
+}
+
+package androidx.car.app.hardware {
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarHardwareManager extends androidx.car.app.managers.Manager {
+    method @androidx.car.app.annotations.ExperimentalCarApi public default androidx.car.app.hardware.climate.CarClimate getCarClimate();
+    method public default androidx.car.app.hardware.info.CarInfo getCarInfo();
+    method public default androidx.car.app.hardware.info.CarSensors getCarSensors();
+  }
+
+}
+
+package androidx.car.app.hardware.climate {
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class CabinTemperatureProfile {
+    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Float!,java.lang.Float!>!> getCarZoneSetsToCabinCelsiusTemperatureRanges();
+    method public float getCelsiusSupportedIncrement();
+    method public float getFahrenheitSupportedIncrement();
+    method public android.util.Pair<java.lang.Float!,java.lang.Float!> getSupportedMinMaxCelsiusRange();
+    method public android.util.Pair<java.lang.Float!,java.lang.Float!> getSupportedMinMaxFahrenheitRange();
+    method public boolean hasCarZoneSetsToCabinCelsiusTemperatureRanges();
+    method public boolean hasCelsiusSupportedIncrement();
+    method public boolean hasFahrenheitSupportedIncrement();
+    method public boolean hasSupportedMinMaxCelsiusRange();
+    method public boolean hasSupportedMinMaxFahrenheitRange();
+  }
+
+  public static final class CabinTemperatureProfile.Builder {
+    ctor public CabinTemperatureProfile.Builder();
+    method public androidx.car.app.hardware.climate.CabinTemperatureProfile build();
+    method public androidx.car.app.hardware.climate.CabinTemperatureProfile.Builder setCarZoneSetsToCabinCelsiusTemperatureRanges(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Float!,java.lang.Float!>!>);
+    method public androidx.car.app.hardware.climate.CabinTemperatureProfile.Builder setCelsiusSupportedIncrement(float);
+    method public androidx.car.app.hardware.climate.CabinTemperatureProfile.Builder setFahrenheitSupportedIncrement(float);
+    method public androidx.car.app.hardware.climate.CabinTemperatureProfile.Builder setSupportedMinMaxCelsiusRange(android.util.Pair<java.lang.Float!,java.lang.Float!>);
+    method public androidx.car.app.hardware.climate.CabinTemperatureProfile.Builder setSupportedMinMaxFahrenheitRange(android.util.Pair<java.lang.Float!,java.lang.Float!>);
+  }
+
+  @MainThread @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(5) public interface CarClimate {
+    method public void fetchClimateProfile(java.util.concurrent.Executor, androidx.car.app.hardware.climate.ClimateProfileRequest, androidx.car.app.hardware.climate.CarClimateProfileCallback);
+    method public void registerClimateStateCallback(java.util.concurrent.Executor, androidx.car.app.hardware.climate.RegisterClimateStateRequest, androidx.car.app.hardware.climate.CarClimateStateCallback);
+    method public <E> void setClimateState(java.util.concurrent.Executor, androidx.car.app.hardware.climate.ClimateStateRequest<E!>, androidx.car.app.hardware.common.CarSetOperationStatusCallback);
+    method public void unregisterClimateStateCallback(androidx.car.app.hardware.climate.CarClimateStateCallback);
+  }
+
+  @MainThread @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(5) public final class CarClimateFeature {
+    method public java.util.List<androidx.car.app.hardware.common.CarZone!> getCarZones();
+    method public int getFeature();
+  }
+
+  public static final class CarClimateFeature.Builder {
+    ctor public CarClimateFeature.Builder(int);
+    method public androidx.car.app.hardware.climate.CarClimateFeature.Builder addCarZones(androidx.car.app.hardware.common.CarZone!...);
+    method public androidx.car.app.hardware.climate.CarClimateFeature build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(5) public interface CarClimateProfileCallback {
+    method public default void onCabinTemperatureProfileAvailable(androidx.car.app.hardware.climate.CabinTemperatureProfile);
+    method public default void onCarZoneMappingInfoProfileAvailable(androidx.car.app.hardware.climate.CarZoneMappingInfoProfile);
+    method public default void onDefrosterProfileAvailable(androidx.car.app.hardware.climate.DefrosterProfile);
+    method public default void onElectricDefrosterProfileAvailable(androidx.car.app.hardware.climate.ElectricDefrosterProfile);
+    method public default void onFanDirectionProfileAvailable(androidx.car.app.hardware.climate.FanDirectionProfile);
+    method public default void onFanSpeedLevelProfileAvailable(androidx.car.app.hardware.climate.FanSpeedLevelProfile);
+    method public default void onHvacAcProfileAvailable(androidx.car.app.hardware.climate.HvacAcProfile);
+    method public default void onHvacAutoModeProfileAvailable(androidx.car.app.hardware.climate.HvacAutoModeProfile);
+    method public default void onHvacAutoRecirculationProfileAvailable(androidx.car.app.hardware.climate.HvacAutoRecirculationProfile);
+    method public default void onHvacDualModeProfileAvailable(androidx.car.app.hardware.climate.HvacDualModeProfile);
+    method public default void onHvacMaxAcModeProfileAvailable(androidx.car.app.hardware.climate.HvacMaxAcModeProfile);
+    method public default void onHvacPowerProfileAvailable(androidx.car.app.hardware.climate.HvacPowerProfile);
+    method public default void onHvacRecirculationProfileAvailable(androidx.car.app.hardware.climate.HvacRecirculationProfile);
+    method public default void onMaxDefrosterProfileAvailable(androidx.car.app.hardware.climate.MaxDefrosterProfile);
+    method public default void onSeatTemperatureLevelProfileAvailable(androidx.car.app.hardware.climate.SeatTemperatureProfile);
+    method public default void onSeatVentilationLevelProfileAvailable(androidx.car.app.hardware.climate.SeatVentilationProfile);
+    method public default void onSteeringWheelHeatProfileAvailable(androidx.car.app.hardware.climate.SteeringWheelHeatProfile);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(5) public interface CarClimateStateCallback {
+    method public default void onCabinTemperatureStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public default void onDefrosterStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public default void onElectricDefrosterStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public default void onFanDirectionStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public default void onFanSpeedLevelStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public default void onHvacAcStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public default void onHvacAutoModeStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public default void onHvacAutoRecirculationStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public default void onHvacDualModeStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public default void onHvacMaxAcModeStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public default void onHvacPowerStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public default void onHvacRecirculationStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public default void onMaxDefrosterStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public default void onSeatTemperatureLevelStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public default void onSeatVentilationLevelStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public default void onSteeringWheelHeatStateAvailable(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class CarZoneMappingInfoProfile {
+    method public java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!> getSupportedCarZoneSets();
+  }
+
+  public static final class CarZoneMappingInfoProfile.Builder {
+    ctor public CarZoneMappingInfoProfile.Builder(java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!>);
+    method public androidx.car.app.hardware.climate.CarZoneMappingInfoProfile build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(5) public final class ClimateProfileRequest {
+    method public java.util.Set<java.lang.Integer!> getAllClimateProfiles();
+    method public java.util.List<androidx.car.app.hardware.climate.CarClimateFeature!> getClimateProfileFeatures();
+    field public static final int FEATURE_CABIN_TEMPERATURE = 4; // 0x4
+    field public static final int FEATURE_CAR_ZONE_MAPPING = 17; // 0x11
+    field public static final int FEATURE_FAN_DIRECTION = 6; // 0x6
+    field public static final int FEATURE_FAN_SPEED = 5; // 0x5
+    field public static final int FEATURE_HVAC_AC = 2; // 0x2
+    field public static final int FEATURE_HVAC_AUTO_MODE = 12; // 0xc
+    field public static final int FEATURE_HVAC_AUTO_RECIRCULATION = 11; // 0xb
+    field public static final int FEATURE_HVAC_DEFROSTER = 14; // 0xe
+    field public static final int FEATURE_HVAC_DUAL_MODE = 13; // 0xd
+    field public static final int FEATURE_HVAC_ELECTRIC_DEFROSTER = 16; // 0x10
+    field public static final int FEATURE_HVAC_MAX_AC = 3; // 0x3
+    field public static final int FEATURE_HVAC_MAX_DEFROSTER = 15; // 0xf
+    field public static final int FEATURE_HVAC_POWER = 1; // 0x1
+    field public static final int FEATURE_HVAC_RECIRCULATION = 10; // 0xa
+    field public static final int FEATURE_SEAT_TEMPERATURE_LEVEL = 7; // 0x7
+    field public static final int FEATURE_SEAT_VENTILATION_LEVEL = 8; // 0x8
+    field public static final int FEATURE_STEERING_WHEEL_HEAT = 9; // 0x9
+  }
+
+  public static final class ClimateProfileRequest.Builder {
+    ctor public ClimateProfileRequest.Builder();
+    method public androidx.car.app.hardware.climate.ClimateProfileRequest.Builder addClimateProfileFeatures(androidx.car.app.hardware.climate.CarClimateFeature!...);
+    method public androidx.car.app.hardware.climate.ClimateProfileRequest build();
+    method public androidx.car.app.hardware.climate.ClimateProfileRequest.Builder setAllClimateProfiles();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(5) public final class ClimateStateRequest<T> {
+    method public java.util.List<androidx.car.app.hardware.common.CarZone!> getCarZones();
+    method public int getRequestedFeature();
+    method public T getRequestedValue();
+  }
+
+  public static final class ClimateStateRequest.Builder<T> {
+    ctor public ClimateStateRequest.Builder(int, T!);
+    method public androidx.car.app.hardware.climate.ClimateStateRequest.Builder<T!> addCarZones(androidx.car.app.hardware.common.CarZone);
+    method public androidx.car.app.hardware.climate.ClimateStateRequest<T!> build();
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class DefrosterProfile {
+    method public java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!> getSupportedCarZoneSets();
+  }
+
+  public static final class DefrosterProfile.Builder {
+    ctor public DefrosterProfile.Builder(java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!>);
+    method public androidx.car.app.hardware.climate.DefrosterProfile build();
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class ElectricDefrosterProfile {
+    method public java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!> getSupportedCarZoneSets();
+  }
+
+  public static final class ElectricDefrosterProfile.Builder {
+    ctor public ElectricDefrosterProfile.Builder(java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!>);
+    method public androidx.car.app.hardware.climate.ElectricDefrosterProfile build();
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class FanDirectionProfile {
+    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,java.util.Set<java.lang.Integer!>!> getCarZoneSetsToFanDirectionValues();
+  }
+
+  public static final class FanDirectionProfile.Builder {
+    ctor public FanDirectionProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,java.util.Set<java.lang.Integer!>!>);
+    method public androidx.car.app.hardware.climate.FanDirectionProfile build();
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class FanSpeedLevelProfile {
+    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!> getCarZoneSetsToFanSpeedLevelRanges();
+  }
+
+  public static final class FanSpeedLevelProfile.Builder {
+    ctor public FanSpeedLevelProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!>);
+    method public androidx.car.app.hardware.climate.FanSpeedLevelProfile build();
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class HvacAcProfile {
+    method public java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!> getSupportedCarZoneSets();
+  }
+
+  public static final class HvacAcProfile.Builder {
+    ctor public HvacAcProfile.Builder(java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!>);
+    method public androidx.car.app.hardware.climate.HvacAcProfile build();
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class HvacAutoModeProfile {
+    method public java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!> getSupportedCarZoneSets();
+  }
+
+  public static final class HvacAutoModeProfile.Builder {
+    ctor public HvacAutoModeProfile.Builder(java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!>);
+    method public androidx.car.app.hardware.climate.HvacAutoModeProfile build();
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class HvacAutoRecirculationProfile {
+    method public java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!> getSupportedCarZoneSets();
+  }
+
+  public static final class HvacAutoRecirculationProfile.Builder {
+    ctor public HvacAutoRecirculationProfile.Builder(java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!>);
+    method public androidx.car.app.hardware.climate.HvacAutoRecirculationProfile build();
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class HvacDualModeProfile {
+    method public java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!> getSupportedCarZoneSets();
+  }
+
+  public static final class HvacDualModeProfile.Builder {
+    ctor public HvacDualModeProfile.Builder(java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!>);
+    method public androidx.car.app.hardware.climate.HvacDualModeProfile build();
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class HvacMaxAcModeProfile {
+    method public java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!> getSupportedCarZoneSets();
+  }
+
+  public static final class HvacMaxAcModeProfile.Builder {
+    ctor public HvacMaxAcModeProfile.Builder(java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!>);
+    method public androidx.car.app.hardware.climate.HvacMaxAcModeProfile build();
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class HvacPowerProfile {
+    method public java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!> getSupportedCarZoneSets();
+  }
+
+  public static final class HvacPowerProfile.Builder {
+    ctor public HvacPowerProfile.Builder(java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!>);
+    method public androidx.car.app.hardware.climate.HvacPowerProfile build();
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class HvacRecirculationProfile {
+    method public java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!> getSupportedCarZones();
+  }
+
+  public static final class HvacRecirculationProfile.Builder {
+    ctor public HvacRecirculationProfile.Builder(java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!>);
+    method public androidx.car.app.hardware.climate.HvacRecirculationProfile build();
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class MaxDefrosterProfile {
+    method public java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!> getSupportedCarZoneSets();
+  }
+
+  public static final class MaxDefrosterProfile.Builder {
+    ctor public MaxDefrosterProfile.Builder(java.util.List<java.util.Set<androidx.car.app.hardware.common.CarZone!>!>);
+    method public androidx.car.app.hardware.climate.MaxDefrosterProfile build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(5) public final class RegisterClimateStateRequest {
+    method public java.util.List<androidx.car.app.hardware.climate.CarClimateFeature!> getClimateRegisterFeatures();
+  }
+
+  public static final class RegisterClimateStateRequest.Builder {
+    ctor public RegisterClimateStateRequest.Builder(boolean);
+    method public androidx.car.app.hardware.climate.RegisterClimateStateRequest.Builder addClimateRegisterFeatures(androidx.car.app.hardware.climate.CarClimateFeature!...);
+    method public androidx.car.app.hardware.climate.RegisterClimateStateRequest build();
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class SeatTemperatureProfile {
+    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!> getCarZoneSetsToSeatTemperatureValues();
+  }
+
+  public static final class SeatTemperatureProfile.Builder {
+    ctor public SeatTemperatureProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!>);
+    method public androidx.car.app.hardware.climate.SeatTemperatureProfile build();
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class SeatVentilationProfile {
+    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!> getCarZoneSetsToSeatVentilationValues();
+  }
+
+  public static final class SeatVentilationProfile.Builder {
+    ctor public SeatVentilationProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!>);
+    method public androidx.car.app.hardware.climate.SeatVentilationProfile build();
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class SteeringWheelHeatProfile {
+    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!> getCarZoneSetsToSteeringWheelHeatValues();
+  }
+
+  public static final class SteeringWheelHeatProfile.Builder {
+    ctor public SteeringWheelHeatProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!>);
+    method public androidx.car.app.hardware.climate.SteeringWheelHeatProfile build();
+  }
+
+}
+
+package androidx.car.app.hardware.common {
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(5) public interface CarSetOperationStatusCallback {
+    method public default void onSetCarClimateStateCabinTemperature(int);
+    method public default void onSetCarClimateStateDefroster(int);
+    method public default void onSetCarClimateStateElectricDefroster(int);
+    method public default void onSetCarClimateStateFanDirection(int);
+    method public default void onSetCarClimateStateFanSpeedLevel(int);
+    method public default void onSetCarClimateStateHvacAc(int);
+    method public default void onSetCarClimateStateHvacAutoMode(int);
+    method public default void onSetCarClimateStateHvacAutoRecirculation(int);
+    method public default void onSetCarClimateStateHvacDualMode(int);
+    method public default void onSetCarClimateStateHvacMaxAcMode(int);
+    method public default void onSetCarClimateStateHvacPower(int);
+    method public default void onSetCarClimateStateHvacRecirculation(int);
+    method public default void onSetCarClimateStateMaxDefroster(int);
+    method public default void onSetCarClimateStateSeatTemperatureLevel(int);
+    method public default void onSetCarClimateStateSeatVentilationLevel(int);
+    method public default void onSetCarClimateStateSteeringWheelHeat(int);
+    method public static String toString(int);
+    field public static final int OPERATION_STATUS_FEATURE_SETTING_NOT_ALLOWED = 4; // 0x4
+    field public static final int OPERATION_STATUS_FEATURE_TEMPORARILY_UNAVAILABLE = 3; // 0x3
+    field public static final int OPERATION_STATUS_FEATURE_UNIMPLEMENTED = 1; // 0x1
+    field public static final int OPERATION_STATUS_FEATURE_UNSUPPORTED = 2; // 0x2
+    field public static final int OPERATION_STATUS_ILLEGAL_CAR_HARDWARE_STATE = 7; // 0x7
+    field public static final int OPERATION_STATUS_INSUFFICIENT_PERMISSION = 6; // 0x6
+    field public static final int OPERATION_STATUS_SUCCESS = 0; // 0x0
+    field public static final int OPERATION_STATUS_UNSUPPORTED_VALUE = 5; // 0x5
+    field public static final int OPERATION_STATUS_UPDATE_TIMEOUT = 8; // 0x8
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarUnit {
+    method public static String toString(int);
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int IMPERIAL_GALLON = 204; // 0xcc
+    field public static final int KILOMETER = 3; // 0x3
+    field public static final int KILOMETERS_PER_HOUR = 102; // 0x66
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int LITER = 202; // 0xca
+    field public static final int METER = 2; // 0x2
+    field public static final int METERS_PER_SEC = 101; // 0x65
+    field public static final int MILE = 4; // 0x4
+    field public static final int MILES_PER_HOUR = 103; // 0x67
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int MILLILITER = 201; // 0xc9
+    field public static final int MILLIMETER = 1; // 0x1
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int US_GALLON = 203; // 0xcb
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarValue<T> {
+    ctor public CarValue(T?, long, int);
+    ctor @androidx.car.app.annotations.ExperimentalCarApi public CarValue(T?, long, int, java.util.List<androidx.car.app.hardware.common.CarZone!>);
+    method @androidx.car.app.annotations.ExperimentalCarApi public java.util.List<androidx.car.app.hardware.common.CarZone!> getCarZones();
+    method public int getStatus();
+    method public long getTimestampMillis();
+    method public T? getValue();
+    field public static final int STATUS_SUCCESS = 1; // 0x1
+    field public static final int STATUS_UNAVAILABLE = 3; // 0x3
+    field public static final int STATUS_UNIMPLEMENTED = 2; // 0x2
+    field public static final int STATUS_UNKNOWN = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(5) public final class CarZone {
+    method public int getColumn();
+    method public int getRow();
+    field public static final int CAR_ZONE_COLUMN_ALL = 16; // 0x10
+    field public static final int CAR_ZONE_COLUMN_CENTER = 48; // 0x30
+    field public static final int CAR_ZONE_COLUMN_DRIVER = 80; // 0x50
+    field public static final int CAR_ZONE_COLUMN_LEFT = 32; // 0x20
+    field public static final int CAR_ZONE_COLUMN_PASSENGER = 96; // 0x60
+    field public static final int CAR_ZONE_COLUMN_RIGHT = 64; // 0x40
+    field public static final androidx.car.app.hardware.common.CarZone CAR_ZONE_GLOBAL;
+    field public static final int CAR_ZONE_ROW_ALL = 0; // 0x0
+    field public static final int CAR_ZONE_ROW_EXCLUDE_FIRST = 4; // 0x4
+    field public static final int CAR_ZONE_ROW_FIRST = 1; // 0x1
+    field public static final int CAR_ZONE_ROW_SECOND = 2; // 0x2
+    field public static final int CAR_ZONE_ROW_THIRD = 3; // 0x3
+  }
+
+  public static final class CarZone.Builder {
+    ctor public CarZone.Builder();
+    method public androidx.car.app.hardware.common.CarZone build();
+    method public androidx.car.app.hardware.common.CarZone.Builder setColumn(int);
+    method public androidx.car.app.hardware.common.CarZone.Builder setRow(int);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public interface OnCarDataAvailableListener<T> {
+    method public void onCarDataAvailable(T);
+  }
+
+}
+
+package androidx.car.app.hardware.info {
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Accelerometer {
+    ctor public Accelerometer(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getForces();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarHardwareLocation {
+    ctor public CarHardwareLocation(androidx.car.app.hardware.common.CarValue<android.location.Location!>);
+    method public androidx.car.app.hardware.common.CarValue<android.location.Location!> getLocation();
+  }
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarInfo {
+    method public void addEnergyLevelListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyLevel!>);
+    method @androidx.car.app.annotations.ExperimentalCarApi public void addEvStatusListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EvStatus!>);
+    method public void addMileageListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Mileage!>);
+    method public void addSpeedListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Speed!>);
+    method public void addTollListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.TollCard!>);
+    method public void fetchEnergyProfile(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyProfile!>);
+    method public void fetchModel(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Model!>);
+    method public void removeEnergyLevelListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyLevel!>);
+    method @androidx.car.app.annotations.ExperimentalCarApi public void removeEvStatusListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EvStatus!>);
+    method public void removeMileageListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Mileage!>);
+    method public void removeSpeedListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Speed!>);
+    method public void removeTollListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.TollCard!>);
+  }
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarSensors {
+    method public void addAccelerometerListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Accelerometer!>);
+    method public void addCarHardwareLocationListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.CarHardwareLocation!>);
+    method public void addCompassListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Compass!>);
+    method public void addGyroscopeListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Gyroscope!>);
+    method public void removeAccelerometerListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Accelerometer!>);
+    method public void removeCarHardwareLocationListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.CarHardwareLocation!>);
+    method public void removeCompassListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Compass!>);
+    method public void removeGyroscopeListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Gyroscope!>);
+    field public static final int UPDATE_RATE_FASTEST = 3; // 0x3
+    field public static final int UPDATE_RATE_NORMAL = 1; // 0x1
+    field public static final int UPDATE_RATE_UI = 2; // 0x2
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Compass {
+    ctor public Compass(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getOrientations();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyLevel {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getBatteryPercent();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Boolean!> getEnergyIsLow();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getFuelPercent();
+    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getFuelVolumeDisplayUnit();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getRangeRemainingMeters();
+  }
+
+  public static final class EnergyLevel.Builder {
+    ctor public EnergyLevel.Builder();
+    method public androidx.car.app.hardware.info.EnergyLevel build();
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setBatteryPercent(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setDistanceDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setEnergyIsLow(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setFuelPercent(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.hardware.info.EnergyLevel.Builder setFuelVolumeDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setRangeRemainingMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyProfile {
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!> getEvConnectorTypes();
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!> getFuelTypes();
+    field public static final int EVCONNECTOR_TYPE_CHADEMO = 3; // 0x3
+    field public static final int EVCONNECTOR_TYPE_COMBO_1 = 4; // 0x4
+    field public static final int EVCONNECTOR_TYPE_COMBO_2 = 5; // 0x5
+    field public static final int EVCONNECTOR_TYPE_GBT = 9; // 0x9
+    field public static final int EVCONNECTOR_TYPE_GBT_DC = 10; // 0xa
+    field public static final int EVCONNECTOR_TYPE_J1772 = 1; // 0x1
+    field public static final int EVCONNECTOR_TYPE_MENNEKES = 2; // 0x2
+    field public static final int EVCONNECTOR_TYPE_OTHER = 101; // 0x65
+    field public static final int EVCONNECTOR_TYPE_SCAME = 11; // 0xb
+    field public static final int EVCONNECTOR_TYPE_TESLA_HPWC = 7; // 0x7
+    field public static final int EVCONNECTOR_TYPE_TESLA_ROADSTER = 6; // 0x6
+    field public static final int EVCONNECTOR_TYPE_TESLA_SUPERCHARGER = 8; // 0x8
+    field public static final int EVCONNECTOR_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int FUEL_TYPE_BIODIESEL = 5; // 0x5
+    field public static final int FUEL_TYPE_CNG = 8; // 0x8
+    field public static final int FUEL_TYPE_DIESEL_1 = 3; // 0x3
+    field public static final int FUEL_TYPE_DIESEL_2 = 4; // 0x4
+    field public static final int FUEL_TYPE_E85 = 6; // 0x6
+    field public static final int FUEL_TYPE_ELECTRIC = 10; // 0xa
+    field public static final int FUEL_TYPE_HYDROGEN = 11; // 0xb
+    field public static final int FUEL_TYPE_LEADED = 2; // 0x2
+    field public static final int FUEL_TYPE_LNG = 9; // 0x9
+    field public static final int FUEL_TYPE_LPG = 7; // 0x7
+    field public static final int FUEL_TYPE_OTHER = 12; // 0xc
+    field public static final int FUEL_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int FUEL_TYPE_UNLEADED = 1; // 0x1
+  }
+
+  public static final class EnergyProfile.Builder {
+    ctor public EnergyProfile.Builder();
+    method public androidx.car.app.hardware.info.EnergyProfile build();
+    method public androidx.car.app.hardware.info.EnergyProfile.Builder setEvConnectorTypes(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!>);
+    method public androidx.car.app.hardware.info.EnergyProfile.Builder setFuelTypes(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi public class EvStatus {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Boolean!> getEvChargePortConnected();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Boolean!> getEvChargePortOpen();
+  }
+
+  public static final class EvStatus.Builder {
+    ctor public EvStatus.Builder();
+    method public androidx.car.app.hardware.info.EvStatus build();
+    method public androidx.car.app.hardware.info.EvStatus.Builder setEvChargePortConnected(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public androidx.car.app.hardware.info.EvStatus.Builder setEvChargePortOpen(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Gyroscope {
+    ctor public Gyroscope(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getRotations();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Mileage {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getOdometerMeters();
+  }
+
+  public static final class Mileage.Builder {
+    ctor public Mileage.Builder();
+    method public androidx.car.app.hardware.info.Mileage build();
+    method public androidx.car.app.hardware.info.Mileage.Builder setDistanceDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public androidx.car.app.hardware.info.Mileage.Builder setOdometerMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Model {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.String!> getManufacturer();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.String!> getName();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getYear();
+  }
+
+  public static final class Model.Builder {
+    ctor public Model.Builder();
+    method public androidx.car.app.hardware.info.Model build();
+    method public androidx.car.app.hardware.info.Model.Builder setManufacturer(androidx.car.app.hardware.common.CarValue<java.lang.String!>);
+    method public androidx.car.app.hardware.info.Model.Builder setName(androidx.car.app.hardware.common.CarValue<java.lang.String!>);
+    method public androidx.car.app.hardware.info.Model.Builder setYear(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Speed {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getDisplaySpeedMetersPerSecond();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getRawSpeedMetersPerSecond();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getSpeedDisplayUnit();
+  }
+
+  public static final class Speed.Builder {
+    ctor public Speed.Builder();
+    method public androidx.car.app.hardware.info.Speed build();
+    method public androidx.car.app.hardware.info.Speed.Builder setDisplaySpeedMetersPerSecond(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.Speed.Builder setRawSpeedMetersPerSecond(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.Speed.Builder setSpeedDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class TollCard {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getCardState();
+    field public static final int TOLLCARD_STATE_INVALID = 2; // 0x2
+    field public static final int TOLLCARD_STATE_NOT_INSERTED = 3; // 0x3
+    field public static final int TOLLCARD_STATE_UNKNOWN = 0; // 0x0
+    field public static final int TOLLCARD_STATE_VALID = 1; // 0x1
+  }
+
+  public static final class TollCard.Builder {
+    ctor public TollCard.Builder();
+    method public androidx.car.app.hardware.info.TollCard build();
+    method public androidx.car.app.hardware.info.TollCard.Builder setCardState(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+}
+
+package androidx.car.app.managers {
+
+  public interface Manager {
+  }
+
+}
+
+package androidx.car.app.media {
+
+  @androidx.car.app.annotations.RequiresCarApi(5) public interface CarAudioCallback {
+    method public void onStopRecording();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public class CarAudioCallbackDelegate {
+    method public void onStopRecording();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(5) public abstract class CarAudioRecord {
+    method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public static androidx.car.app.media.CarAudioRecord create(androidx.car.app.CarContext);
+    method public int read(byte[], int, int);
+    method public void startRecording();
+    method public void stopRecording();
+    field public static final int AUDIO_CONTENT_BUFFER_SIZE = 512; // 0x200
+    field public static final String AUDIO_CONTENT_MIME = "audio/l16";
+    field public static final int AUDIO_CONTENT_SAMPLING_RATE = 16000; // 0x3e80
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class OpenMicrophoneRequest {
+    method public androidx.car.app.media.CarAudioCallbackDelegate getCarAudioCallbackDelegate();
+  }
+
+  public static final class OpenMicrophoneRequest.Builder {
+    ctor public OpenMicrophoneRequest.Builder(androidx.car.app.media.CarAudioCallback);
+    method public androidx.car.app.media.OpenMicrophoneRequest build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class OpenMicrophoneResponse {
+    method public androidx.car.app.media.CarAudioCallbackDelegate getCarAudioCallback();
+    method public java.io.InputStream getCarMicrophoneInputStream();
+  }
+
+  public static final class OpenMicrophoneResponse.Builder {
+    ctor public OpenMicrophoneResponse.Builder(androidx.car.app.media.CarAudioCallback);
+    method public androidx.car.app.media.OpenMicrophoneResponse build();
+    method public androidx.car.app.media.OpenMicrophoneResponse.Builder setCarMicrophoneDescriptor(android.os.ParcelFileDescriptor);
+  }
+
+}
+
+package androidx.car.app.model {
+
+  @androidx.car.app.annotations.CarProtocol public final class Action {
+    method public androidx.car.app.model.CarColor? getBackgroundColor();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public int getFlags();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public int getType();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public boolean isEnabled();
+    method public boolean isStandard();
+    method public static String typeToString(int);
+    field public static final androidx.car.app.model.Action APP_ICON;
+    field public static final androidx.car.app.model.Action BACK;
+    field @androidx.car.app.annotations.RequiresCarApi(5) public static final int FLAG_DEFAULT = 4; // 0x4
+    field @androidx.car.app.annotations.RequiresCarApi(5) public static final int FLAG_IS_PERSISTENT = 2; // 0x2
+    field @androidx.car.app.annotations.RequiresCarApi(4) public static final int FLAG_PRIMARY = 1; // 0x1
+    field public static final androidx.car.app.model.Action PAN;
+    field public static final int TYPE_APP_ICON = 65538; // 0x10002
+    field public static final int TYPE_BACK = 65539; // 0x10003
+    field public static final int TYPE_CUSTOM = 1; // 0x1
+    field public static final int TYPE_PAN = 65540; // 0x10004
+  }
+
+  public static final class Action.Builder {
+    ctor public Action.Builder();
+    ctor @androidx.car.app.annotations.RequiresCarApi(2) public Action.Builder(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Action build();
+    method public androidx.car.app.model.Action.Builder setBackgroundColor(androidx.car.app.model.CarColor);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Action.Builder setEnabled(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.Action.Builder setFlags(int);
+    method public androidx.car.app.model.Action.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Action.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.Action.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Action.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ActionStrip {
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.Action? getFirstActionOfType(int);
+  }
+
+  public static final class ActionStrip.Builder {
+    ctor public ActionStrip.Builder();
+    method public androidx.car.app.model.ActionStrip.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.ActionStrip build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class Alert {
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.AlertCallbackDelegate? getCallbackDelegate();
+    method public long getDurationMillis();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public int getId();
+    method public androidx.car.app.model.CarText? getSubtitle();
+    method public androidx.car.app.model.CarText getTitle();
+  }
+
+  public static final class Alert.Builder {
+    ctor public Alert.Builder(int, androidx.car.app.model.CarText, long);
+    method public androidx.car.app.model.Alert.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Alert build();
+    method public androidx.car.app.model.Alert.Builder setCallback(androidx.car.app.model.AlertCallback);
+    method public androidx.car.app.model.Alert.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Alert.Builder setSubtitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public interface AlertCallback {
+    method public void onCancel(int);
+    method public void onDismiss();
+    field public static final int REASON_NOT_SUPPORTED = 3; // 0x3
+    field public static final int REASON_TIMEOUT = 1; // 0x1
+    field public static final int REASON_USER_ACTION = 2; // 0x2
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public interface AlertCallbackDelegate {
+    method public void sendCancel(int, androidx.car.app.OnDoneCallback);
+    method public void sendDismiss(androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarColor {
+    method public static androidx.car.app.model.CarColor createCustom(@ColorInt int, @ColorInt int);
+    method @ColorInt public int getColor();
+    method @ColorInt public int getColorDark();
+    method public int getType();
+    field public static final androidx.car.app.model.CarColor BLUE;
+    field public static final androidx.car.app.model.CarColor DEFAULT;
+    field public static final androidx.car.app.model.CarColor GREEN;
+    field public static final androidx.car.app.model.CarColor PRIMARY;
+    field public static final androidx.car.app.model.CarColor RED;
+    field public static final androidx.car.app.model.CarColor SECONDARY;
+    field public static final int TYPE_BLUE = 6; // 0x6
+    field public static final int TYPE_CUSTOM = 0; // 0x0
+    field public static final int TYPE_DEFAULT = 1; // 0x1
+    field public static final int TYPE_GREEN = 5; // 0x5
+    field public static final int TYPE_PRIMARY = 2; // 0x2
+    field public static final int TYPE_RED = 4; // 0x4
+    field public static final int TYPE_SECONDARY = 3; // 0x3
+    field public static final int TYPE_YELLOW = 7; // 0x7
+    field public static final androidx.car.app.model.CarColor YELLOW;
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarIcon {
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public androidx.car.app.model.CarColor? getTint();
+    method public int getType();
+    field public static final androidx.car.app.model.CarIcon ALERT;
+    field public static final androidx.car.app.model.CarIcon APP_ICON;
+    field public static final androidx.car.app.model.CarIcon BACK;
+    field public static final androidx.car.app.model.CarIcon ERROR;
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final androidx.car.app.model.CarIcon PAN;
+    field public static final int TYPE_ALERT = 4; // 0x4
+    field public static final int TYPE_APP_ICON = 5; // 0x5
+    field public static final int TYPE_BACK = 3; // 0x3
+    field public static final int TYPE_CUSTOM = 1; // 0x1
+    field public static final int TYPE_ERROR = 6; // 0x6
+    field public static final int TYPE_PAN = 7; // 0x7
+  }
+
+  public static final class CarIcon.Builder {
+    ctor public CarIcon.Builder(androidx.core.graphics.drawable.IconCompat);
+    ctor public CarIcon.Builder(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.CarIcon build();
+    method public androidx.car.app.model.CarIcon.Builder setTint(androidx.car.app.model.CarColor);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarIconSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.CarIconSpan create(androidx.car.app.model.CarIcon);
+    method public static androidx.car.app.model.CarIconSpan create(androidx.car.app.model.CarIcon, int);
+    method public int getAlignment();
+    method public androidx.car.app.model.CarIcon getIcon();
+    field public static final int ALIGN_BASELINE = 1; // 0x1
+    field public static final int ALIGN_BOTTOM = 0; // 0x0
+    field public static final int ALIGN_CENTER = 2; // 0x2
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarLocation {
+    method public static androidx.car.app.model.CarLocation create(double, double);
+    method public static androidx.car.app.model.CarLocation create(android.location.Location);
+    method public double getLatitude();
+    method public double getLongitude();
+  }
+
+  @Keep @androidx.car.app.annotations.CarProtocol public class CarSpan extends android.text.style.CharacterStyle {
+    ctor public CarSpan();
+    method public void updateDrawState(android.text.TextPaint);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarText {
+    method public static androidx.car.app.model.CarText create(CharSequence);
+    method public java.util.List<java.lang.CharSequence!> getVariants();
+    method public boolean isEmpty();
+    method public static boolean isNullOrEmpty(androidx.car.app.model.CarText?);
+    method public CharSequence toCharSequence();
+  }
+
+  public static final class CarText.Builder {
+    ctor public CarText.Builder(CharSequence);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.CarText.Builder addVariant(CharSequence);
+    method public androidx.car.app.model.CarText build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public final class ClickableSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.ClickableSpan create(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.OnClickDelegate getOnClickDelegate();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DateTimeWithZone {
+    method public static androidx.car.app.model.DateTimeWithZone create(long, @IntRange(from=0xffff02e0, to=64800) int, String);
+    method public static androidx.car.app.model.DateTimeWithZone create(long, java.util.TimeZone);
+    method @RequiresApi(26) public static androidx.car.app.model.DateTimeWithZone create(java.time.ZonedDateTime);
+    method public long getTimeSinceEpochMillis();
+    method public int getZoneOffsetSeconds();
+    method public String? getZoneShortName();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Distance {
+    method public static androidx.car.app.model.Distance create(double, int);
+    method public double getDisplayDistance();
+    method public int getDisplayUnit();
+    field public static final int UNIT_FEET = 6; // 0x6
+    field public static final int UNIT_KILOMETERS = 2; // 0x2
+    field public static final int UNIT_KILOMETERS_P1 = 3; // 0x3
+    field public static final int UNIT_METERS = 1; // 0x1
+    field public static final int UNIT_MILES = 4; // 0x4
+    field public static final int UNIT_MILES_P1 = 5; // 0x5
+    field public static final int UNIT_YARDS = 7; // 0x7
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DistanceSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.DistanceSpan create(androidx.car.app.model.Distance);
+    method public androidx.car.app.model.Distance getDistance();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DurationSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.DurationSpan create(long);
+    method @RequiresApi(26) public static androidx.car.app.model.DurationSpan create(java.time.Duration);
+    method public long getDurationSeconds();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ForegroundCarColorSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.ForegroundCarColorSpan create(androidx.car.app.model.CarColor);
+    method public androidx.car.app.model.CarColor getColor();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class GridItem implements androidx.car.app.model.Item {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public int getImageType();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public androidx.car.app.model.CarText? getText();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+    field public static final int IMAGE_TYPE_ICON = 1; // 0x1
+    field public static final int IMAGE_TYPE_LARGE = 2; // 0x2
+  }
+
+  public static final class GridItem.Builder {
+    ctor public GridItem.Builder();
+    method public androidx.car.app.model.GridItem build();
+    method public androidx.car.app.model.GridItem.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.GridItem.Builder setImage(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.GridItem.Builder setLoading(boolean);
+    method public androidx.car.app.model.GridItem.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.GridItem.Builder setText(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setText(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.GridItem.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class GridTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getSingleList();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class GridTemplate.Builder {
+    ctor public GridTemplate.Builder();
+    method public androidx.car.app.model.GridTemplate build();
+    method public androidx.car.app.model.GridTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.GridTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.GridTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.GridTemplate.Builder setSingleList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.GridTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class Header {
+    method public java.util.List<androidx.car.app.model.Action!> getEndHeaderActions();
+    method public androidx.car.app.model.Action? getStartHeaderAction();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  public static final class Header.Builder {
+    ctor public Header.Builder();
+    method public androidx.car.app.model.Header.Builder addEndHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Header build();
+    method public androidx.car.app.model.Header.Builder setStartHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Header.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Header.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallback {
+    method public default void onInputSubmitted(String);
+    method public default void onInputTextChanged(String);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallbackDelegate {
+    method public void sendInputSubmitted(String, androidx.car.app.OnDoneCallback);
+    method public void sendInputTextChanged(String, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface Item {
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ItemList {
+    method public java.util.List<androidx.car.app.model.Item!> getItems();
+    method public androidx.car.app.model.CarText? getNoItemsMessage();
+    method public androidx.car.app.model.OnItemVisibilityChangedDelegate? getOnItemVisibilityChangedDelegate();
+    method public androidx.car.app.model.OnSelectedDelegate? getOnSelectedDelegate();
+    method public int getSelectedIndex();
+  }
+
+  public static final class ItemList.Builder {
+    ctor public ItemList.Builder();
+    method public androidx.car.app.model.ItemList.Builder addItem(androidx.car.app.model.Item);
+    method public androidx.car.app.model.ItemList build();
+    method public androidx.car.app.model.ItemList.Builder setNoItemsMessage(CharSequence);
+    method public androidx.car.app.model.ItemList.Builder setOnItemsVisibilityChangedListener(androidx.car.app.model.ItemList.OnItemVisibilityChangedListener);
+    method public androidx.car.app.model.ItemList.Builder setOnSelectedListener(androidx.car.app.model.ItemList.OnSelectedListener);
+    method public androidx.car.app.model.ItemList.Builder setSelectedIndex(@IntRange(from=0) int);
+  }
+
+  public static interface ItemList.OnItemVisibilityChangedListener {
+    method public void onItemVisibilityChanged(int, int);
+  }
+
+  public static interface ItemList.OnSelectedListener {
+    method public void onSelected(int);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ListTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public java.util.List<androidx.car.app.model.SectionedItemList!> getSectionedLists();
+    method public androidx.car.app.model.ItemList? getSingleList();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class ListTemplate.Builder {
+    ctor public ListTemplate.Builder();
+    method public androidx.car.app.model.ListTemplate.Builder addSectionedList(androidx.car.app.model.SectionedItemList);
+    method public androidx.car.app.model.ListTemplate build();
+    method public androidx.car.app.model.ListTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.ListTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.ListTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.ListTemplate.Builder setSingleList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.ListTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class LongMessageTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText getMessage();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class LongMessageTemplate.Builder {
+    ctor public LongMessageTemplate.Builder(CharSequence);
+    method public androidx.car.app.model.LongMessageTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate build();
+    method public androidx.car.app.model.LongMessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class MessageTemplate implements androidx.car.app.model.Template {
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.CarText? getDebugMessage();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public androidx.car.app.model.CarText getMessage();
+    method public androidx.car.app.model.CarText? getTitle();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public boolean isLoading();
+  }
+
+  public static final class MessageTemplate.Builder {
+    ctor public MessageTemplate.Builder(CharSequence);
+    ctor public MessageTemplate.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.MessageTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.MessageTemplate build();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(Throwable);
+    method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(String);
+    method public androidx.car.app.model.MessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.MessageTemplate.Builder setIcon(androidx.car.app.model.CarIcon);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.MessageTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Metadata {
+    method public androidx.car.app.model.Place? getPlace();
+    field public static final androidx.car.app.model.Metadata EMPTY_METADATA;
+  }
+
+  public static final class Metadata.Builder {
+    ctor public Metadata.Builder();
+    ctor public Metadata.Builder(androidx.car.app.model.Metadata);
+    method public androidx.car.app.model.Metadata build();
+    method public androidx.car.app.model.Metadata.Builder setPlace(androidx.car.app.model.Place);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnCheckedChangeDelegate {
+    method public void sendCheckedChange(boolean, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnClickDelegate {
+    method public boolean isParkedOnly();
+    method public void sendClick(androidx.car.app.OnDoneCallback);
+  }
+
+  public interface OnClickListener {
+    method public void onClick();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public interface OnContentRefreshDelegate {
+    method public void sendContentRefreshRequested(androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(5) public interface OnContentRefreshListener {
+    method public void onContentRefreshRequested();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnItemVisibilityChangedDelegate {
+    method public void sendItemVisibilityChanged(int, int, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnSelectedDelegate {
+    method public void sendSelected(int, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Pane {
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.CarIcon? getImage();
+    method public java.util.List<androidx.car.app.model.Row!> getRows();
+    method public boolean isLoading();
+  }
+
+  public static final class Pane.Builder {
+    ctor public Pane.Builder();
+    method public androidx.car.app.model.Pane.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Pane.Builder addRow(androidx.car.app.model.Row);
+    method public androidx.car.app.model.Pane build();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.Pane.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Pane.Builder setLoading(boolean);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PaneTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.Pane getPane();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  public static final class PaneTemplate.Builder {
+    ctor public PaneTemplate.Builder(androidx.car.app.model.Pane);
+    method public androidx.car.app.model.PaneTemplate build();
+    method public androidx.car.app.model.PaneTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.PaneTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.PaneTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ParkedOnlyOnClickListener implements androidx.car.app.model.OnClickListener {
+    method public static androidx.car.app.model.ParkedOnlyOnClickListener create(androidx.car.app.model.OnClickListener);
+    method public void onClick();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Place {
+    method public androidx.car.app.model.CarLocation getLocation();
+    method public androidx.car.app.model.PlaceMarker? getMarker();
+  }
+
+  public static final class Place.Builder {
+    ctor public Place.Builder(androidx.car.app.model.CarLocation);
+    ctor public Place.Builder(androidx.car.app.model.Place);
+    method public androidx.car.app.model.Place build();
+    method public androidx.car.app.model.Place.Builder setMarker(androidx.car.app.model.PlaceMarker);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceListMapTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Place? getAnchor();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.OnContentRefreshDelegate? getOnContentRefreshDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isCurrentLocationEnabled();
+    method public boolean isLoading();
+  }
+
+  public static final class PlaceListMapTemplate.Builder {
+    ctor public PlaceListMapTemplate.Builder();
+    method public androidx.car.app.model.PlaceListMapTemplate build();
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setAnchor(androidx.car.app.model.Place);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setCurrentLocationEnabled(boolean);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.PlaceListMapTemplate.Builder setOnContentRefreshListener(androidx.car.app.model.OnContentRefreshListener);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceMarker {
+    method public androidx.car.app.model.CarColor? getColor();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public int getIconType();
+    method public androidx.car.app.model.CarText? getLabel();
+    field public static final int TYPE_ICON = 0; // 0x0
+    field public static final int TYPE_IMAGE = 1; // 0x1
+  }
+
+  public static final class PlaceMarker.Builder {
+    ctor public PlaceMarker.Builder();
+    method public androidx.car.app.model.PlaceMarker build();
+    method public androidx.car.app.model.PlaceMarker.Builder setColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.model.PlaceMarker.Builder setIcon(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.PlaceMarker.Builder setLabel(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Row implements androidx.car.app.model.Item {
+    method @androidx.car.app.annotations.ExperimentalCarApi public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.Metadata? getMetadata();
+    method @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(6) public int getNumericDecoration();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public int getRowImageType();
+    method public java.util.List<androidx.car.app.model.CarText!> getTexts();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public androidx.car.app.model.Toggle? getToggle();
+    method public boolean isBrowsable();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public boolean isEnabled();
+    method public androidx.car.app.model.Row row();
+    method public CharSequence yourBoat();
+    field public static final int IMAGE_TYPE_ICON = 4; // 0x4
+    field public static final int IMAGE_TYPE_LARGE = 2; // 0x2
+    field public static final int IMAGE_TYPE_SMALL = 1; // 0x1
+    field public static final int NO_DECORATION = -1; // 0xffffffff
+  }
+
+  public static final class Row.Builder {
+    ctor public Row.Builder();
+    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.model.Row.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Row.Builder addText(CharSequence);
+    method public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.Row build();
+    method public androidx.car.app.model.Row.Builder setBrowsable(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Row.Builder setEnabled(boolean);
+    method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.Row.Builder setMetadata(androidx.car.app.model.Metadata);
+    method @IntRange(from=0) @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(6) public androidx.car.app.model.Row.Builder setNumericDecoration(int);
+    method public androidx.car.app.model.Row.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.Row.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.Row.Builder setToggle(androidx.car.app.model.Toggle);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface SearchCallbackDelegate {
+    method public void sendSearchSubmitted(String, androidx.car.app.OnDoneCallback);
+    method public void sendSearchTextChanged(String, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SearchTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public String? getInitialSearchText();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method public androidx.car.app.model.SearchCallbackDelegate getSearchCallbackDelegate();
+    method public String? getSearchHint();
+    method public boolean isLoading();
+    method public boolean isShowKeyboardByDefault();
+  }
+
+  public static final class SearchTemplate.Builder {
+    ctor public SearchTemplate.Builder(androidx.car.app.model.SearchTemplate.SearchCallback);
+    method public androidx.car.app.model.SearchTemplate build();
+    method public androidx.car.app.model.SearchTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.SearchTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.SearchTemplate.Builder setInitialSearchText(String);
+    method public androidx.car.app.model.SearchTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.SearchTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.SearchTemplate.Builder setSearchHint(String);
+    method public androidx.car.app.model.SearchTemplate.Builder setShowKeyboardByDefault(boolean);
+  }
+
+  public static interface SearchTemplate.SearchCallback {
+    method public default void onSearchSubmitted(String);
+    method public default void onSearchTextChanged(String);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SectionedItemList {
+    method public static androidx.car.app.model.SectionedItemList create(androidx.car.app.model.ItemList, CharSequence);
+    method public androidx.car.app.model.CarText getHeader();
+    method public androidx.car.app.model.ItemList getItemList();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface Template {
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TemplateInfo {
+    ctor public TemplateInfo(Class<? extends androidx.car.app.model.Template>, String);
+    method public Class<? extends androidx.car.app.model.Template> getTemplateClass();
+    method public String getTemplateId();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TemplateWrapper {
+    method public static androidx.car.app.model.TemplateWrapper copyOf(androidx.car.app.model.TemplateWrapper);
+    method public int getCurrentTaskStep();
+    method public String getId();
+    method public androidx.car.app.model.Template getTemplate();
+    method public java.util.List<androidx.car.app.model.TemplateInfo!> getTemplateInfosForScreenStack();
+    method public boolean isRefresh();
+    method public void setCurrentTaskStep(int);
+    method public void setId(String);
+    method public void setRefresh(boolean);
+    method public void setTemplate(androidx.car.app.model.Template);
+    method public static androidx.car.app.model.TemplateWrapper wrap(androidx.car.app.model.Template);
+    method public static androidx.car.app.model.TemplateWrapper wrap(androidx.car.app.model.Template, String);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Toggle {
+    method public androidx.car.app.model.OnCheckedChangeDelegate getOnCheckedChangeDelegate();
+    method public boolean isChecked();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public boolean isEnabled();
+  }
+
+  public static final class Toggle.Builder {
+    ctor public Toggle.Builder(androidx.car.app.model.Toggle.OnCheckedChangeListener);
+    method public androidx.car.app.model.Toggle build();
+    method public androidx.car.app.model.Toggle.Builder setChecked(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Toggle.Builder setEnabled(boolean);
+  }
+
+  public static interface Toggle.OnCheckedChangeListener {
+    method public void onCheckedChange(boolean);
+  }
+
+}
+
+package androidx.car.app.model.signin {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class InputSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    method public androidx.car.app.model.CarText? getDefaultValue();
+    method public androidx.car.app.model.CarText? getErrorMessage();
+    method public androidx.car.app.model.CarText? getHint();
+    method public androidx.car.app.model.InputCallbackDelegate getInputCallbackDelegate();
+    method public int getInputType();
+    method public int getKeyboardType();
+    method public boolean isShowKeyboardByDefault();
+    field public static final int INPUT_TYPE_DEFAULT = 1; // 0x1
+    field public static final int INPUT_TYPE_PASSWORD = 2; // 0x2
+    field public static final int KEYBOARD_DEFAULT = 1; // 0x1
+    field public static final int KEYBOARD_EMAIL = 2; // 0x2
+    field public static final int KEYBOARD_NUMBER = 4; // 0x4
+    field public static final int KEYBOARD_PHONE = 3; // 0x3
+  }
+
+  public static final class InputSignInMethod.Builder {
+    ctor public InputSignInMethod.Builder(androidx.car.app.model.InputCallback);
+    method public androidx.car.app.model.signin.InputSignInMethod build();
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setDefaultValue(String);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setErrorMessage(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setHint(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setInputType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setKeyboardType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setShowKeyboardByDefault(boolean);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class PinSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public PinSignInMethod(CharSequence);
+    method public androidx.car.app.model.CarText getPinCode();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class ProviderSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public ProviderSignInMethod(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Action getAction();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(4) public final class QRCodeSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public QRCodeSignInMethod(android.net.Uri);
+    method public android.net.Uri getUri();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class SignInTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.CarText? getAdditionalText();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText? getInstructions();
+    method public androidx.car.app.model.signin.SignInTemplate.SignInMethod getSignInMethod();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class SignInTemplate.Builder {
+    ctor public SignInTemplate.Builder(androidx.car.app.model.signin.SignInTemplate.SignInMethod);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate build();
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setAdditionalText(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setInstructions(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setTitle(CharSequence);
+  }
+
+  public static interface SignInTemplate.SignInMethod {
+  }
+
+}
+
+package androidx.car.app.navigation {
+
+  public class NavigationManager implements androidx.car.app.managers.Manager {
+    method @MainThread public void clearNavigationManagerCallback();
+    method @MainThread public void navigationEnded();
+    method @MainThread public void navigationStarted();
+    method @MainThread public void setNavigationManagerCallback(androidx.car.app.navigation.NavigationManagerCallback);
+    method @MainThread public void setNavigationManagerCallback(java.util.concurrent.Executor, androidx.car.app.navigation.NavigationManagerCallback);
+    method @MainThread public void updateTrip(androidx.car.app.navigation.model.Trip);
+  }
+
+  public interface NavigationManagerCallback {
+    method public default void onAutoDriveEnabled();
+    method public default void onStopNavigation();
+  }
+
+}
+
+package androidx.car.app.navigation.model {
+
+  @androidx.car.app.annotations.CarProtocol public final class Destination {
+    method public androidx.car.app.model.CarText? getAddress();
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.CarText? getName();
+  }
+
+  public static final class Destination.Builder {
+    ctor public Destination.Builder();
+    method public androidx.car.app.navigation.model.Destination build();
+    method public androidx.car.app.navigation.model.Destination.Builder setAddress(CharSequence);
+    method public androidx.car.app.navigation.model.Destination.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Destination.Builder setName(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Lane {
+    method public java.util.List<androidx.car.app.navigation.model.LaneDirection!> getDirections();
+  }
+
+  public static final class Lane.Builder {
+    ctor public Lane.Builder();
+    method public androidx.car.app.navigation.model.Lane.Builder addDirection(androidx.car.app.navigation.model.LaneDirection);
+    method public androidx.car.app.navigation.model.Lane build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class LaneDirection {
+    method public static androidx.car.app.navigation.model.LaneDirection create(int, boolean);
+    method public int getShape();
+    method public boolean isRecommended();
+    field public static final int SHAPE_NORMAL_LEFT = 5; // 0x5
+    field public static final int SHAPE_NORMAL_RIGHT = 6; // 0x6
+    field public static final int SHAPE_SHARP_LEFT = 7; // 0x7
+    field public static final int SHAPE_SHARP_RIGHT = 8; // 0x8
+    field public static final int SHAPE_SLIGHT_LEFT = 3; // 0x3
+    field public static final int SHAPE_SLIGHT_RIGHT = 4; // 0x4
+    field public static final int SHAPE_STRAIGHT = 2; // 0x2
+    field public static final int SHAPE_UNKNOWN = 1; // 0x1
+    field public static final int SHAPE_U_TURN_LEFT = 9; // 0x9
+    field public static final int SHAPE_U_TURN_RIGHT = 10; // 0xa
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Maneuver {
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public int getRoundaboutExitAngle();
+    method public int getRoundaboutExitNumber();
+    method public int getType();
+    field public static final int TYPE_DEPART = 1; // 0x1
+    field public static final int TYPE_DESTINATION = 39; // 0x27
+    field public static final int TYPE_DESTINATION_LEFT = 41; // 0x29
+    field public static final int TYPE_DESTINATION_RIGHT = 42; // 0x2a
+    field public static final int TYPE_DESTINATION_STRAIGHT = 40; // 0x28
+    field public static final int TYPE_FERRY_BOAT = 37; // 0x25
+    field public static final int TYPE_FERRY_BOAT_LEFT = 47; // 0x2f
+    field public static final int TYPE_FERRY_BOAT_RIGHT = 48; // 0x30
+    field public static final int TYPE_FERRY_TRAIN = 38; // 0x26
+    field public static final int TYPE_FERRY_TRAIN_LEFT = 49; // 0x31
+    field public static final int TYPE_FERRY_TRAIN_RIGHT = 50; // 0x32
+    field public static final int TYPE_FORK_LEFT = 25; // 0x19
+    field public static final int TYPE_FORK_RIGHT = 26; // 0x1a
+    field public static final int TYPE_KEEP_LEFT = 3; // 0x3
+    field public static final int TYPE_KEEP_RIGHT = 4; // 0x4
+    field public static final int TYPE_MERGE_LEFT = 27; // 0x1b
+    field public static final int TYPE_MERGE_RIGHT = 28; // 0x1c
+    field public static final int TYPE_MERGE_SIDE_UNSPECIFIED = 29; // 0x1d
+    field public static final int TYPE_NAME_CHANGE = 2; // 0x2
+    field public static final int TYPE_OFF_RAMP_NORMAL_LEFT = 23; // 0x17
+    field public static final int TYPE_OFF_RAMP_NORMAL_RIGHT = 24; // 0x18
+    field public static final int TYPE_OFF_RAMP_SLIGHT_LEFT = 21; // 0x15
+    field public static final int TYPE_OFF_RAMP_SLIGHT_RIGHT = 22; // 0x16
+    field public static final int TYPE_ON_RAMP_NORMAL_LEFT = 15; // 0xf
+    field public static final int TYPE_ON_RAMP_NORMAL_RIGHT = 16; // 0x10
+    field public static final int TYPE_ON_RAMP_SHARP_LEFT = 17; // 0x11
+    field public static final int TYPE_ON_RAMP_SHARP_RIGHT = 18; // 0x12
+    field public static final int TYPE_ON_RAMP_SLIGHT_LEFT = 13; // 0xd
+    field public static final int TYPE_ON_RAMP_SLIGHT_RIGHT = 14; // 0xe
+    field public static final int TYPE_ON_RAMP_U_TURN_LEFT = 19; // 0x13
+    field public static final int TYPE_ON_RAMP_U_TURN_RIGHT = 20; // 0x14
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW = 34; // 0x22
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW_WITH_ANGLE = 35; // 0x23
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW = 32; // 0x20
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW_WITH_ANGLE = 33; // 0x21
+    field public static final int TYPE_ROUNDABOUT_ENTER_CCW = 45; // 0x2d
+    field public static final int TYPE_ROUNDABOUT_ENTER_CW = 43; // 0x2b
+    field public static final int TYPE_ROUNDABOUT_EXIT_CCW = 46; // 0x2e
+    field public static final int TYPE_ROUNDABOUT_EXIT_CW = 44; // 0x2c
+    field public static final int TYPE_STRAIGHT = 36; // 0x24
+    field public static final int TYPE_TURN_NORMAL_LEFT = 7; // 0x7
+    field public static final int TYPE_TURN_NORMAL_RIGHT = 8; // 0x8
+    field public static final int TYPE_TURN_SHARP_LEFT = 9; // 0x9
+    field public static final int TYPE_TURN_SHARP_RIGHT = 10; // 0xa
+    field public static final int TYPE_TURN_SLIGHT_LEFT = 5; // 0x5
+    field public static final int TYPE_TURN_SLIGHT_RIGHT = 6; // 0x6
+    field public static final int TYPE_UNKNOWN = 0; // 0x0
+    field public static final int TYPE_U_TURN_LEFT = 11; // 0xb
+    field public static final int TYPE_U_TURN_RIGHT = 12; // 0xc
+  }
+
+  public static final class Maneuver.Builder {
+    ctor public Maneuver.Builder(int);
+    method public androidx.car.app.navigation.model.Maneuver build();
+    method public androidx.car.app.navigation.model.Maneuver.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Maneuver.Builder setRoundaboutExitAngle(@IntRange(from=1, to=360) int);
+    method public androidx.car.app.navigation.model.Maneuver.Builder setRoundaboutExitNumber(@IntRange(from=1) int);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class MapController {
+    method public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+  }
+
+  public static final class MapController.Builder {
+    ctor public MapController.Builder();
+    method public androidx.car.app.navigation.model.MapController build();
+    method public androidx.car.app.navigation.model.MapController.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.MapController.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class MapTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Header? getHeader();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method public androidx.car.app.navigation.model.MapController? getMapController();
+    method public androidx.car.app.model.Pane? getPane();
+  }
+
+  public static final class MapTemplate.Builder {
+    ctor public MapTemplate.Builder();
+    method public androidx.car.app.navigation.model.MapTemplate build();
+    method public androidx.car.app.navigation.model.MapTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.MapTemplate.Builder setHeader(androidx.car.app.model.Header);
+    method public androidx.car.app.navigation.model.MapTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.navigation.model.MapTemplate.Builder setMapController(androidx.car.app.navigation.model.MapController);
+    method public androidx.car.app.navigation.model.MapTemplate.Builder setPane(androidx.car.app.model.Pane);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class MessageInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.CarText? getText();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  public static final class MessageInfo.Builder {
+    ctor public MessageInfo.Builder(CharSequence);
+    ctor public MessageInfo.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.MessageInfo build();
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setText(CharSequence);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setText(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class NavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.CarColor? getBackgroundColor();
+    method public androidx.car.app.navigation.model.TravelEstimate? getDestinationTravelEstimate();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo? getNavigationInfo();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method @Deprecated @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.Toggle? getPanModeToggle();
+  }
+
+  public static final class NavigationTemplate.Builder {
+    ctor public NavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.NavigationTemplate build();
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setBackgroundColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setDestinationTravelEstimate(androidx.car.app.navigation.model.TravelEstimate);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setNavigationInfo(androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+  }
+
+  public static interface NavigationTemplate.NavigationInfo {
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public interface PanModeDelegate {
+    method public void sendPanModeChanged(boolean, androidx.car.app.OnDoneCallback);
+  }
+
+  public interface PanModeListener {
+    method public void onPanModeChanged(boolean);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceListNavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Header? getHeader();
+    method @Deprecated public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.model.OnContentRefreshDelegate? getOnContentRefreshDelegate();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method @Deprecated public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class PlaceListNavigationTemplate.Builder {
+    ctor public PlaceListNavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate build();
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setHeader(androidx.car.app.model.Header);
+    method @Deprecated public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setOnContentRefreshListener(androidx.car.app.model.OnContentRefreshListener);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+    method @Deprecated public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(CharSequence);
+    method @Deprecated public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class RoutePreviewNavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Header? getHeader();
+    method @Deprecated public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.model.Action? getNavigateAction();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method @Deprecated public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class RoutePreviewNavigationTemplate.Builder {
+    ctor public RoutePreviewNavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate build();
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setHeader(androidx.car.app.model.Header);
+    method @Deprecated public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setNavigateAction(androidx.car.app.model.Action);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+    method @Deprecated public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(CharSequence);
+    method @Deprecated public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class RoutingInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
+    method public androidx.car.app.model.Distance? getCurrentDistance();
+    method public androidx.car.app.navigation.model.Step? getCurrentStep();
+    method public androidx.car.app.model.CarIcon? getJunctionImage();
+    method public androidx.car.app.navigation.model.Step? getNextStep();
+    method public boolean isLoading();
+  }
+
+  public static final class RoutingInfo.Builder {
+    ctor public RoutingInfo.Builder();
+    method public androidx.car.app.navigation.model.RoutingInfo build();
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setCurrentStep(androidx.car.app.navigation.model.Step, androidx.car.app.model.Distance);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setJunctionImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setLoading(boolean);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setNextStep(androidx.car.app.navigation.model.Step);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Step {
+    method public androidx.car.app.model.CarText? getCue();
+    method public java.util.List<androidx.car.app.navigation.model.Lane!> getLanes();
+    method public androidx.car.app.model.CarIcon? getLanesImage();
+    method public androidx.car.app.navigation.model.Maneuver? getManeuver();
+    method public androidx.car.app.model.CarText? getRoad();
+  }
+
+  public static final class Step.Builder {
+    ctor public Step.Builder();
+    ctor public Step.Builder(CharSequence);
+    ctor public Step.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.Step.Builder addLane(androidx.car.app.navigation.model.Lane);
+    method public androidx.car.app.navigation.model.Step build();
+    method public androidx.car.app.navigation.model.Step.Builder setCue(CharSequence);
+    method public androidx.car.app.navigation.model.Step.Builder setLanesImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Step.Builder setManeuver(androidx.car.app.navigation.model.Maneuver);
+    method public androidx.car.app.navigation.model.Step.Builder setRoad(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TravelEstimate {
+    method public androidx.car.app.model.DateTimeWithZone? getArrivalTimeAtDestination();
+    method public androidx.car.app.model.Distance? getRemainingDistance();
+    method public androidx.car.app.model.CarColor? getRemainingDistanceColor();
+    method public androidx.car.app.model.CarColor? getRemainingTimeColor();
+    method public long getRemainingTimeSeconds();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.CarIcon? getTripIcon();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.CarText? getTripText();
+    field public static final long REMAINING_TIME_UNKNOWN = -1L; // 0xffffffffffffffffL
+  }
+
+  public static final class TravelEstimate.Builder {
+    ctor public TravelEstimate.Builder(androidx.car.app.model.Distance, androidx.car.app.model.DateTimeWithZone);
+    ctor @RequiresApi(26) public TravelEstimate.Builder(androidx.car.app.model.Distance, java.time.ZonedDateTime);
+    method public androidx.car.app.navigation.model.TravelEstimate build();
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingDistanceColor(androidx.car.app.model.CarColor);
+    method @RequiresApi(26) public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTime(java.time.Duration);
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTimeColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTimeSeconds(@IntRange(from=0xffffffff) long);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.navigation.model.TravelEstimate.Builder setTripIcon(androidx.car.app.model.CarIcon);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.navigation.model.TravelEstimate.Builder setTripText(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Trip {
+    method public androidx.car.app.model.CarText? getCurrentRoad();
+    method public java.util.List<androidx.car.app.navigation.model.TravelEstimate!> getDestinationTravelEstimates();
+    method public java.util.List<androidx.car.app.navigation.model.Destination!> getDestinations();
+    method public java.util.List<androidx.car.app.navigation.model.TravelEstimate!> getStepTravelEstimates();
+    method public java.util.List<androidx.car.app.navigation.model.Step!> getSteps();
+    method public boolean isLoading();
+  }
+
+  public static final class Trip.Builder {
+    ctor public Trip.Builder();
+    method public androidx.car.app.navigation.model.Trip.Builder addDestination(androidx.car.app.navigation.model.Destination, androidx.car.app.navigation.model.TravelEstimate);
+    method public androidx.car.app.navigation.model.Trip.Builder addStep(androidx.car.app.navigation.model.Step, androidx.car.app.navigation.model.TravelEstimate);
+    method public androidx.car.app.navigation.model.Trip build();
+    method public androidx.car.app.navigation.model.Trip.Builder setCurrentRoad(CharSequence);
+    method public androidx.car.app.navigation.model.Trip.Builder setLoading(boolean);
+  }
+
+}
+
+package androidx.car.app.notification {
+
+  public final class CarAppExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public CarAppExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<android.app.Notification.Action!> getActions();
+    method public String? getChannelId();
+    method public androidx.car.app.model.CarColor? getColor();
+    method public android.app.PendingIntent? getContentIntent();
+    method public CharSequence? getContentText();
+    method public CharSequence? getContentTitle();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method public int getImportance();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @DrawableRes public int getSmallIcon();
+    method public static boolean isExtended(android.app.Notification);
+  }
+
+  public static final class CarAppExtender.Builder {
+    ctor public CarAppExtender.Builder();
+    method public androidx.car.app.notification.CarAppExtender.Builder addAction(@DrawableRes int, CharSequence, android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender build();
+    method public androidx.car.app.notification.CarAppExtender.Builder setChannelId(String);
+    method public androidx.car.app.notification.CarAppExtender.Builder setColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentIntent(android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentText(CharSequence);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentTitle(CharSequence);
+    method public androidx.car.app.notification.CarAppExtender.Builder setDeleteIntent(android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender.Builder setImportance(int);
+    method public androidx.car.app.notification.CarAppExtender.Builder setLargeIcon(android.graphics.Bitmap);
+    method public androidx.car.app.notification.CarAppExtender.Builder setSmallIcon(int);
+  }
+
+  public final class CarNotificationManager {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.car.app.notification.CarNotificationManager from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroup(String);
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannels();
+    method public void notify(int, androidx.core.app.NotificationCompat.Builder);
+    method public void notify(String?, int, androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public final class CarPendingIntent {
+    method public static android.app.PendingIntent getCarApp(android.content.Context, int, android.content.Intent, int);
+  }
+
+}
+
+package androidx.car.app.serialization {
+
+  public final class Bundleable implements android.os.Parcelable {
+    method public static androidx.car.app.serialization.Bundleable create(Object) throws androidx.car.app.serialization.BundlerException;
+    method public int describeContents();
+    method public Object get() throws androidx.car.app.serialization.BundlerException;
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.car.app.serialization.Bundleable!> CREATOR;
+  }
+
+  public class BundlerException extends java.lang.Exception {
+    ctor public BundlerException(String?, Throwable);
+    ctor public BundlerException(String?);
+  }
+
+}
+
+package androidx.car.app.suggestion {
+
+  @androidx.car.app.annotations.RequiresCarApi(5) public class SuggestionManager implements androidx.car.app.managers.Manager {
+    method @MainThread public void updateSuggestions(java.util.List<androidx.car.app.suggestion.model.Suggestion!>);
+  }
+
+}
+
+package androidx.car.app.suggestion.model {
+
+  @androidx.car.app.annotations.CarProtocol public final class Suggestion {
+    method public android.app.PendingIntent? getAction();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public String getIdentifier();
+    method public androidx.car.app.model.CarText? getSubtitle();
+    method public androidx.car.app.model.CarText getTitle();
+  }
+
+  public static final class Suggestion.Builder {
+    ctor public Suggestion.Builder();
+    method public androidx.car.app.suggestion.model.Suggestion build();
+    method public androidx.car.app.suggestion.model.Suggestion.Builder setAction(android.app.PendingIntent);
+    method public androidx.car.app.suggestion.model.Suggestion.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.suggestion.model.Suggestion.Builder setIdentifier(String);
+    method public androidx.car.app.suggestion.model.Suggestion.Builder setSubtitle(CharSequence);
+    method public androidx.car.app.suggestion.model.Suggestion.Builder setTitle(CharSequence);
+  }
+
+}
+
+package androidx.car.app.validation {
+
+  public final class HostValidator {
+    method public java.util.Map<java.lang.String!,java.util.List<java.lang.String!>!> getAllowedHosts();
+    method public boolean isValidHost(androidx.car.app.HostInfo);
+    field public static final androidx.car.app.validation.HostValidator ALLOW_ALL_HOSTS_VALIDATOR;
+    field public static final String TEMPLATE_RENDERER_PERMISSION = "android.car.permission.TEMPLATE_RENDERER";
+  }
+
+  public static final class HostValidator.Builder {
+    ctor public HostValidator.Builder(android.content.Context);
+    method public androidx.car.app.validation.HostValidator.Builder addAllowedHost(String, String);
+    method public androidx.car.app.validation.HostValidator.Builder addAllowedHosts(@ArrayRes int);
+    method public androidx.car.app.validation.HostValidator build();
+  }
+
+}
+
+package androidx.car.app.versioning {
+
+  public final class CarAppApiLevels {
+    method public static int getLatest();
+    method public static int getOldest();
+    field public static final int LEVEL_1 = 1; // 0x1
+    field public static final int LEVEL_2 = 2; // 0x2
+    field public static final int LEVEL_3 = 3; // 0x3
+    field public static final int LEVEL_4 = 4; // 0x4
+    field public static final int LEVEL_5 = 5; // 0x5
+    field public static final int LEVEL_6 = 6; // 0x6
+  }
+
+}
+
diff --git a/car/app/app/api/public_plus_experimental_current.txt b/car/app/app/api/public_plus_experimental_current.txt
index c83ea6d..108129b 100644
--- a/car/app/app/api/public_plus_experimental_current.txt
+++ b/car/app/app/api/public_plus_experimental_current.txt
@@ -398,11 +398,11 @@
   }
 
   @androidx.car.app.annotations.ExperimentalCarApi public final class FanDirectionProfile {
-    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!> getCarZoneSetsToFanDirectionValues();
+    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,java.util.Set<java.lang.Integer!>!> getCarZoneSetsToFanDirectionValues();
   }
 
   public static final class FanDirectionProfile.Builder {
-    ctor public FanDirectionProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!>);
+    ctor public FanDirectionProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,java.util.Set<java.lang.Integer!>!>);
     method public androidx.car.app.hardware.climate.FanDirectionProfile build();
   }
 
@@ -1336,10 +1336,10 @@
   }
 
   @androidx.car.app.annotations.CarProtocol public final class Row implements androidx.car.app.model.Item {
-    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method @androidx.car.app.annotations.ExperimentalCarApi public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.CarIcon? getImage();
     method public androidx.car.app.model.Metadata? getMetadata();
-    method @androidx.car.app.annotations.RequiresCarApi(6) public int getNumericDecoration();
+    method @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(6) public int getNumericDecoration();
     method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
     method public int getRowImageType();
     method public java.util.List<androidx.car.app.model.CarText!> getTexts();
@@ -1357,7 +1357,7 @@
 
   public static final class Row.Builder {
     ctor public Row.Builder();
-    method public androidx.car.app.model.Row.Builder addAction(androidx.car.app.model.Action);
+    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.model.Row.Builder addAction(androidx.car.app.model.Action);
     method public androidx.car.app.model.Row.Builder addText(CharSequence);
     method public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
     method public androidx.car.app.model.Row build();
@@ -1366,7 +1366,7 @@
     method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon);
     method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon, int);
     method public androidx.car.app.model.Row.Builder setMetadata(androidx.car.app.model.Metadata);
-    method @androidx.car.app.annotations.RequiresCarApi(6) public androidx.car.app.model.Row.Builder setNumericDecoration(int);
+    method @IntRange(from=0) @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(6) public androidx.car.app.model.Row.Builder setNumericDecoration(int);
     method public androidx.car.app.model.Row.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.Row.Builder setTitle(CharSequence);
     method public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
diff --git a/car/app/app/api/res-1.3.0-beta01.txt b/car/app/app/api/res-1.3.0-beta01.txt
new file mode 100644
index 0000000..686fc80
--- /dev/null
+++ b/car/app/app/api/res-1.3.0-beta01.txt
@@ -0,0 +1,5 @@
+attr carColorPrimary
+attr carColorPrimaryDark
+attr carColorSecondary
+attr carColorSecondaryDark
+attr carPermissionActivityLayout
diff --git a/car/app/app/api/restricted_1.3.0-beta01.txt b/car/app/app/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..306320a
--- /dev/null
+++ b/car/app/app/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,1645 @@
+// Signature format: 4.0
+package androidx.car.app {
+
+  @androidx.car.app.annotations.CarProtocol public final class AppInfo {
+    ctor @VisibleForTesting public AppInfo(int, int, String);
+    method public int getLatestCarAppApiLevel();
+    method public String getLibraryDisplayVersion();
+    method public int getMinCarAppApiLevel();
+    field public static final String MIN_API_LEVEL_METADATA_KEY = "androidx.car.app.minCarApiLevel";
+  }
+
+  public class AppManager implements androidx.car.app.managers.Manager {
+    method @androidx.car.app.annotations.RequiresCarApi(5) public void dismissAlert(int);
+    method public void invalidate();
+    method public void setSurfaceCallback(androidx.car.app.SurfaceCallback?);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public void showAlert(androidx.car.app.model.Alert);
+    method public void showToast(CharSequence, int);
+  }
+
+  public final class CarAppPermission {
+    method public static void checkHasLibraryPermission(android.content.Context, String);
+    method public static void checkHasPermission(android.content.Context, String);
+    field public static final String ACCESS_SURFACE = "androidx.car.app.ACCESS_SURFACE";
+    field public static final String MAP_TEMPLATES = "androidx.car.app.MAP_TEMPLATES";
+    field public static final String NAVIGATION_TEMPLATES = "androidx.car.app.NAVIGATION_TEMPLATES";
+  }
+
+  public abstract class CarAppService extends android.app.Service {
+    ctor public CarAppService();
+    method public abstract androidx.car.app.validation.HostValidator createHostValidator();
+    method @CallSuper public final void dump(java.io.FileDescriptor, java.io.PrintWriter, String![]?);
+    method @Deprecated public final androidx.car.app.Session? getCurrentSession();
+    method public final androidx.car.app.HostInfo? getHostInfo();
+    method public final androidx.car.app.Session? getSession(androidx.car.app.SessionInfo);
+    method @CallSuper public final android.os.IBinder onBind(android.content.Intent);
+    method public androidx.car.app.Session onCreateSession();
+    method @androidx.car.app.annotations.RequiresCarApi(6) public androidx.car.app.Session onCreateSession(androidx.car.app.SessionInfo);
+    method public final boolean onUnbind(android.content.Intent);
+    field @Deprecated public static final String CATEGORY_CHARGING_APP = "androidx.car.app.category.CHARGING";
+    field @androidx.car.app.annotations.RequiresCarApi(6) public static final String CATEGORY_FEATURE_CLUSTER = "androidx.car.app.category.FEATURE_CLUSTER";
+    field public static final String CATEGORY_NAVIGATION_APP = "androidx.car.app.category.NAVIGATION";
+    field @Deprecated public static final String CATEGORY_PARKING_APP = "androidx.car.app.category.PARKING";
+    field public static final String CATEGORY_POI_APP = "androidx.car.app.category.POI";
+    field public static final String SERVICE_INTERFACE = "androidx.car.app.CarAppService";
+  }
+
+  public class CarContext extends android.content.ContextWrapper {
+    method public void finishCarApp();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public android.content.ComponentName? getCallingComponent();
+    method public int getCarAppApiLevel();
+    method public Object getCarService(String);
+    method public <T> T getCarService(Class<T!>);
+    method public String getCarServiceName(Class<?>);
+    method public androidx.car.app.HostInfo? getHostInfo();
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public boolean isDarkMode();
+    method public void requestPermissions(java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsListener);
+    method public void requestPermissions(java.util.List<java.lang.String!>, java.util.concurrent.Executor, androidx.car.app.OnRequestPermissionsListener);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public void setCarAppResult(int, android.content.Intent?);
+    method public void startCarApp(android.content.Intent);
+    method @Deprecated public static void startCarApp(android.content.Intent, android.content.Intent);
+    field public static final String ACTION_NAVIGATE = "androidx.car.app.action.NAVIGATE";
+    field public static final String APP_SERVICE = "app";
+    field public static final String CAR_SERVICE = "car";
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final String CONSTRAINT_SERVICE = "constraints";
+    field public static final String EXTRA_START_CAR_APP_BINDER_KEY = "androidx.car.app.extra.START_CAR_APP_BINDER_KEY";
+    field @androidx.car.app.annotations.RequiresCarApi(3) public static final String HARDWARE_SERVICE = "hardware";
+    field public static final String NAVIGATION_SERVICE = "navigation";
+    field public static final String SCREEN_SERVICE = "screen";
+    field public static final String SUGGESTION_SERVICE = "suggestion";
+  }
+
+  public final class CarToast {
+    method public static androidx.car.app.CarToast makeText(androidx.car.app.CarContext, @StringRes int, int);
+    method public static androidx.car.app.CarToast makeText(androidx.car.app.CarContext, CharSequence, int);
+    method public void setDuration(int);
+    method public void setText(@StringRes int);
+    method public void setText(CharSequence);
+    method public void show();
+    field public static final int LENGTH_LONG = 1; // 0x1
+    field public static final int LENGTH_SHORT = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class FailureResponse {
+    ctor public FailureResponse(Throwable);
+    method public int getErrorType();
+    method public String getStackTrace();
+    field public static final int BUNDLER_EXCEPTION = 1; // 0x1
+    field public static final int ILLEGAL_STATE_EXCEPTION = 2; // 0x2
+    field public static final int INVALID_PARAMETER_EXCEPTION = 3; // 0x3
+    field public static final int REMOTE_EXCEPTION = 6; // 0x6
+    field public static final int RUNTIME_EXCEPTION = 5; // 0x5
+    field public static final int SECURITY_EXCEPTION = 4; // 0x4
+    field public static final int UNKNOWN_ERROR = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class HandshakeInfo {
+    ctor public HandshakeInfo(String, int);
+    method public int getHostCarAppApiLevel();
+    method public String getHostPackageName();
+  }
+
+  public final class HostException extends java.lang.RuntimeException {
+    ctor public HostException(String);
+    ctor public HostException(String, Throwable);
+    ctor public HostException(Throwable);
+  }
+
+  public final class HostInfo {
+    ctor public HostInfo(String, int);
+    method public String getPackageName();
+    method public int getUid();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnDoneCallback {
+    method public default void onFailure(androidx.car.app.serialization.Bundleable);
+    method public default void onSuccess(androidx.car.app.serialization.Bundleable?);
+  }
+
+  public interface OnRequestPermissionsListener {
+    method public void onRequestPermissionsResult(java.util.List<java.lang.String!>, java.util.List<java.lang.String!>);
+  }
+
+  public interface OnScreenResultListener {
+    method public void onScreenResult(Object?);
+  }
+
+  public abstract class Screen implements androidx.lifecycle.LifecycleOwner {
+    ctor protected Screen(androidx.car.app.CarContext);
+    method public final void finish();
+    method public final androidx.car.app.CarContext getCarContext();
+    method public final androidx.lifecycle.Lifecycle getLifecycle();
+    method public String? getMarker();
+    method public final androidx.car.app.ScreenManager getScreenManager();
+    method public final void invalidate();
+    method public abstract androidx.car.app.model.Template onGetTemplate();
+    method public void setMarker(String?);
+    method public void setResult(Object?);
+  }
+
+  @MainThread public class ScreenManager implements androidx.car.app.managers.Manager {
+    method public int getStackSize();
+    method public androidx.car.app.Screen getTop();
+    method public void pop();
+    method public void popTo(String);
+    method public void popToRoot();
+    method public void push(androidx.car.app.Screen);
+    method public void pushForResult(androidx.car.app.Screen, androidx.car.app.OnScreenResultListener);
+    method public void remove(androidx.car.app.Screen);
+  }
+
+  public abstract class Session implements androidx.lifecycle.LifecycleOwner {
+    ctor public Session();
+    method public final androidx.car.app.CarContext getCarContext();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public void onCarConfigurationChanged(android.content.res.Configuration);
+    method public abstract androidx.car.app.Screen onCreateScreen(android.content.Intent);
+    method public void onNewIntent(android.content.Intent);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(6) public class SessionInfo {
+    ctor public SessionInfo(int, String);
+    method public int getDisplayType();
+    method public String getSessionId();
+    method public java.util.Set<java.lang.Class<? extends androidx.car.app.model.Template>!>? getSupportedTemplates(int);
+    field public static final androidx.car.app.SessionInfo DEFAULT_SESSION_INFO;
+    field public static final int DISPLAY_TYPE_CLUSTER = 1; // 0x1
+    field public static final int DISPLAY_TYPE_MAIN = 0; // 0x0
+  }
+
+  public class SessionInfoIntentEncoder {
+    method public static boolean containsSessionInfo(android.content.Intent);
+    method public static androidx.car.app.SessionInfo decode(android.content.Intent);
+    method public static void encode(androidx.car.app.SessionInfo, android.content.Intent);
+  }
+
+  public interface SurfaceCallback {
+    method @androidx.car.app.annotations.RequiresCarApi(5) public default void onClick(float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onFling(float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScale(float, float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScroll(float, float);
+    method public default void onStableAreaChanged(android.graphics.Rect);
+    method public default void onSurfaceAvailable(androidx.car.app.SurfaceContainer);
+    method public default void onSurfaceDestroyed(androidx.car.app.SurfaceContainer);
+    method public default void onVisibleAreaChanged(android.graphics.Rect);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SurfaceContainer {
+    ctor public SurfaceContainer(android.view.Surface?, int, int, int);
+    method public int getDpi();
+    method public int getHeight();
+    method public android.view.Surface? getSurface();
+    method public int getWidth();
+  }
+
+}
+
+package androidx.car.app.annotations {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface CarProtocol {
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface RequiresCarApi {
+    method public abstract int value();
+  }
+
+}
+
+package androidx.car.app.connection {
+
+  public final class CarConnection {
+    ctor @MainThread public CarConnection(android.content.Context);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getType();
+    field public static final String ACTION_CAR_CONNECTION_UPDATED = "androidx.car.app.connection.action.CAR_CONNECTION_UPDATED";
+    field public static final String CAR_CONNECTION_STATE = "CarConnectionState";
+    field public static final int CONNECTION_TYPE_NATIVE = 1; // 0x1
+    field public static final int CONNECTION_TYPE_NOT_CONNECTED = 0; // 0x0
+    field public static final int CONNECTION_TYPE_PROJECTION = 2; // 0x2
+  }
+
+}
+
+package androidx.car.app.constraints {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public class ConstraintManager implements androidx.car.app.managers.Manager {
+    method public int getContentLimit(int);
+    field public static final int CONTENT_LIMIT_TYPE_GRID = 1; // 0x1
+    field public static final int CONTENT_LIMIT_TYPE_LIST = 0; // 0x0
+    field public static final int CONTENT_LIMIT_TYPE_PANE = 4; // 0x4
+    field public static final int CONTENT_LIMIT_TYPE_PLACE_LIST = 2; // 0x2
+    field public static final int CONTENT_LIMIT_TYPE_ROUTE_LIST = 3; // 0x3
+  }
+
+}
+
+package androidx.car.app.hardware {
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarHardwareManager extends androidx.car.app.managers.Manager {
+    method public default androidx.car.app.hardware.info.CarInfo getCarInfo();
+    method public default androidx.car.app.hardware.info.CarSensors getCarSensors();
+  }
+
+}
+
+package androidx.car.app.hardware.common {
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarUnit {
+    method public static String toString(int);
+    field public static final int KILOMETER = 3; // 0x3
+    field public static final int KILOMETERS_PER_HOUR = 102; // 0x66
+    field public static final int METER = 2; // 0x2
+    field public static final int METERS_PER_SEC = 101; // 0x65
+    field public static final int MILE = 4; // 0x4
+    field public static final int MILES_PER_HOUR = 103; // 0x67
+    field public static final int MILLIMETER = 1; // 0x1
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarValue<T> {
+    ctor public CarValue(T?, long, int);
+    method public int getStatus();
+    method public long getTimestampMillis();
+    method public T? getValue();
+    field public static final int STATUS_SUCCESS = 1; // 0x1
+    field public static final int STATUS_UNAVAILABLE = 3; // 0x3
+    field public static final int STATUS_UNIMPLEMENTED = 2; // 0x2
+    field public static final int STATUS_UNKNOWN = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public interface OnCarDataAvailableListener<T> {
+    method public void onCarDataAvailable(T);
+  }
+
+}
+
+package androidx.car.app.hardware.info {
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Accelerometer {
+    ctor public Accelerometer(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getForces();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarHardwareLocation {
+    ctor public CarHardwareLocation(androidx.car.app.hardware.common.CarValue<android.location.Location!>);
+    method public androidx.car.app.hardware.common.CarValue<android.location.Location!> getLocation();
+  }
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarInfo {
+    method public void addEnergyLevelListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyLevel!>);
+    method public void addMileageListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Mileage!>);
+    method public void addSpeedListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Speed!>);
+    method public void addTollListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.TollCard!>);
+    method public void fetchEnergyProfile(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyProfile!>);
+    method public void fetchModel(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Model!>);
+    method public void removeEnergyLevelListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyLevel!>);
+    method public void removeMileageListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Mileage!>);
+    method public void removeSpeedListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Speed!>);
+    method public void removeTollListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.TollCard!>);
+  }
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarSensors {
+    method public void addAccelerometerListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Accelerometer!>);
+    method public void addCarHardwareLocationListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.CarHardwareLocation!>);
+    method public void addCompassListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Compass!>);
+    method public void addGyroscopeListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Gyroscope!>);
+    method public void removeAccelerometerListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Accelerometer!>);
+    method public void removeCarHardwareLocationListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.CarHardwareLocation!>);
+    method public void removeCompassListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Compass!>);
+    method public void removeGyroscopeListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Gyroscope!>);
+    field public static final int UPDATE_RATE_FASTEST = 3; // 0x3
+    field public static final int UPDATE_RATE_NORMAL = 1; // 0x1
+    field public static final int UPDATE_RATE_UI = 2; // 0x2
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Compass {
+    ctor public Compass(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getOrientations();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyLevel {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getBatteryPercent();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Boolean!> getEnergyIsLow();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getFuelPercent();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getRangeRemainingMeters();
+  }
+
+  public static final class EnergyLevel.Builder {
+    ctor public EnergyLevel.Builder();
+    method public androidx.car.app.hardware.info.EnergyLevel build();
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setBatteryPercent(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setDistanceDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setEnergyIsLow(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setFuelPercent(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setRangeRemainingMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyProfile {
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!> getEvConnectorTypes();
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!> getFuelTypes();
+    field public static final int EVCONNECTOR_TYPE_CHADEMO = 3; // 0x3
+    field public static final int EVCONNECTOR_TYPE_COMBO_1 = 4; // 0x4
+    field public static final int EVCONNECTOR_TYPE_COMBO_2 = 5; // 0x5
+    field public static final int EVCONNECTOR_TYPE_GBT = 9; // 0x9
+    field public static final int EVCONNECTOR_TYPE_GBT_DC = 10; // 0xa
+    field public static final int EVCONNECTOR_TYPE_J1772 = 1; // 0x1
+    field public static final int EVCONNECTOR_TYPE_MENNEKES = 2; // 0x2
+    field public static final int EVCONNECTOR_TYPE_OTHER = 101; // 0x65
+    field public static final int EVCONNECTOR_TYPE_SCAME = 11; // 0xb
+    field public static final int EVCONNECTOR_TYPE_TESLA_HPWC = 7; // 0x7
+    field public static final int EVCONNECTOR_TYPE_TESLA_ROADSTER = 6; // 0x6
+    field public static final int EVCONNECTOR_TYPE_TESLA_SUPERCHARGER = 8; // 0x8
+    field public static final int EVCONNECTOR_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int FUEL_TYPE_BIODIESEL = 5; // 0x5
+    field public static final int FUEL_TYPE_CNG = 8; // 0x8
+    field public static final int FUEL_TYPE_DIESEL_1 = 3; // 0x3
+    field public static final int FUEL_TYPE_DIESEL_2 = 4; // 0x4
+    field public static final int FUEL_TYPE_E85 = 6; // 0x6
+    field public static final int FUEL_TYPE_ELECTRIC = 10; // 0xa
+    field public static final int FUEL_TYPE_HYDROGEN = 11; // 0xb
+    field public static final int FUEL_TYPE_LEADED = 2; // 0x2
+    field public static final int FUEL_TYPE_LNG = 9; // 0x9
+    field public static final int FUEL_TYPE_LPG = 7; // 0x7
+    field public static final int FUEL_TYPE_OTHER = 12; // 0xc
+    field public static final int FUEL_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int FUEL_TYPE_UNLEADED = 1; // 0x1
+  }
+
+  public static final class EnergyProfile.Builder {
+    ctor public EnergyProfile.Builder();
+    method public androidx.car.app.hardware.info.EnergyProfile build();
+    method public androidx.car.app.hardware.info.EnergyProfile.Builder setEvConnectorTypes(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!>);
+    method public androidx.car.app.hardware.info.EnergyProfile.Builder setFuelTypes(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Gyroscope {
+    ctor public Gyroscope(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getRotations();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Mileage {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getOdometerMeters();
+  }
+
+  public static final class Mileage.Builder {
+    ctor public Mileage.Builder();
+    method public androidx.car.app.hardware.info.Mileage build();
+    method public androidx.car.app.hardware.info.Mileage.Builder setDistanceDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public androidx.car.app.hardware.info.Mileage.Builder setOdometerMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Model {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.String!> getManufacturer();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.String!> getName();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getYear();
+  }
+
+  public static final class Model.Builder {
+    ctor public Model.Builder();
+    method public androidx.car.app.hardware.info.Model build();
+    method public androidx.car.app.hardware.info.Model.Builder setManufacturer(androidx.car.app.hardware.common.CarValue<java.lang.String!>);
+    method public androidx.car.app.hardware.info.Model.Builder setName(androidx.car.app.hardware.common.CarValue<java.lang.String!>);
+    method public androidx.car.app.hardware.info.Model.Builder setYear(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Speed {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getDisplaySpeedMetersPerSecond();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getRawSpeedMetersPerSecond();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getSpeedDisplayUnit();
+  }
+
+  public static final class Speed.Builder {
+    ctor public Speed.Builder();
+    method public androidx.car.app.hardware.info.Speed build();
+    method public androidx.car.app.hardware.info.Speed.Builder setDisplaySpeedMetersPerSecond(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.Speed.Builder setRawSpeedMetersPerSecond(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.Speed.Builder setSpeedDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class TollCard {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getCardState();
+    field public static final int TOLLCARD_STATE_INVALID = 2; // 0x2
+    field public static final int TOLLCARD_STATE_NOT_INSERTED = 3; // 0x3
+    field public static final int TOLLCARD_STATE_UNKNOWN = 0; // 0x0
+    field public static final int TOLLCARD_STATE_VALID = 1; // 0x1
+  }
+
+  public static final class TollCard.Builder {
+    ctor public TollCard.Builder();
+    method public androidx.car.app.hardware.info.TollCard build();
+    method public androidx.car.app.hardware.info.TollCard.Builder setCardState(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+}
+
+package androidx.car.app.managers {
+
+  public interface Manager {
+  }
+
+}
+
+package androidx.car.app.media {
+
+  @androidx.car.app.annotations.RequiresCarApi(5) public interface CarAudioCallback {
+    method public void onStopRecording();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public class CarAudioCallbackDelegate {
+    method public void onStopRecording();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(5) public abstract class CarAudioRecord {
+    method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public static androidx.car.app.media.CarAudioRecord create(androidx.car.app.CarContext);
+    method public int read(byte[], int, int);
+    method public void startRecording();
+    method public void stopRecording();
+    field public static final int AUDIO_CONTENT_BUFFER_SIZE = 512; // 0x200
+    field public static final String AUDIO_CONTENT_MIME = "audio/l16";
+    field public static final int AUDIO_CONTENT_SAMPLING_RATE = 16000; // 0x3e80
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class OpenMicrophoneRequest {
+    method public androidx.car.app.media.CarAudioCallbackDelegate getCarAudioCallbackDelegate();
+  }
+
+  public static final class OpenMicrophoneRequest.Builder {
+    ctor public OpenMicrophoneRequest.Builder(androidx.car.app.media.CarAudioCallback);
+    method public androidx.car.app.media.OpenMicrophoneRequest build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class OpenMicrophoneResponse {
+    method public androidx.car.app.media.CarAudioCallbackDelegate getCarAudioCallback();
+    method public java.io.InputStream getCarMicrophoneInputStream();
+  }
+
+  public static final class OpenMicrophoneResponse.Builder {
+    ctor public OpenMicrophoneResponse.Builder(androidx.car.app.media.CarAudioCallback);
+    method public androidx.car.app.media.OpenMicrophoneResponse build();
+    method public androidx.car.app.media.OpenMicrophoneResponse.Builder setCarMicrophoneDescriptor(android.os.ParcelFileDescriptor);
+  }
+
+}
+
+package androidx.car.app.model {
+
+  @androidx.car.app.annotations.CarProtocol public final class Action {
+    method public androidx.car.app.model.CarColor? getBackgroundColor();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public int getFlags();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public int getType();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public boolean isEnabled();
+    method public boolean isStandard();
+    method public static String typeToString(int);
+    field public static final androidx.car.app.model.Action APP_ICON;
+    field public static final androidx.car.app.model.Action BACK;
+    field @androidx.car.app.annotations.RequiresCarApi(5) public static final int FLAG_DEFAULT = 4; // 0x4
+    field @androidx.car.app.annotations.RequiresCarApi(5) public static final int FLAG_IS_PERSISTENT = 2; // 0x2
+    field @androidx.car.app.annotations.RequiresCarApi(4) public static final int FLAG_PRIMARY = 1; // 0x1
+    field public static final androidx.car.app.model.Action PAN;
+    field public static final int TYPE_APP_ICON = 65538; // 0x10002
+    field public static final int TYPE_BACK = 65539; // 0x10003
+    field public static final int TYPE_CUSTOM = 1; // 0x1
+    field public static final int TYPE_PAN = 65540; // 0x10004
+  }
+
+  public static final class Action.Builder {
+    ctor public Action.Builder();
+    ctor @androidx.car.app.annotations.RequiresCarApi(2) public Action.Builder(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Action build();
+    method public androidx.car.app.model.Action.Builder setBackgroundColor(androidx.car.app.model.CarColor);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Action.Builder setEnabled(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.Action.Builder setFlags(int);
+    method public androidx.car.app.model.Action.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Action.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.Action.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Action.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ActionStrip {
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.Action? getFirstActionOfType(int);
+  }
+
+  public static final class ActionStrip.Builder {
+    ctor public ActionStrip.Builder();
+    method public androidx.car.app.model.ActionStrip.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.ActionStrip build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class Alert {
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.AlertCallbackDelegate? getCallbackDelegate();
+    method public long getDurationMillis();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public int getId();
+    method public androidx.car.app.model.CarText? getSubtitle();
+    method public androidx.car.app.model.CarText getTitle();
+  }
+
+  public static final class Alert.Builder {
+    ctor public Alert.Builder(int, androidx.car.app.model.CarText, long);
+    method public androidx.car.app.model.Alert.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Alert build();
+    method public androidx.car.app.model.Alert.Builder setCallback(androidx.car.app.model.AlertCallback);
+    method public androidx.car.app.model.Alert.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Alert.Builder setSubtitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public interface AlertCallback {
+    method public void onCancel(int);
+    method public void onDismiss();
+    field public static final int REASON_NOT_SUPPORTED = 3; // 0x3
+    field public static final int REASON_TIMEOUT = 1; // 0x1
+    field public static final int REASON_USER_ACTION = 2; // 0x2
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public interface AlertCallbackDelegate {
+    method public void sendCancel(int, androidx.car.app.OnDoneCallback);
+    method public void sendDismiss(androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarColor {
+    method public static androidx.car.app.model.CarColor createCustom(@ColorInt int, @ColorInt int);
+    method @ColorInt public int getColor();
+    method @ColorInt public int getColorDark();
+    method public int getType();
+    field public static final androidx.car.app.model.CarColor BLUE;
+    field public static final androidx.car.app.model.CarColor DEFAULT;
+    field public static final androidx.car.app.model.CarColor GREEN;
+    field public static final androidx.car.app.model.CarColor PRIMARY;
+    field public static final androidx.car.app.model.CarColor RED;
+    field public static final androidx.car.app.model.CarColor SECONDARY;
+    field public static final int TYPE_BLUE = 6; // 0x6
+    field public static final int TYPE_CUSTOM = 0; // 0x0
+    field public static final int TYPE_DEFAULT = 1; // 0x1
+    field public static final int TYPE_GREEN = 5; // 0x5
+    field public static final int TYPE_PRIMARY = 2; // 0x2
+    field public static final int TYPE_RED = 4; // 0x4
+    field public static final int TYPE_SECONDARY = 3; // 0x3
+    field public static final int TYPE_YELLOW = 7; // 0x7
+    field public static final androidx.car.app.model.CarColor YELLOW;
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarIcon {
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public androidx.car.app.model.CarColor? getTint();
+    method public int getType();
+    field public static final androidx.car.app.model.CarIcon ALERT;
+    field public static final androidx.car.app.model.CarIcon APP_ICON;
+    field public static final androidx.car.app.model.CarIcon BACK;
+    field public static final androidx.car.app.model.CarIcon ERROR;
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final androidx.car.app.model.CarIcon PAN;
+    field public static final int TYPE_ALERT = 4; // 0x4
+    field public static final int TYPE_APP_ICON = 5; // 0x5
+    field public static final int TYPE_BACK = 3; // 0x3
+    field public static final int TYPE_CUSTOM = 1; // 0x1
+    field public static final int TYPE_ERROR = 6; // 0x6
+    field public static final int TYPE_PAN = 7; // 0x7
+  }
+
+  public static final class CarIcon.Builder {
+    ctor public CarIcon.Builder(androidx.core.graphics.drawable.IconCompat);
+    ctor public CarIcon.Builder(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.CarIcon build();
+    method public androidx.car.app.model.CarIcon.Builder setTint(androidx.car.app.model.CarColor);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarIconSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.CarIconSpan create(androidx.car.app.model.CarIcon);
+    method public static androidx.car.app.model.CarIconSpan create(androidx.car.app.model.CarIcon, int);
+    method public int getAlignment();
+    method public androidx.car.app.model.CarIcon getIcon();
+    field public static final int ALIGN_BASELINE = 1; // 0x1
+    field public static final int ALIGN_BOTTOM = 0; // 0x0
+    field public static final int ALIGN_CENTER = 2; // 0x2
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarLocation {
+    method public static androidx.car.app.model.CarLocation create(double, double);
+    method public static androidx.car.app.model.CarLocation create(android.location.Location);
+    method public double getLatitude();
+    method public double getLongitude();
+  }
+
+  @Keep @androidx.car.app.annotations.CarProtocol public class CarSpan extends android.text.style.CharacterStyle {
+    ctor public CarSpan();
+    method public void updateDrawState(android.text.TextPaint);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarText {
+    method public static androidx.car.app.model.CarText create(CharSequence);
+    method public java.util.List<java.lang.CharSequence!> getVariants();
+    method public boolean isEmpty();
+    method public static boolean isNullOrEmpty(androidx.car.app.model.CarText?);
+    method public CharSequence toCharSequence();
+  }
+
+  public static final class CarText.Builder {
+    ctor public CarText.Builder(CharSequence);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.CarText.Builder addVariant(CharSequence);
+    method public androidx.car.app.model.CarText build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public final class ClickableSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.ClickableSpan create(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.OnClickDelegate getOnClickDelegate();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DateTimeWithZone {
+    method public static androidx.car.app.model.DateTimeWithZone create(long, @IntRange(from=0xffff02e0, to=64800) int, String);
+    method public static androidx.car.app.model.DateTimeWithZone create(long, java.util.TimeZone);
+    method @RequiresApi(26) public static androidx.car.app.model.DateTimeWithZone create(java.time.ZonedDateTime);
+    method public long getTimeSinceEpochMillis();
+    method public int getZoneOffsetSeconds();
+    method public String? getZoneShortName();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Distance {
+    method public static androidx.car.app.model.Distance create(double, int);
+    method public double getDisplayDistance();
+    method public int getDisplayUnit();
+    field public static final int UNIT_FEET = 6; // 0x6
+    field public static final int UNIT_KILOMETERS = 2; // 0x2
+    field public static final int UNIT_KILOMETERS_P1 = 3; // 0x3
+    field public static final int UNIT_METERS = 1; // 0x1
+    field public static final int UNIT_MILES = 4; // 0x4
+    field public static final int UNIT_MILES_P1 = 5; // 0x5
+    field public static final int UNIT_YARDS = 7; // 0x7
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DistanceSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.DistanceSpan create(androidx.car.app.model.Distance);
+    method public androidx.car.app.model.Distance getDistance();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DurationSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.DurationSpan create(long);
+    method @RequiresApi(26) public static androidx.car.app.model.DurationSpan create(java.time.Duration);
+    method public long getDurationSeconds();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ForegroundCarColorSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.ForegroundCarColorSpan create(androidx.car.app.model.CarColor);
+    method public androidx.car.app.model.CarColor getColor();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class GridItem implements androidx.car.app.model.Item {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public int getImageType();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public androidx.car.app.model.CarText? getText();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+    field public static final int IMAGE_TYPE_ICON = 1; // 0x1
+    field public static final int IMAGE_TYPE_LARGE = 2; // 0x2
+  }
+
+  public static final class GridItem.Builder {
+    ctor public GridItem.Builder();
+    method public androidx.car.app.model.GridItem build();
+    method public androidx.car.app.model.GridItem.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.GridItem.Builder setImage(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.GridItem.Builder setLoading(boolean);
+    method public androidx.car.app.model.GridItem.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.GridItem.Builder setText(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setText(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.GridItem.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class GridTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getSingleList();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class GridTemplate.Builder {
+    ctor public GridTemplate.Builder();
+    method public androidx.car.app.model.GridTemplate build();
+    method public androidx.car.app.model.GridTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.GridTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.GridTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.GridTemplate.Builder setSingleList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.GridTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class Header {
+    method public java.util.List<androidx.car.app.model.Action!> getEndHeaderActions();
+    method public androidx.car.app.model.Action? getStartHeaderAction();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  public static final class Header.Builder {
+    ctor public Header.Builder();
+    method public androidx.car.app.model.Header.Builder addEndHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Header build();
+    method public androidx.car.app.model.Header.Builder setStartHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Header.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Header.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallback {
+    method public default void onInputSubmitted(String);
+    method public default void onInputTextChanged(String);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallbackDelegate {
+    method public void sendInputSubmitted(String, androidx.car.app.OnDoneCallback);
+    method public void sendInputTextChanged(String, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface Item {
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ItemList {
+    method public java.util.List<androidx.car.app.model.Item!> getItems();
+    method public androidx.car.app.model.CarText? getNoItemsMessage();
+    method public androidx.car.app.model.OnItemVisibilityChangedDelegate? getOnItemVisibilityChangedDelegate();
+    method public androidx.car.app.model.OnSelectedDelegate? getOnSelectedDelegate();
+    method public int getSelectedIndex();
+  }
+
+  public static final class ItemList.Builder {
+    ctor public ItemList.Builder();
+    method public androidx.car.app.model.ItemList.Builder addItem(androidx.car.app.model.Item);
+    method public androidx.car.app.model.ItemList build();
+    method public androidx.car.app.model.ItemList.Builder setNoItemsMessage(CharSequence);
+    method public androidx.car.app.model.ItemList.Builder setOnItemsVisibilityChangedListener(androidx.car.app.model.ItemList.OnItemVisibilityChangedListener);
+    method public androidx.car.app.model.ItemList.Builder setOnSelectedListener(androidx.car.app.model.ItemList.OnSelectedListener);
+    method public androidx.car.app.model.ItemList.Builder setSelectedIndex(@IntRange(from=0) int);
+  }
+
+  public static interface ItemList.OnItemVisibilityChangedListener {
+    method public void onItemVisibilityChanged(int, int);
+  }
+
+  public static interface ItemList.OnSelectedListener {
+    method public void onSelected(int);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ListTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public java.util.List<androidx.car.app.model.SectionedItemList!> getSectionedLists();
+    method public androidx.car.app.model.ItemList? getSingleList();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class ListTemplate.Builder {
+    ctor public ListTemplate.Builder();
+    method public androidx.car.app.model.ListTemplate.Builder addSectionedList(androidx.car.app.model.SectionedItemList);
+    method public androidx.car.app.model.ListTemplate build();
+    method public androidx.car.app.model.ListTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.ListTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.ListTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.ListTemplate.Builder setSingleList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.ListTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class LongMessageTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText getMessage();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class LongMessageTemplate.Builder {
+    ctor public LongMessageTemplate.Builder(CharSequence);
+    method public androidx.car.app.model.LongMessageTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate build();
+    method public androidx.car.app.model.LongMessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class MessageTemplate implements androidx.car.app.model.Template {
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.CarText? getDebugMessage();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public androidx.car.app.model.CarText getMessage();
+    method public androidx.car.app.model.CarText? getTitle();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public boolean isLoading();
+  }
+
+  public static final class MessageTemplate.Builder {
+    ctor public MessageTemplate.Builder(CharSequence);
+    ctor public MessageTemplate.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.MessageTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.MessageTemplate build();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(Throwable);
+    method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(String);
+    method public androidx.car.app.model.MessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.MessageTemplate.Builder setIcon(androidx.car.app.model.CarIcon);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.MessageTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Metadata {
+    method public androidx.car.app.model.Place? getPlace();
+    field public static final androidx.car.app.model.Metadata EMPTY_METADATA;
+  }
+
+  public static final class Metadata.Builder {
+    ctor public Metadata.Builder();
+    ctor public Metadata.Builder(androidx.car.app.model.Metadata);
+    method public androidx.car.app.model.Metadata build();
+    method public androidx.car.app.model.Metadata.Builder setPlace(androidx.car.app.model.Place);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnCheckedChangeDelegate {
+    method public void sendCheckedChange(boolean, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnClickDelegate {
+    method public boolean isParkedOnly();
+    method public void sendClick(androidx.car.app.OnDoneCallback);
+  }
+
+  public interface OnClickListener {
+    method public void onClick();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public interface OnContentRefreshDelegate {
+    method public void sendContentRefreshRequested(androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(5) public interface OnContentRefreshListener {
+    method public void onContentRefreshRequested();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnItemVisibilityChangedDelegate {
+    method public void sendItemVisibilityChanged(int, int, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnSelectedDelegate {
+    method public void sendSelected(int, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Pane {
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.CarIcon? getImage();
+    method public java.util.List<androidx.car.app.model.Row!> getRows();
+    method public boolean isLoading();
+  }
+
+  public static final class Pane.Builder {
+    ctor public Pane.Builder();
+    method public androidx.car.app.model.Pane.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Pane.Builder addRow(androidx.car.app.model.Row);
+    method public androidx.car.app.model.Pane build();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.Pane.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Pane.Builder setLoading(boolean);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PaneTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.Pane getPane();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  public static final class PaneTemplate.Builder {
+    ctor public PaneTemplate.Builder(androidx.car.app.model.Pane);
+    method public androidx.car.app.model.PaneTemplate build();
+    method public androidx.car.app.model.PaneTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.PaneTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.PaneTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ParkedOnlyOnClickListener implements androidx.car.app.model.OnClickListener {
+    method public static androidx.car.app.model.ParkedOnlyOnClickListener create(androidx.car.app.model.OnClickListener);
+    method public void onClick();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Place {
+    method public androidx.car.app.model.CarLocation getLocation();
+    method public androidx.car.app.model.PlaceMarker? getMarker();
+  }
+
+  public static final class Place.Builder {
+    ctor public Place.Builder(androidx.car.app.model.CarLocation);
+    ctor public Place.Builder(androidx.car.app.model.Place);
+    method public androidx.car.app.model.Place build();
+    method public androidx.car.app.model.Place.Builder setMarker(androidx.car.app.model.PlaceMarker);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceListMapTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Place? getAnchor();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.OnContentRefreshDelegate? getOnContentRefreshDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isCurrentLocationEnabled();
+    method public boolean isLoading();
+  }
+
+  public static final class PlaceListMapTemplate.Builder {
+    ctor public PlaceListMapTemplate.Builder();
+    method public androidx.car.app.model.PlaceListMapTemplate build();
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setAnchor(androidx.car.app.model.Place);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setCurrentLocationEnabled(boolean);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.PlaceListMapTemplate.Builder setOnContentRefreshListener(androidx.car.app.model.OnContentRefreshListener);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceMarker {
+    method public androidx.car.app.model.CarColor? getColor();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public int getIconType();
+    method public androidx.car.app.model.CarText? getLabel();
+    field public static final int TYPE_ICON = 0; // 0x0
+    field public static final int TYPE_IMAGE = 1; // 0x1
+  }
+
+  public static final class PlaceMarker.Builder {
+    ctor public PlaceMarker.Builder();
+    method public androidx.car.app.model.PlaceMarker build();
+    method public androidx.car.app.model.PlaceMarker.Builder setColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.model.PlaceMarker.Builder setIcon(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.PlaceMarker.Builder setLabel(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Row implements androidx.car.app.model.Item {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.Metadata? getMetadata();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public int getRowImageType();
+    method public java.util.List<androidx.car.app.model.CarText!> getTexts();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public androidx.car.app.model.Toggle? getToggle();
+    method public boolean isBrowsable();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public boolean isEnabled();
+    method public androidx.car.app.model.Row row();
+    method public CharSequence yourBoat();
+    field public static final int IMAGE_TYPE_ICON = 4; // 0x4
+    field public static final int IMAGE_TYPE_LARGE = 2; // 0x2
+    field public static final int IMAGE_TYPE_SMALL = 1; // 0x1
+    field public static final int NO_DECORATION = -1; // 0xffffffff
+  }
+
+  public static final class Row.Builder {
+    ctor public Row.Builder();
+    method public androidx.car.app.model.Row.Builder addText(CharSequence);
+    method public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.Row build();
+    method public androidx.car.app.model.Row.Builder setBrowsable(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Row.Builder setEnabled(boolean);
+    method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.Row.Builder setMetadata(androidx.car.app.model.Metadata);
+    method public androidx.car.app.model.Row.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.Row.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.Row.Builder setToggle(androidx.car.app.model.Toggle);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface SearchCallbackDelegate {
+    method public void sendSearchSubmitted(String, androidx.car.app.OnDoneCallback);
+    method public void sendSearchTextChanged(String, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SearchTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public String? getInitialSearchText();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method public androidx.car.app.model.SearchCallbackDelegate getSearchCallbackDelegate();
+    method public String? getSearchHint();
+    method public boolean isLoading();
+    method public boolean isShowKeyboardByDefault();
+  }
+
+  public static final class SearchTemplate.Builder {
+    ctor public SearchTemplate.Builder(androidx.car.app.model.SearchTemplate.SearchCallback);
+    method public androidx.car.app.model.SearchTemplate build();
+    method public androidx.car.app.model.SearchTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.SearchTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.SearchTemplate.Builder setInitialSearchText(String);
+    method public androidx.car.app.model.SearchTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.SearchTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.SearchTemplate.Builder setSearchHint(String);
+    method public androidx.car.app.model.SearchTemplate.Builder setShowKeyboardByDefault(boolean);
+  }
+
+  public static interface SearchTemplate.SearchCallback {
+    method public default void onSearchSubmitted(String);
+    method public default void onSearchTextChanged(String);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SectionedItemList {
+    method public static androidx.car.app.model.SectionedItemList create(androidx.car.app.model.ItemList, CharSequence);
+    method public androidx.car.app.model.CarText getHeader();
+    method public androidx.car.app.model.ItemList getItemList();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface Template {
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TemplateInfo {
+    ctor public TemplateInfo(Class<? extends androidx.car.app.model.Template>, String);
+    method public Class<? extends androidx.car.app.model.Template> getTemplateClass();
+    method public String getTemplateId();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TemplateWrapper {
+    method public static androidx.car.app.model.TemplateWrapper copyOf(androidx.car.app.model.TemplateWrapper);
+    method public int getCurrentTaskStep();
+    method public String getId();
+    method public androidx.car.app.model.Template getTemplate();
+    method public java.util.List<androidx.car.app.model.TemplateInfo!> getTemplateInfosForScreenStack();
+    method public boolean isRefresh();
+    method public void setCurrentTaskStep(int);
+    method public void setId(String);
+    method public void setRefresh(boolean);
+    method public void setTemplate(androidx.car.app.model.Template);
+    method public static androidx.car.app.model.TemplateWrapper wrap(androidx.car.app.model.Template);
+    method public static androidx.car.app.model.TemplateWrapper wrap(androidx.car.app.model.Template, String);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Toggle {
+    method public androidx.car.app.model.OnCheckedChangeDelegate getOnCheckedChangeDelegate();
+    method public boolean isChecked();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public boolean isEnabled();
+  }
+
+  public static final class Toggle.Builder {
+    ctor public Toggle.Builder(androidx.car.app.model.Toggle.OnCheckedChangeListener);
+    method public androidx.car.app.model.Toggle build();
+    method public androidx.car.app.model.Toggle.Builder setChecked(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Toggle.Builder setEnabled(boolean);
+  }
+
+  public static interface Toggle.OnCheckedChangeListener {
+    method public void onCheckedChange(boolean);
+  }
+
+}
+
+package androidx.car.app.model.signin {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class InputSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    method public androidx.car.app.model.CarText? getDefaultValue();
+    method public androidx.car.app.model.CarText? getErrorMessage();
+    method public androidx.car.app.model.CarText? getHint();
+    method public androidx.car.app.model.InputCallbackDelegate getInputCallbackDelegate();
+    method public int getInputType();
+    method public int getKeyboardType();
+    method public boolean isShowKeyboardByDefault();
+    field public static final int INPUT_TYPE_DEFAULT = 1; // 0x1
+    field public static final int INPUT_TYPE_PASSWORD = 2; // 0x2
+    field public static final int KEYBOARD_DEFAULT = 1; // 0x1
+    field public static final int KEYBOARD_EMAIL = 2; // 0x2
+    field public static final int KEYBOARD_NUMBER = 4; // 0x4
+    field public static final int KEYBOARD_PHONE = 3; // 0x3
+  }
+
+  public static final class InputSignInMethod.Builder {
+    ctor public InputSignInMethod.Builder(androidx.car.app.model.InputCallback);
+    method public androidx.car.app.model.signin.InputSignInMethod build();
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setDefaultValue(String);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setErrorMessage(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setHint(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setInputType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setKeyboardType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setShowKeyboardByDefault(boolean);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class PinSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public PinSignInMethod(CharSequence);
+    method public androidx.car.app.model.CarText getPinCode();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class ProviderSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public ProviderSignInMethod(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Action getAction();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(4) public final class QRCodeSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public QRCodeSignInMethod(android.net.Uri);
+    method public android.net.Uri getUri();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class SignInTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.CarText? getAdditionalText();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText? getInstructions();
+    method public androidx.car.app.model.signin.SignInTemplate.SignInMethod getSignInMethod();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class SignInTemplate.Builder {
+    ctor public SignInTemplate.Builder(androidx.car.app.model.signin.SignInTemplate.SignInMethod);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate build();
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setAdditionalText(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setInstructions(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setTitle(CharSequence);
+  }
+
+  public static interface SignInTemplate.SignInMethod {
+  }
+
+}
+
+package androidx.car.app.navigation {
+
+  public class NavigationManager implements androidx.car.app.managers.Manager {
+    method @MainThread public void clearNavigationManagerCallback();
+    method @MainThread public void navigationEnded();
+    method @MainThread public void navigationStarted();
+    method @MainThread public void setNavigationManagerCallback(androidx.car.app.navigation.NavigationManagerCallback);
+    method @MainThread public void setNavigationManagerCallback(java.util.concurrent.Executor, androidx.car.app.navigation.NavigationManagerCallback);
+    method @MainThread public void updateTrip(androidx.car.app.navigation.model.Trip);
+  }
+
+  public interface NavigationManagerCallback {
+    method public default void onAutoDriveEnabled();
+    method public default void onStopNavigation();
+  }
+
+}
+
+package androidx.car.app.navigation.model {
+
+  @androidx.car.app.annotations.CarProtocol public final class Destination {
+    method public androidx.car.app.model.CarText? getAddress();
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.CarText? getName();
+  }
+
+  public static final class Destination.Builder {
+    ctor public Destination.Builder();
+    method public androidx.car.app.navigation.model.Destination build();
+    method public androidx.car.app.navigation.model.Destination.Builder setAddress(CharSequence);
+    method public androidx.car.app.navigation.model.Destination.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Destination.Builder setName(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Lane {
+    method public java.util.List<androidx.car.app.navigation.model.LaneDirection!> getDirections();
+  }
+
+  public static final class Lane.Builder {
+    ctor public Lane.Builder();
+    method public androidx.car.app.navigation.model.Lane.Builder addDirection(androidx.car.app.navigation.model.LaneDirection);
+    method public androidx.car.app.navigation.model.Lane build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class LaneDirection {
+    method public static androidx.car.app.navigation.model.LaneDirection create(int, boolean);
+    method public int getShape();
+    method public boolean isRecommended();
+    field public static final int SHAPE_NORMAL_LEFT = 5; // 0x5
+    field public static final int SHAPE_NORMAL_RIGHT = 6; // 0x6
+    field public static final int SHAPE_SHARP_LEFT = 7; // 0x7
+    field public static final int SHAPE_SHARP_RIGHT = 8; // 0x8
+    field public static final int SHAPE_SLIGHT_LEFT = 3; // 0x3
+    field public static final int SHAPE_SLIGHT_RIGHT = 4; // 0x4
+    field public static final int SHAPE_STRAIGHT = 2; // 0x2
+    field public static final int SHAPE_UNKNOWN = 1; // 0x1
+    field public static final int SHAPE_U_TURN_LEFT = 9; // 0x9
+    field public static final int SHAPE_U_TURN_RIGHT = 10; // 0xa
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Maneuver {
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public int getRoundaboutExitAngle();
+    method public int getRoundaboutExitNumber();
+    method public int getType();
+    field public static final int TYPE_DEPART = 1; // 0x1
+    field public static final int TYPE_DESTINATION = 39; // 0x27
+    field public static final int TYPE_DESTINATION_LEFT = 41; // 0x29
+    field public static final int TYPE_DESTINATION_RIGHT = 42; // 0x2a
+    field public static final int TYPE_DESTINATION_STRAIGHT = 40; // 0x28
+    field public static final int TYPE_FERRY_BOAT = 37; // 0x25
+    field public static final int TYPE_FERRY_BOAT_LEFT = 47; // 0x2f
+    field public static final int TYPE_FERRY_BOAT_RIGHT = 48; // 0x30
+    field public static final int TYPE_FERRY_TRAIN = 38; // 0x26
+    field public static final int TYPE_FERRY_TRAIN_LEFT = 49; // 0x31
+    field public static final int TYPE_FERRY_TRAIN_RIGHT = 50; // 0x32
+    field public static final int TYPE_FORK_LEFT = 25; // 0x19
+    field public static final int TYPE_FORK_RIGHT = 26; // 0x1a
+    field public static final int TYPE_KEEP_LEFT = 3; // 0x3
+    field public static final int TYPE_KEEP_RIGHT = 4; // 0x4
+    field public static final int TYPE_MERGE_LEFT = 27; // 0x1b
+    field public static final int TYPE_MERGE_RIGHT = 28; // 0x1c
+    field public static final int TYPE_MERGE_SIDE_UNSPECIFIED = 29; // 0x1d
+    field public static final int TYPE_NAME_CHANGE = 2; // 0x2
+    field public static final int TYPE_OFF_RAMP_NORMAL_LEFT = 23; // 0x17
+    field public static final int TYPE_OFF_RAMP_NORMAL_RIGHT = 24; // 0x18
+    field public static final int TYPE_OFF_RAMP_SLIGHT_LEFT = 21; // 0x15
+    field public static final int TYPE_OFF_RAMP_SLIGHT_RIGHT = 22; // 0x16
+    field public static final int TYPE_ON_RAMP_NORMAL_LEFT = 15; // 0xf
+    field public static final int TYPE_ON_RAMP_NORMAL_RIGHT = 16; // 0x10
+    field public static final int TYPE_ON_RAMP_SHARP_LEFT = 17; // 0x11
+    field public static final int TYPE_ON_RAMP_SHARP_RIGHT = 18; // 0x12
+    field public static final int TYPE_ON_RAMP_SLIGHT_LEFT = 13; // 0xd
+    field public static final int TYPE_ON_RAMP_SLIGHT_RIGHT = 14; // 0xe
+    field public static final int TYPE_ON_RAMP_U_TURN_LEFT = 19; // 0x13
+    field public static final int TYPE_ON_RAMP_U_TURN_RIGHT = 20; // 0x14
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW = 34; // 0x22
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW_WITH_ANGLE = 35; // 0x23
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW = 32; // 0x20
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW_WITH_ANGLE = 33; // 0x21
+    field public static final int TYPE_ROUNDABOUT_ENTER_CCW = 45; // 0x2d
+    field public static final int TYPE_ROUNDABOUT_ENTER_CW = 43; // 0x2b
+    field public static final int TYPE_ROUNDABOUT_EXIT_CCW = 46; // 0x2e
+    field public static final int TYPE_ROUNDABOUT_EXIT_CW = 44; // 0x2c
+    field public static final int TYPE_STRAIGHT = 36; // 0x24
+    field public static final int TYPE_TURN_NORMAL_LEFT = 7; // 0x7
+    field public static final int TYPE_TURN_NORMAL_RIGHT = 8; // 0x8
+    field public static final int TYPE_TURN_SHARP_LEFT = 9; // 0x9
+    field public static final int TYPE_TURN_SHARP_RIGHT = 10; // 0xa
+    field public static final int TYPE_TURN_SLIGHT_LEFT = 5; // 0x5
+    field public static final int TYPE_TURN_SLIGHT_RIGHT = 6; // 0x6
+    field public static final int TYPE_UNKNOWN = 0; // 0x0
+    field public static final int TYPE_U_TURN_LEFT = 11; // 0xb
+    field public static final int TYPE_U_TURN_RIGHT = 12; // 0xc
+  }
+
+  public static final class Maneuver.Builder {
+    ctor public Maneuver.Builder(int);
+    method public androidx.car.app.navigation.model.Maneuver build();
+    method public androidx.car.app.navigation.model.Maneuver.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Maneuver.Builder setRoundaboutExitAngle(@IntRange(from=1, to=360) int);
+    method public androidx.car.app.navigation.model.Maneuver.Builder setRoundaboutExitNumber(@IntRange(from=1) int);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class MapController {
+    method public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+  }
+
+  public static final class MapController.Builder {
+    ctor public MapController.Builder();
+    method public androidx.car.app.navigation.model.MapController build();
+    method public androidx.car.app.navigation.model.MapController.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.MapController.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class MapTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Header? getHeader();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method public androidx.car.app.navigation.model.MapController? getMapController();
+    method public androidx.car.app.model.Pane? getPane();
+  }
+
+  public static final class MapTemplate.Builder {
+    ctor public MapTemplate.Builder();
+    method public androidx.car.app.navigation.model.MapTemplate build();
+    method public androidx.car.app.navigation.model.MapTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.MapTemplate.Builder setHeader(androidx.car.app.model.Header);
+    method public androidx.car.app.navigation.model.MapTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.navigation.model.MapTemplate.Builder setMapController(androidx.car.app.navigation.model.MapController);
+    method public androidx.car.app.navigation.model.MapTemplate.Builder setPane(androidx.car.app.model.Pane);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class MessageInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.CarText? getText();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  public static final class MessageInfo.Builder {
+    ctor public MessageInfo.Builder(CharSequence);
+    ctor public MessageInfo.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.MessageInfo build();
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setText(CharSequence);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setText(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class NavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.CarColor? getBackgroundColor();
+    method public androidx.car.app.navigation.model.TravelEstimate? getDestinationTravelEstimate();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo? getNavigationInfo();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method @Deprecated @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.Toggle? getPanModeToggle();
+  }
+
+  public static final class NavigationTemplate.Builder {
+    ctor public NavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.NavigationTemplate build();
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setBackgroundColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setDestinationTravelEstimate(androidx.car.app.navigation.model.TravelEstimate);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setNavigationInfo(androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+  }
+
+  public static interface NavigationTemplate.NavigationInfo {
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public interface PanModeDelegate {
+    method public void sendPanModeChanged(boolean, androidx.car.app.OnDoneCallback);
+  }
+
+  public interface PanModeListener {
+    method public void onPanModeChanged(boolean);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceListNavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Header? getHeader();
+    method @Deprecated public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.model.OnContentRefreshDelegate? getOnContentRefreshDelegate();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method @Deprecated public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class PlaceListNavigationTemplate.Builder {
+    ctor public PlaceListNavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate build();
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setHeader(androidx.car.app.model.Header);
+    method @Deprecated public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setOnContentRefreshListener(androidx.car.app.model.OnContentRefreshListener);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+    method @Deprecated public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(CharSequence);
+    method @Deprecated public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class RoutePreviewNavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Header? getHeader();
+    method @Deprecated public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.model.Action? getNavigateAction();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method @Deprecated public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class RoutePreviewNavigationTemplate.Builder {
+    ctor public RoutePreviewNavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate build();
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setHeader(androidx.car.app.model.Header);
+    method @Deprecated public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setNavigateAction(androidx.car.app.model.Action);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+    method @Deprecated public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(CharSequence);
+    method @Deprecated public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class RoutingInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
+    method public androidx.car.app.model.Distance? getCurrentDistance();
+    method public androidx.car.app.navigation.model.Step? getCurrentStep();
+    method public androidx.car.app.model.CarIcon? getJunctionImage();
+    method public androidx.car.app.navigation.model.Step? getNextStep();
+    method public boolean isLoading();
+  }
+
+  public static final class RoutingInfo.Builder {
+    ctor public RoutingInfo.Builder();
+    method public androidx.car.app.navigation.model.RoutingInfo build();
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setCurrentStep(androidx.car.app.navigation.model.Step, androidx.car.app.model.Distance);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setJunctionImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setLoading(boolean);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setNextStep(androidx.car.app.navigation.model.Step);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Step {
+    method public androidx.car.app.model.CarText? getCue();
+    method public java.util.List<androidx.car.app.navigation.model.Lane!> getLanes();
+    method public androidx.car.app.model.CarIcon? getLanesImage();
+    method public androidx.car.app.navigation.model.Maneuver? getManeuver();
+    method public androidx.car.app.model.CarText? getRoad();
+  }
+
+  public static final class Step.Builder {
+    ctor public Step.Builder();
+    ctor public Step.Builder(CharSequence);
+    ctor public Step.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.Step.Builder addLane(androidx.car.app.navigation.model.Lane);
+    method public androidx.car.app.navigation.model.Step build();
+    method public androidx.car.app.navigation.model.Step.Builder setCue(CharSequence);
+    method public androidx.car.app.navigation.model.Step.Builder setLanesImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Step.Builder setManeuver(androidx.car.app.navigation.model.Maneuver);
+    method public androidx.car.app.navigation.model.Step.Builder setRoad(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TravelEstimate {
+    method public androidx.car.app.model.DateTimeWithZone? getArrivalTimeAtDestination();
+    method public androidx.car.app.model.Distance? getRemainingDistance();
+    method public androidx.car.app.model.CarColor? getRemainingDistanceColor();
+    method public androidx.car.app.model.CarColor? getRemainingTimeColor();
+    method public long getRemainingTimeSeconds();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.CarIcon? getTripIcon();
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.CarText? getTripText();
+    field public static final long REMAINING_TIME_UNKNOWN = -1L; // 0xffffffffffffffffL
+  }
+
+  public static final class TravelEstimate.Builder {
+    ctor public TravelEstimate.Builder(androidx.car.app.model.Distance, androidx.car.app.model.DateTimeWithZone);
+    ctor @RequiresApi(26) public TravelEstimate.Builder(androidx.car.app.model.Distance, java.time.ZonedDateTime);
+    method public androidx.car.app.navigation.model.TravelEstimate build();
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingDistanceColor(androidx.car.app.model.CarColor);
+    method @RequiresApi(26) public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTime(java.time.Duration);
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTimeColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTimeSeconds(@IntRange(from=0xffffffff) long);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.navigation.model.TravelEstimate.Builder setTripIcon(androidx.car.app.model.CarIcon);
+    method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.navigation.model.TravelEstimate.Builder setTripText(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Trip {
+    method public androidx.car.app.model.CarText? getCurrentRoad();
+    method public java.util.List<androidx.car.app.navigation.model.TravelEstimate!> getDestinationTravelEstimates();
+    method public java.util.List<androidx.car.app.navigation.model.Destination!> getDestinations();
+    method public java.util.List<androidx.car.app.navigation.model.TravelEstimate!> getStepTravelEstimates();
+    method public java.util.List<androidx.car.app.navigation.model.Step!> getSteps();
+    method public boolean isLoading();
+  }
+
+  public static final class Trip.Builder {
+    ctor public Trip.Builder();
+    method public androidx.car.app.navigation.model.Trip.Builder addDestination(androidx.car.app.navigation.model.Destination, androidx.car.app.navigation.model.TravelEstimate);
+    method public androidx.car.app.navigation.model.Trip.Builder addStep(androidx.car.app.navigation.model.Step, androidx.car.app.navigation.model.TravelEstimate);
+    method public androidx.car.app.navigation.model.Trip build();
+    method public androidx.car.app.navigation.model.Trip.Builder setCurrentRoad(CharSequence);
+    method public androidx.car.app.navigation.model.Trip.Builder setLoading(boolean);
+  }
+
+}
+
+package androidx.car.app.notification {
+
+  public final class CarAppExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public CarAppExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<android.app.Notification.Action!> getActions();
+    method public String? getChannelId();
+    method public androidx.car.app.model.CarColor? getColor();
+    method public android.app.PendingIntent? getContentIntent();
+    method public CharSequence? getContentText();
+    method public CharSequence? getContentTitle();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method public int getImportance();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @DrawableRes public int getSmallIcon();
+    method public static boolean isExtended(android.app.Notification);
+  }
+
+  public static final class CarAppExtender.Builder {
+    ctor public CarAppExtender.Builder();
+    method public androidx.car.app.notification.CarAppExtender.Builder addAction(@DrawableRes int, CharSequence, android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender build();
+    method public androidx.car.app.notification.CarAppExtender.Builder setChannelId(String);
+    method public androidx.car.app.notification.CarAppExtender.Builder setColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentIntent(android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentText(CharSequence);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentTitle(CharSequence);
+    method public androidx.car.app.notification.CarAppExtender.Builder setDeleteIntent(android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender.Builder setImportance(int);
+    method public androidx.car.app.notification.CarAppExtender.Builder setLargeIcon(android.graphics.Bitmap);
+    method public androidx.car.app.notification.CarAppExtender.Builder setSmallIcon(int);
+  }
+
+  public final class CarNotificationManager {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.car.app.notification.CarNotificationManager from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroup(String);
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannels();
+    method public void notify(int, androidx.core.app.NotificationCompat.Builder);
+    method public void notify(String?, int, androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public final class CarPendingIntent {
+    method public static android.app.PendingIntent getCarApp(android.content.Context, int, android.content.Intent, int);
+  }
+
+}
+
+package androidx.car.app.serialization {
+
+  public final class Bundleable implements android.os.Parcelable {
+    method public static androidx.car.app.serialization.Bundleable create(Object) throws androidx.car.app.serialization.BundlerException;
+    method public int describeContents();
+    method public Object get() throws androidx.car.app.serialization.BundlerException;
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.car.app.serialization.Bundleable!> CREATOR;
+  }
+
+  public class BundlerException extends java.lang.Exception {
+    ctor public BundlerException(String?, Throwable);
+    ctor public BundlerException(String?);
+  }
+
+}
+
+package androidx.car.app.suggestion {
+
+  @androidx.car.app.annotations.RequiresCarApi(5) public class SuggestionManager implements androidx.car.app.managers.Manager {
+    method @MainThread public void updateSuggestions(java.util.List<androidx.car.app.suggestion.model.Suggestion!>);
+  }
+
+}
+
+package androidx.car.app.suggestion.model {
+
+  @androidx.car.app.annotations.CarProtocol public final class Suggestion {
+    method public android.app.PendingIntent? getAction();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public String getIdentifier();
+    method public androidx.car.app.model.CarText? getSubtitle();
+    method public androidx.car.app.model.CarText getTitle();
+  }
+
+  public static final class Suggestion.Builder {
+    ctor public Suggestion.Builder();
+    method public androidx.car.app.suggestion.model.Suggestion build();
+    method public androidx.car.app.suggestion.model.Suggestion.Builder setAction(android.app.PendingIntent);
+    method public androidx.car.app.suggestion.model.Suggestion.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.suggestion.model.Suggestion.Builder setIdentifier(String);
+    method public androidx.car.app.suggestion.model.Suggestion.Builder setSubtitle(CharSequence);
+    method public androidx.car.app.suggestion.model.Suggestion.Builder setTitle(CharSequence);
+  }
+
+}
+
+package androidx.car.app.validation {
+
+  public final class HostValidator {
+    method public java.util.Map<java.lang.String!,java.util.List<java.lang.String!>!> getAllowedHosts();
+    method public boolean isValidHost(androidx.car.app.HostInfo);
+    field public static final androidx.car.app.validation.HostValidator ALLOW_ALL_HOSTS_VALIDATOR;
+    field public static final String TEMPLATE_RENDERER_PERMISSION = "android.car.permission.TEMPLATE_RENDERER";
+  }
+
+  public static final class HostValidator.Builder {
+    ctor public HostValidator.Builder(android.content.Context);
+    method public androidx.car.app.validation.HostValidator.Builder addAllowedHost(String, String);
+    method public androidx.car.app.validation.HostValidator.Builder addAllowedHosts(@ArrayRes int);
+    method public androidx.car.app.validation.HostValidator build();
+  }
+
+}
+
+package androidx.car.app.versioning {
+
+  public final class CarAppApiLevels {
+    method public static int getLatest();
+    method public static int getOldest();
+    field public static final int LEVEL_1 = 1; // 0x1
+    field public static final int LEVEL_2 = 2; // 0x2
+    field public static final int LEVEL_3 = 3; // 0x3
+    field public static final int LEVEL_4 = 4; // 0x4
+    field public static final int LEVEL_5 = 5; // 0x5
+    field public static final int LEVEL_6 = 6; // 0x6
+  }
+
+}
+
diff --git a/car/app/app/api/restricted_current.txt b/car/app/app/api/restricted_current.txt
index 0751150..306320a 100644
--- a/car/app/app/api/restricted_current.txt
+++ b/car/app/app/api/restricted_current.txt
@@ -977,10 +977,8 @@
   }
 
   @androidx.car.app.annotations.CarProtocol public final class Row implements androidx.car.app.model.Item {
-    method public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.CarIcon? getImage();
     method public androidx.car.app.model.Metadata? getMetadata();
-    method @androidx.car.app.annotations.RequiresCarApi(6) public int getNumericDecoration();
     method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
     method public int getRowImageType();
     method public java.util.List<androidx.car.app.model.CarText!> getTexts();
@@ -998,7 +996,6 @@
 
   public static final class Row.Builder {
     ctor public Row.Builder();
-    method public androidx.car.app.model.Row.Builder addAction(androidx.car.app.model.Action);
     method public androidx.car.app.model.Row.Builder addText(CharSequence);
     method public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
     method public androidx.car.app.model.Row build();
@@ -1007,7 +1004,6 @@
     method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon);
     method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon, int);
     method public androidx.car.app.model.Row.Builder setMetadata(androidx.car.app.model.Metadata);
-    method @androidx.car.app.annotations.RequiresCarApi(6) public androidx.car.app.model.Row.Builder setNumericDecoration(int);
     method public androidx.car.app.model.Row.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.Row.Builder setTitle(CharSequence);
     method public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/FanDirectionProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/FanDirectionProfile.java
index 618a190..5a166f0 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/FanDirectionProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/FanDirectionProfile.java
@@ -16,8 +16,6 @@
 
 package androidx.car.app.hardware.climate;
 
-import android.util.Pair;
-
 import androidx.annotation.NonNull;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.hardware.common.CarZone;
@@ -28,23 +26,23 @@
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_FAN_DIRECTION} feature such as supported min/max range values
- * for the feature.
+ * ClimateProfileRequest#FEATURE_FAN_DIRECTION} feature such as supported values for the feature
+ * specific to sets of car zones.
  */
 @ExperimentalCarApi
 public final class FanDirectionProfile {
 
     @NonNull
-    private final Map<Set<CarZone>, Pair<Integer, Integer>> mCarZoneSetsToFanDirectionValues;
+    private final Map<Set<CarZone>, Set<Integer>> mCarZoneSetsToFanDirectionValues;
 
     /**
-     * Returns a pair of supported min/max range values for the feature mapped to the set of car
+     * Returns a set of supported values for the feature mapped to the set of car
      * zones.
      *
      * <p>The values that can be regulated together for a set of car zones are combined together.
      */
     @NonNull
-    public Map<Set<CarZone>, Pair<Integer, Integer>> getCarZoneSetsToFanDirectionValues() {
+    public Map<Set<CarZone>, Set<Integer>> getCarZoneSetsToFanDirectionValues() {
         return mCarZoneSetsToFanDirectionValues;
     }
 
@@ -55,22 +53,19 @@
 
     /** A builder for FanDirectionProfile. */
     public static final class Builder {
-        Map<Set<CarZone>, Pair<Integer, Integer>> mCarZoneSetsToFanDirectionValues;
+        Map<Set<CarZone>, Set<Integer>> mCarZoneSetsToFanDirectionValues;
 
         /**
          * Creates an instance of builder.
          *
-         * @param carZoneSetsToFanDirectionValues   map of min/max range values for the property
-         *                                          corresponding to the set of car zones. The
-         *                                          range values could be one of the values
-         *                                          from [0,6] specified in {@link
-         *                                          android.car.VehicleHvacFanDirection
-         *                                          #VehicleHvacFanDirection}
-         *                                          and are obtained from property {@link
-         *                                          android.car.VehiclePropertyIds
-         *                                          #HVAC_FAN_DIRECTION_AVAILABLE}.
+         * @param carZoneSetsToFanDirectionValues   map of supported values for the property
+         *                                 corresponding to the set of car zones. The
+         *                                 range values could be one of the values
+         *                                 from [0,6] specified in {@link
+         *                                 androidx.car.app.hardware.common.CarPropertyProfile#
+         *                                 #VehicleHvacFanDirection}.
          */
-        public Builder(@NonNull Map<Set<CarZone>, Pair<Integer, Integer>>
+        public Builder(@NonNull Map<Set<CarZone>, Set<Integer>>
                 carZoneSetsToFanDirectionValues) {
             mCarZoneSetsToFanDirectionValues = Collections.unmodifiableMap(
                     carZoneSetsToFanDirectionValues);
@@ -83,7 +78,3 @@
         }
     }
 }
-
-
-
-
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Row.java b/car/app/app/src/main/java/androidx/car/app/model/Row.java
index a2ffd9b..804c1b5 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Row.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Row.java
@@ -25,11 +25,13 @@
 import android.os.Looper;
 
 import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
 import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.constraints.ActionsConstraints;
 import androidx.car.app.model.constraints.CarIconConstraints;
@@ -109,7 +111,7 @@
     @Keep
     private final List<Action> mActions;
     @Keep
-    private final int mDecoration;
+    private final int mNumericDecoration;
     @Keep
     @Nullable
     private final Toggle mToggle;
@@ -161,6 +163,7 @@
      *
      * @see Builder#addAction(Action)
      */
+    @ExperimentalCarApi
     @NonNull
     public List<Action> getActions() {
         return mActions;
@@ -181,9 +184,10 @@
      *
      * @see Builder#setNumericDecoration(int)
      */
+    @ExperimentalCarApi
     @RequiresCarApi(6)
     public int getNumericDecoration() {
-        return mDecoration;
+        return mNumericDecoration;
     }
 
     /**
@@ -311,7 +315,7 @@
         mTexts = CollectionUtils.unmodifiableCopy(builder.mTexts);
         mImage = builder.mImage;
         mActions = CollectionUtils.unmodifiableCopy(builder.mActions);
-        mDecoration = builder.mDecoration;
+        mNumericDecoration = builder.mDecoration;
         mToggle = builder.mToggle;
         mOnClickDelegate = builder.mOnClickDelegate;
         mMetadata = builder.mMetadata;
@@ -326,7 +330,7 @@
         mTexts = Collections.emptyList();
         mImage = null;
         mActions = Collections.emptyList();
-        mDecoration = NO_DECORATION;
+        mNumericDecoration = NO_DECORATION;
         mToggle = null;
         mOnClickDelegate = null;
         mMetadata = EMPTY_METADATA;
@@ -534,6 +538,7 @@
          *                                  exceeds the maximum number of allowed actions or does
          *                                  not contain a valid {@link CarIcon}.
          */
+        @ExperimentalCarApi
         @NonNull
         public Builder addAction(@NonNull Action action) {
             List<Action> mActionsCopy = new ArrayList<>(mActions);
@@ -556,8 +561,10 @@
          * {@link Row#NO_DECORATION}.
          * @throws IllegalArgumentException if {@code decoration} is invalid
          */
+        @ExperimentalCarApi
         @NonNull
         @RequiresCarApi(6)
+        @IntRange(from = 0)
         public Builder setNumericDecoration(int decoration) {
             if (decoration < 0 && decoration != NO_DECORATION) {
                 throw new IllegalArgumentException(
diff --git a/collection/collection-benchmark-js/.gitignore b/collection/collection-benchmark-js/.gitignore
deleted file mode 100644
index b512c09..0000000
--- a/collection/collection-benchmark-js/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
\ No newline at end of file
diff --git a/collection/collection-benchmark-js/README.md b/collection/collection-benchmark-js/README.md
deleted file mode 100644
index 38ad590..0000000
--- a/collection/collection-benchmark-js/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# AndroidX Collection Benchmarks for Kotlin/JS
-
-This directory builds a set of AndroidX Collection benchmarks for Kotlin/JS.
-
-This project depends on node.js. Run this one-time setup task first:
-
-    ./gradlew -Pandroidx.github.build=true :collection:collection-benchmark-js:setupJsBenchmark
-
-To run the benchmarks:
-
-    ./gradlew :collection:collection-benchmark-js:runJsBenchmark
-
-The output will look something like this:
-
-```
-circularArray_addFromHeadAndPopFromTail x 2,256 ops/sec ±1.96% (88 runs sampled)
-circularArray_addFromTailAndPopFromHead x 2,355 ops/sec ±1.04% (93 runs sampled)
-lruCache_allHits x 65.37 ops/sec ±0.75% (68 runs sampled)
-lruCache_allMisses x 402 ops/sec ±0.79% (88 runs sampled)
-lruCache_customCreate x 52,805 ops/sec ±0.74% (89 runs sampled)
-benchmark suite completed
-```
diff --git a/collection/collection-benchmark-js/build.gradle b/collection/collection-benchmark-js/build.gradle
deleted file mode 100644
index 4be9163..0000000
--- a/collection/collection-benchmark-js/build.gradle
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-def githubBuild = project.properties['androidx.github.build'] ?: false
-if (githubBuild) {
-    task setupJsBenchmark(type: Exec) {
-        inputs.file("package.json")
-        inputs.file("package-lock.json")
-
-        commandLine 'npm', 'install'
-
-        outputs.dir("node_modules")
-    }
-
-    task linkCollectionPackage(type: Exec) {
-        def compileTaskName = ':collection:collection:compileKotlinJs'
-        dependsOn compileTaskName
-
-        // Store where the node module is located. Subject to future changes.
-        def npmPackageDir = ''
-        tasks.getByPath(compileTaskName).outputs.files.each {
-            def matcher = it.toString() =~ /(.+)\/kotlin$/
-            if (matcher) {
-                npmPackageDir = matcher.group(1)
-            }
-        }
-
-        outputs.dir(npmPackageDir)
-
-        // Symlink the built module to the working dir's node_modules/. This enables
-        // our benchmark code to use Collection KMP.
-        commandLine 'npm', 'link', npmPackageDir
-    }
-
-    task runJsBenchmark(type: Exec) {
-        dependsOn linkCollectionPackage
-        commandLine 'node', 'src/js/main.js'
-    }
-}
diff --git a/collection/collection-benchmark-js/package-lock.json b/collection/collection-benchmark-js/package-lock.json
deleted file mode 100644
index 6ae27ff..0000000
--- a/collection/collection-benchmark-js/package-lock.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
-  "name": "collection-benchmark-js",
-  "lockfileVersion": 2,
-  "requires": true,
-  "packages": {
-    "": {
-      "dependencies": {
-        "benchmark": "2.1.4"
-      }
-    },
-    "node_modules/benchmark": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz",
-      "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=",
-      "dependencies": {
-        "lodash": "^4.17.4",
-        "platform": "^1.3.3"
-      }
-    },
-    "node_modules/lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-    },
-    "node_modules/platform": {
-      "version": "1.3.6",
-      "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
-      "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="
-    }
-  },
-  "dependencies": {
-    "benchmark": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz",
-      "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=",
-      "requires": {
-        "lodash": "^4.17.4",
-        "platform": "^1.3.3"
-      }
-    },
-    "lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-    },
-    "platform": {
-      "version": "1.3.6",
-      "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
-      "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="
-    }
-  }
-}
diff --git a/collection/collection-benchmark-js/package.json b/collection/collection-benchmark-js/package.json
deleted file mode 100644
index 026e4e6..0000000
--- a/collection/collection-benchmark-js/package.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "dependencies": {
-    "benchmark": "2.1.4"
-  }
-}
diff --git a/collection/collection-benchmark-js/src/js/main.js b/collection/collection-benchmark-js/src/js/main.js
deleted file mode 100644
index 184a388..0000000
--- a/collection/collection-benchmark-js/src/js/main.js
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-let Benchmark = require('benchmark');
-let suite = new Benchmark.Suite();
-
-let Collection = require('androidx-collection')
-    .androidx.collection;
-
-let SourceValues = [];
-for (let i = 0; i < 10000; i++) {
-    SourceValues.push(`value ${i}`);
-}
-
-console.log('benchmark suite started');
-
-suite.add('circularArray_addFromHeadAndPopFromTail', function() {
-    let circularArray = new Collection.CircularArray();
-
-    console.assert(circularArray.isEmpty());
-    for (let value in SourceValues) {
-        circularArray.addFirst(value);
-    }
-    console.assert(!circularArray.isEmpty());
-    console.assert(circularArray.size == SourceValues.length);
-
-    var numPopped = 0;
-    let numElements = SourceValues.length;
-
-    while (!circularArray.isEmpty()) {
-        circularArray.popLast();
-        numPopped++;
-    }
-    console.assert(numPopped === numElements);
-})
-.add('circularArray_addFromTailAndPopFromHead', function() {
-    let circularArray = new Collection.CircularArray();
-
-    console.assert(circularArray.isEmpty());
-    for (let value in SourceValues) {
-        circularArray.addLast(value);
-    }
-    console.assert(!circularArray.isEmpty());
-    console.assert(circularArray.size == SourceValues.length);
-
-    var numPopped = 0;
-    let numElements = SourceValues.length;
-
-    while (!circularArray.isEmpty()) {
-        circularArray.popFirst();
-        numPopped++;
-    }
-    console.assert(numPopped === numElements);
-})
-.add('lruCache_allHits', function() {
-    let cache = Collection.LruCache$int(SourceValues.length);
-    for (let key in SourceValues) {
-        cache.put(key, key);
-    }
-    for (let key in SourceValues) {
-        let value = cache.get(key);
-        console.assert(value === key);
-    }
-    console.assert(cache.hitCount() == SourceValues.length);
-    console.assert(cache.missCount() == 0);
-})
-.add('lruCache_allMisses', function() {
-    let cache = Collection.LruCache$int(SourceValues.length);
-    for (let key in SourceValues) {
-        let value = cache.get(key);
-        console.assert(value === null);
-    }
-    console.assert(cache.hitCount() == 0);
-    console.assert(cache.missCount() == SourceValues.length);
-})
-.add('lruCache_customCreate', function() {
-    let cache = Collection.LruCache$int(2);
-    cache.create = function(key) { return `value_${key}`; };
-
-    cache.put('foo', '1');
-    cache.put('bar', '1');
-    let value = cache.get('baz');
-    console.assert(value == 'value_baz');
-    console.assert(cache.size == 2);
-    console.assert(cache.hitCount() == 0);
-    console.assert(cache.missCount() == 1);
-
-    let value2 = cache.get('baz');
-    console.assert(value2 == 'value_baz');
-    console.assert(cache.hitCount() == 1);
-    console.assert(cache.missCount() == 1);
-})
-.on('cycle', function(event) {
-  console.log(String(event.target));
-})
-.on('complete', function() {
-  console.log('benchmark suite completed');
-})
-.run({ 'async': false });
diff --git a/collection/collection-benchmark-kmp/build.gradle b/collection/collection-benchmark-kmp/build.gradle
new file mode 100644
index 0000000..fdcc30b
--- /dev/null
+++ b/collection/collection-benchmark-kmp/build.gradle
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import androidx.build.KmpPlatformsKt
+import androidx.build.Publish
+import org.jetbrains.kotlin.konan.target.HostManager
+import org.jetbrains.kotlin.konan.target.KonanTarget
+
+plugins {
+    id("AndroidXPlugin")
+    alias(libs.plugins.kotlinBenchmark)
+}
+
+androidXMultiplatform {
+    jvm() // No-op target needed for CI to succeed, see b/243154573
+    ios()
+    mac()
+    linux()
+
+    sourceSets {
+        commonMain {
+            dependencies {
+                implementation(project(":collection:collection"))
+                implementation(libs.kotlinBenchmarkRuntime)
+                implementation(libs.kotlinTest)
+            }
+        }
+    }
+}
+
+benchmark {
+    configurations {
+        main {
+            iterations = 5
+            iterationTime = 300
+            iterationTimeUnit = "ms"
+        }
+    }
+
+    targets {
+        if (KmpPlatformsKt.enableLinux(project) && HostManager.hostIsLinux) {
+            register("linuxX64")
+        }
+
+        if (KmpPlatformsKt.enableMac(project)) {
+            if (HostManager.host == KonanTarget.MACOS_X64) {
+                register("macosX64")
+            }
+
+            if (HostManager.host == KonanTarget.MACOS_ARM64) {
+                register("macosArm64")
+            }
+        }
+    }
+}
+
+androidx {
+    publish = Publish.NONE
+}
diff --git a/collection/collection-benchmark-kmp/src/commonMain/kotlin/androidx/collection/CircularArrayBenchmark.kt b/collection/collection-benchmark-kmp/src/commonMain/kotlin/androidx/collection/CircularArrayBenchmark.kt
new file mode 100644
index 0000000..4e9a7ff
--- /dev/null
+++ b/collection/collection-benchmark-kmp/src/commonMain/kotlin/androidx/collection/CircularArrayBenchmark.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.collection
+
+import kotlin.test.assertEquals
+import kotlin.test.assertTrue
+import kotlinx.benchmark.Benchmark
+import kotlinx.benchmark.Scope
+import kotlinx.benchmark.State
+
+@State(Scope.Benchmark)
+open class CircularArrayBenchmark {
+    private val source = Array(10_000) { "value $it" }
+
+    @Benchmark
+    open fun addFromHeadAndPopFromTail() {
+        val array = CircularArray<String>(8)
+        for (element in source) {
+            array.addFirst(element)
+        }
+
+        assertEquals(source.count(), array.size())
+
+        for (i in source.indices) {
+            array.popLast()
+        }
+
+        assertTrue(array.isEmpty())
+    }
+
+    @Benchmark
+    open fun addFromTailAndPopFromHead() {
+        val array = CircularArray<String>(8)
+        for (element in source) {
+            array.addLast(element)
+        }
+
+        assertEquals(source.count(), array.size())
+
+        repeat(source.size) {
+            array.popFirst()
+        }
+
+        assertTrue(array.isEmpty())
+    }
+}
diff --git a/collection/collection-benchmark-kmp/src/commonMain/kotlin/androidx/collection/LruCacheBenchmark.kt b/collection/collection-benchmark-kmp/src/commonMain/kotlin/androidx/collection/LruCacheBenchmark.kt
new file mode 100644
index 0000000..1e61af2
--- /dev/null
+++ b/collection/collection-benchmark-kmp/src/commonMain/kotlin/androidx/collection/LruCacheBenchmark.kt
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.collection
+
+import kotlin.test.assertEquals
+import kotlin.test.assertNull
+import kotlinx.benchmark.Benchmark
+import kotlinx.benchmark.Scope
+import kotlinx.benchmark.State
+
+@State(Scope.Benchmark)
+open class LruCacheBenchmark {
+    private val source = Array(10_000) { "value $it" }
+
+    @Benchmark
+    open fun allHits() {
+        val cache = LruCache<String, String>(source.size)
+        for (key in source) {
+            cache.put(key, key)
+        }
+        for (key in source) {
+            val value = cache[key]
+            assertEquals(key, value)
+        }
+        assertEquals(source.size, cache.hitCount())
+        assertEquals(0, cache.missCount())
+    }
+
+    @Benchmark
+    open fun allMisses() {
+        val cache = LruCache<String, String>(source.size)
+        for (key in source) {
+            val value = cache[key]
+            assertNull(value)
+        }
+        assertEquals(0, cache.hitCount())
+        assertEquals(source.size, cache.missCount())
+    }
+
+    @Benchmark
+    open fun customCreate() {
+        val cache = object : LruCache<String, String>(2) {
+            override fun create(key: String): String {
+                return "value_$key"
+            }
+        }
+
+        cache.put("foo", "1")
+        cache.put("bar", "1")
+        val value = cache["baz"]
+        assertEquals("value_baz", value)
+        assertEquals(2, cache.size())
+        assertEquals(0, cache.hitCount())
+        assertEquals(1, cache.missCount())
+
+        val value2 = cache["baz"]
+        assertEquals("value_baz", value2)
+        assertEquals(1, cache.hitCount())
+        assertEquals(1, cache.missCount())
+    }
+}
\ No newline at end of file
diff --git a/collection/collection-benchmark-kmp/src/commonMain/kotlin/androidx/collection/SimpleArrayMapBenchmark.kt b/collection/collection-benchmark-kmp/src/commonMain/kotlin/androidx/collection/SimpleArrayMapBenchmark.kt
new file mode 100644
index 0000000..13f336a
--- /dev/null
+++ b/collection/collection-benchmark-kmp/src/commonMain/kotlin/androidx/collection/SimpleArrayMapBenchmark.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.collection
+
+import kotlin.test.assertEquals
+import kotlin.test.assertTrue
+import kotlinx.benchmark.Benchmark
+import kotlinx.benchmark.Scope
+import kotlinx.benchmark.State
+
+@State(Scope.Benchmark)
+open class SimpleArrayMapBenchmark {
+    private val source = List(10_000) { "key $it" to "value $it" }.toMap()
+
+    @Benchmark
+    open fun addAllThenRemoveIndividually() {
+        val map = SimpleArrayMap<String, String>(source.size)
+        for (entry in source) {
+            map.put(entry.key, entry.value)
+        }
+
+        assertEquals(source.size, map.size())
+
+        for (key in source.keys) {
+            map.remove(key)
+        }
+
+        assertTrue(map.isEmpty())
+    }
+}
diff --git a/collection/collection-benchmark-native/README.md b/collection/collection-benchmark-native/README.md
deleted file mode 100644
index 4df3b6b..0000000
--- a/collection/collection-benchmark-native/README.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# AndroidX Collection Benchmarks for Native Platforms
-
-This directory builds a set of benchmarks for AndroidX Collection on native
-platforms. Currently only macOS (x86_64) is supported.
-
-To build, run in the collection project root:
-
-    ./gradlew --no-configuration-cache -Pandroidx.github.build=true :collection:collection-benchmark-native:assemble
-
-Then execute the resulting binary at:
-
-    ../../out/androidx/collection/collection-benchmark-native/build/exe/main/debug/collection-benchmark-native
-
-The output will look something like this:
-
-```
-Running ../../out/collection-playground/collection-playground/collection/collection-benchmark-native/build/install/main/debug/lib/collection-benchmark-native
-Run on (12 X 2900 MHz CPU s)
-CPU Caches:
-  L1 Data 32 KiB (x6)
-  L1 Instruction 32 KiB (x6)
-  L2 Unified 256 KiB (x6)
-  L3 Unified 12288 KiB (x1)
-Load Average: 2.21, 2.43, 2.23
---------------------------------------------------------------------------------------------------------
-Benchmark                                                              Time             CPU   Iterations
---------------------------------------------------------------------------------------------------------
-BM_CircularArray_addFromHeadAndPopFromTail_ObjCCallingKMP        4599997 ns      4590038 ns          158
-BM_SimpleArrayMap_addAllThenRemoveIndividually_ObjCCallingKMP 1635764920 ns   1628431000 ns            1
-```
-
-This project assumes you have
-[Google Benchmark](https://github.com/google/benchmark) installed. It also
-assumes you have installed Xcode.
diff --git a/collection/collection-benchmark-native/build.gradle b/collection/collection-benchmark-native/build.gradle
deleted file mode 100644
index 4efef3a..0000000
--- a/collection/collection-benchmark-native/build.gradle
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-plugins {}
-
-def githubBuild = project.properties['androidx.github.build'] ?: false
-if (githubBuild) {
-    apply plugin: "cpp-application"
-
-    def COLLECTION_KMP_FRAMEWORK_NAME = 'CollectionKMP'
-    def FRAMEWORK_TASK = ':collection:collection:linkReleaseFrameworkMacosX64'
-
-    tasks.withType(CppCompile) {
-        def frameworkPath = tasks.getByPath(FRAMEWORK_TASK).outputs.files.singleFile.toString()
-
-        // Add *.m and *.mm files to the source set, since by default the C++ plug-in doesn't do
-        // that.
-        def sourceFiles = files("src/main/objc/").asFileTree.matching { include("**/*.m?") }
-        inputs.files(sourceFiles)
-        source.from(sourceFiles)
-
-        compilerArgs.addAll '-x', 'objective-c++', '-F', frameworkPath
-    }
-
-    tasks.withType(LinkExecutable) {
-        def frameworkTask = tasks.getByPath(FRAMEWORK_TASK)
-        dependsOn(frameworkTask)
-
-        def frameworkPath = frameworkTask.outputs.files.singleFile.toString()
-        linkerArgs.addAll '-framework', 'Foundation',
-                '-l', 'benchmark',
-                '-framework', COLLECTION_KMP_FRAMEWORK_NAME,
-                '-F', frameworkPath,
-                '-rpath', frameworkPath
-    }
-}
diff --git a/collection/collection-benchmark-native/src/main/objc/main.mm b/collection/collection-benchmark-native/src/main/objc/main.mm
deleted file mode 100644
index f9053d5..0000000
--- a/collection/collection-benchmark-native/src/main/objc/main.mm
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#import <CollectionKMP/CollectionKMP.h>
-#import <Foundation/Foundation.h>
-#import <benchmark/benchmark.h>
-
-static NSArray *GenerateOrderedStrings(int size) {
-  NSMutableArray *array = [NSMutableArray array];
-  for (int i = 0; i < size; i++) {
-    [array addObject:[NSString stringWithFormat:@"value %d", i]];
-  }
-  return array;
-}
-
-static NSDictionary *GenerateSourceMap(int size) {
-  NSMutableDictionary *dict = [NSMutableDictionary dictionary];
-  for (int i = 0; i < size; i++) {
-    [dict setObject:[NSString stringWithFormat:@"value %d", i]
-             forKey:[NSString stringWithFormat:@"key %d", i]];
-  }
-  return dict;
-}
-
-const int CircularArray_sourceSetSize = 10000;
-const int SimpleArrayMap_sourceMapSize = 10000;
-
-static void CircularArray_addFromHeadAndPopFromTail_ObjCCallingKMP(NSArray *source) {
-  @autoreleasepool {
-    CKMPCircularArray *array = [[CKMPCircularArray alloc] initWithMinCapacity:8];
-    for (id element in source) {
-      [array addFirstE:element];
-    }
-    NSCAssert([array size] == [source count], @"");
-    for (NSInteger i = 0, s = [source count]; i < s; i++) {
-      [array popLast];
-    }
-    NSCAssert([array isEmpty], @"");
-  }
-}
-
-static void BM_CircularArray_addFromHeadAndPopFromTail_ObjCCallingKMP(benchmark::State &state) {
-  NSArray *source = GenerateOrderedStrings(CircularArray_sourceSetSize);
-  for (auto _ : state) {
-    CircularArray_addFromHeadAndPopFromTail_ObjCCallingKMP(source);
-  }
-}
-BENCHMARK(BM_CircularArray_addFromHeadAndPopFromTail_ObjCCallingKMP);
-
-static void SimpleArrayMap_addAllThenRemoveIndividually_ObjCCallingKMP(NSDictionary *source) {
-  @autoreleasepool {
-    CKMPSimpleArrayMap<NSString *, NSString *> *map =
-        [[CKMPSimpleArrayMap alloc] initWithCapacity:(int)[source count]];
-    for (id key in source) {
-      [map putKey:key value:[source objectForKey:key]];
-    }
-    NSCAssert([map size] == [source count], @"");
-    for (id key in source) {
-      [map removeKey:key];
-    }
-    NSCAssert([map isEmpty], @"");
-  }
-}
-
-static void BM_SimpleArrayMap_addAllThenRemoveIndividually_ObjCCallingKMP(benchmark::State &state) {
-  NSDictionary *source = GenerateSourceMap(SimpleArrayMap_sourceMapSize);
-  for (auto _ : state) {
-    SimpleArrayMap_addAllThenRemoveIndividually_ObjCCallingKMP(source);
-  }
-}
-BENCHMARK(BM_SimpleArrayMap_addAllThenRemoveIndividually_ObjCCallingKMP);
-
-int main(int argc, char **argv) {
-  @autoreleasepool {
-    ::benchmark::Initialize(&argc, argv);
-    if (::benchmark::ReportUnrecognizedArguments(argc, argv)) return 1;
-    ::benchmark::RunSpecifiedBenchmarks();
-  }
-}
diff --git a/compose/animation/animation-core/build.gradle b/compose/animation/animation-core/build.gradle
index c134670..8eacf55 100644
--- a/compose/animation/animation-core/build.gradle
+++ b/compose/animation/animation-core/build.gradle
@@ -148,7 +148,6 @@
 tasks.withType(KotlinCompile).configureEach {
     kotlinOptions {
         freeCompilerArgs += [
-                "-opt-in=kotlin.Experimental",
                 "-Xjvm-default=all"
         ]
     }
diff --git a/compose/compiler/compiler-hosted/build.gradle b/compose/compiler/compiler-hosted/build.gradle
index ef9ee4a..334381c 100644
--- a/compose/compiler/compiler-hosted/build.gradle
+++ b/compose/compiler/compiler-hosted/build.gradle
@@ -35,8 +35,7 @@
     kotlinOptions {
         jvmTarget = "1.8"
         freeCompilerArgs = [
-                "-Xskip-metadata-version-check",
-                "-opt-in=kotlin.RequiresOptIn"
+                "-Xskip-metadata-version-check"
         ]
     }
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/build.gradle b/compose/compiler/compiler-hosted/integration-tests/build.gradle
index 9621fe4..82135c6 100644
--- a/compose/compiler/compiler-hosted/integration-tests/build.gradle
+++ b/compose/compiler/compiler-hosted/integration-tests/build.gradle
@@ -79,12 +79,6 @@
     namespace "androidx.compose.runtime.tests"
 }
 
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 androidx {
     name = "AndroidX Compiler CLI Tests"
     publish = Publish.NONE
diff --git a/compose/foundation/foundation/api/1.3.0-beta02.txt b/compose/foundation/foundation/api/1.3.0-beta02.txt
index 7dabd8c..efa4c27 100644
--- a/compose/foundation/foundation/api/1.3.0-beta02.txt
+++ b/compose/foundation/foundation/api/1.3.0-beta02.txt
@@ -710,6 +710,9 @@
 
 package androidx.compose.foundation.lazy.staggeredgrid {
 
+  public final class LazyStaggeredGridCellsKt {
+  }
+
   public final class LazyStaggeredGridDslKt {
   }
 
diff --git a/compose/foundation/foundation/api/current.txt b/compose/foundation/foundation/api/current.txt
index 7dabd8c..efa4c27 100644
--- a/compose/foundation/foundation/api/current.txt
+++ b/compose/foundation/foundation/api/current.txt
@@ -710,6 +710,9 @@
 
 package androidx.compose.foundation.lazy.staggeredgrid {
 
+  public final class LazyStaggeredGridCellsKt {
+  }
+
   public final class LazyStaggeredGridDslKt {
   }
 
diff --git a/compose/foundation/foundation/api/public_plus_experimental_1.3.0-beta02.txt b/compose/foundation/foundation/api/public_plus_experimental_1.3.0-beta02.txt
index 0954074..46b81fd 100644
--- a/compose/foundation/foundation/api/public_plus_experimental_1.3.0-beta02.txt
+++ b/compose/foundation/foundation/api/public_plus_experimental_1.3.0-beta02.txt
@@ -859,15 +859,47 @@
 
 package androidx.compose.foundation.lazy.staggeredgrid {
 
+  public final class LazyStaggeredGridCellsKt {
+  }
+
   public final class LazyStaggeredGridDslKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyHorizontalStaggeredGrid(androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells rows, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState state, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope,kotlin.Unit> content);
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyVerticalStaggeredGrid(androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells columns, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState state, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope,kotlin.Unit> content);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static <T> void items(androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super T,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static <T> void items(androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super T,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static <T> void itemsIndexed(androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static <T> void itemsIndexed(androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public interface LazyStaggeredGridItemInfo {
+    method public int getIndex();
+    method public Object getKey();
+    method public int getLane();
+    method public long getOffset();
+    method public long getSize();
+    property public abstract int index;
+    property public abstract Object key;
+    property public abstract int lane;
+    property public abstract long offset;
+    property public abstract long size;
   }
 
   public final class LazyStaggeredGridItemProviderKt {
   }
 
+  @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface LazyStaggeredGridItemScope {
+  }
+
   public final class LazyStaggeredGridKt {
   }
 
+  @androidx.compose.foundation.ExperimentalFoundationApi public interface LazyStaggeredGridLayoutInfo {
+    method public int getTotalItemsCount();
+    method public java.util.List<androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemInfo> getVisibleItemsInfo();
+    property public abstract int totalItemsCount;
+    property public abstract java.util.List<androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemInfo> visibleItemsInfo;
+  }
+
   public final class LazyStaggeredGridMeasureKt {
   }
 
@@ -877,7 +909,51 @@
   public final class LazyStaggeredGridMeasureResultKt {
   }
 
+  @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface LazyStaggeredGridScope {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public void item(optional Object? key, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,kotlin.Unit> content);
+    method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public final class LazyStaggeredGridState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public LazyStaggeredGridState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemOffset);
+    method public suspend Object? animateScrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public float dispatchRawDelta(float delta);
+    method public int getFirstVisibleItemIndex();
+    method public int getFirstVisibleItemScrollOffset();
+    method public androidx.compose.foundation.interaction.InteractionSource getInteractionSource();
+    method public androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridLayoutInfo getLayoutInfo();
+    method public boolean isScrollInProgress();
+    method public suspend Object? scroll(androidx.compose.foundation.MutatePriority scrollPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.ScrollScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? scrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public final int firstVisibleItemIndex;
+    property public final int firstVisibleItemScrollOffset;
+    property public final androidx.compose.foundation.interaction.InteractionSource interactionSource;
+    property public boolean isScrollInProgress;
+    property public final androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridLayoutInfo layoutInfo;
+    field public static final androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState.Companion Companion;
+  }
+
+  public static final class LazyStaggeredGridState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState,java.lang.Object> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState,java.lang.Object> Saver;
+  }
+
   public final class LazyStaggeredGridStateKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState rememberLazyStaggeredGridState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public interface StaggeredGridCells {
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  public static final class StaggeredGridCells.Adaptive implements androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells {
+    ctor public StaggeredGridCells.Adaptive(float minSize);
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  public static final class StaggeredGridCells.Fixed implements androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells {
+    ctor public StaggeredGridCells.Fixed(int count);
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
   }
 
 }
diff --git a/compose/foundation/foundation/api/public_plus_experimental_current.txt b/compose/foundation/foundation/api/public_plus_experimental_current.txt
index 0954074..46b81fd 100644
--- a/compose/foundation/foundation/api/public_plus_experimental_current.txt
+++ b/compose/foundation/foundation/api/public_plus_experimental_current.txt
@@ -859,15 +859,47 @@
 
 package androidx.compose.foundation.lazy.staggeredgrid {
 
+  public final class LazyStaggeredGridCellsKt {
+  }
+
   public final class LazyStaggeredGridDslKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyHorizontalStaggeredGrid(androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells rows, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState state, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope,kotlin.Unit> content);
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyVerticalStaggeredGrid(androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells columns, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState state, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope,kotlin.Unit> content);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static <T> void items(androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super T,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static <T> void items(androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super T,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static <T> void itemsIndexed(androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static <T> void itemsIndexed(androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public interface LazyStaggeredGridItemInfo {
+    method public int getIndex();
+    method public Object getKey();
+    method public int getLane();
+    method public long getOffset();
+    method public long getSize();
+    property public abstract int index;
+    property public abstract Object key;
+    property public abstract int lane;
+    property public abstract long offset;
+    property public abstract long size;
   }
 
   public final class LazyStaggeredGridItemProviderKt {
   }
 
+  @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface LazyStaggeredGridItemScope {
+  }
+
   public final class LazyStaggeredGridKt {
   }
 
+  @androidx.compose.foundation.ExperimentalFoundationApi public interface LazyStaggeredGridLayoutInfo {
+    method public int getTotalItemsCount();
+    method public java.util.List<androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemInfo> getVisibleItemsInfo();
+    property public abstract int totalItemsCount;
+    property public abstract java.util.List<androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemInfo> visibleItemsInfo;
+  }
+
   public final class LazyStaggeredGridMeasureKt {
   }
 
@@ -877,7 +909,51 @@
   public final class LazyStaggeredGridMeasureResultKt {
   }
 
+  @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface LazyStaggeredGridScope {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public void item(optional Object? key, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,kotlin.Unit> content);
+    method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public final class LazyStaggeredGridState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public LazyStaggeredGridState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemOffset);
+    method public suspend Object? animateScrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public float dispatchRawDelta(float delta);
+    method public int getFirstVisibleItemIndex();
+    method public int getFirstVisibleItemScrollOffset();
+    method public androidx.compose.foundation.interaction.InteractionSource getInteractionSource();
+    method public androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridLayoutInfo getLayoutInfo();
+    method public boolean isScrollInProgress();
+    method public suspend Object? scroll(androidx.compose.foundation.MutatePriority scrollPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.ScrollScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? scrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public final int firstVisibleItemIndex;
+    property public final int firstVisibleItemScrollOffset;
+    property public final androidx.compose.foundation.interaction.InteractionSource interactionSource;
+    property public boolean isScrollInProgress;
+    property public final androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridLayoutInfo layoutInfo;
+    field public static final androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState.Companion Companion;
+  }
+
+  public static final class LazyStaggeredGridState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState,java.lang.Object> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState,java.lang.Object> Saver;
+  }
+
   public final class LazyStaggeredGridStateKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState rememberLazyStaggeredGridState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public interface StaggeredGridCells {
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  public static final class StaggeredGridCells.Adaptive implements androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells {
+    ctor public StaggeredGridCells.Adaptive(float minSize);
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  public static final class StaggeredGridCells.Fixed implements androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells {
+    ctor public StaggeredGridCells.Fixed(int count);
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
   }
 
 }
diff --git a/compose/foundation/foundation/api/restricted_1.3.0-beta02.txt b/compose/foundation/foundation/api/restricted_1.3.0-beta02.txt
index 7dabd8c..efa4c27 100644
--- a/compose/foundation/foundation/api/restricted_1.3.0-beta02.txt
+++ b/compose/foundation/foundation/api/restricted_1.3.0-beta02.txt
@@ -710,6 +710,9 @@
 
 package androidx.compose.foundation.lazy.staggeredgrid {
 
+  public final class LazyStaggeredGridCellsKt {
+  }
+
   public final class LazyStaggeredGridDslKt {
   }
 
diff --git a/compose/foundation/foundation/api/restricted_current.txt b/compose/foundation/foundation/api/restricted_current.txt
index 7dabd8c..efa4c27 100644
--- a/compose/foundation/foundation/api/restricted_current.txt
+++ b/compose/foundation/foundation/api/restricted_current.txt
@@ -710,6 +710,9 @@
 
 package androidx.compose.foundation.lazy.staggeredgrid {
 
+  public final class LazyStaggeredGridCellsKt {
+  }
+
   public final class LazyStaggeredGridDslKt {
   }
 
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallTextWithSpans.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallTextWithSpans.kt
new file mode 100644
index 0000000..22253bf
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallTextWithSpans.kt
@@ -0,0 +1,151 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.foundation.benchmark.text.empirical
+
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.ToggleableTestCase
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.font.FontFamily
+import androidx.test.filters.LargeTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Show the behavior of several spans stacked on top of each other, for the full length of the text.
+ *
+ * 38% of all text displayed contains at least 1 span. The most common # of spans is 16 (due to
+ * usage of spans as text formatting).
+ *
+ * Spans are intentionally limited to
+ *
+ * 1) Not MetricsAffectingSpans (usage is very low)
+ * 2) Not inlineContent (usage is very low).
+ *
+ * TODO: If introducing more optimizations that depend on the "full length" assumption, confirm the
+ * frequency of spans that use the full length. This is not verified in the data set that produced
+ * this benchmark.
+ */
+class IfNotEmptyCallTextWithSpans(
+    private val text: AnnotatedString
+) : LayeredComposeTestCase(), ToggleableTestCase {
+    private var toggleText = mutableStateOf(AnnotatedString(""))
+
+    @Composable
+    override fun MeasuredContent() {
+        Text(toggleText.value, fontFamily = FontFamily.Monospace)
+    }
+
+    override fun toggleState() {
+        if (toggleText.value.text.isEmpty()) {
+            toggleText.value = text
+        } else {
+            toggleText.value = AnnotatedString("")
+        }
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+open class IfNotEmptyCallTextWithSpansParent(
+    private val size: Int,
+    private val spanCount: Int
+) {
+
+    @get:Rule
+    val benchmarkRule = ComposeBenchmarkRule()
+
+    private val caseFactory = {
+        val text = generateCacheableStringOf(size)
+        IfNotEmptyCallTextWithSpans(text.annotateWithSpans(spanCount))
+    }
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}, spanCount={1}")
+        fun initParameters(): List<Array<Any>> = listOf()
+    }
+
+    @Test
+    fun recomposeOnly() {
+        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
+    }
+
+    @Test
+    fun recomposeMeasureLayout() {
+        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory)
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+class AllAppsIfNotEmptyCallTextWithSpans(
+    size: Int,
+    spanCount: Int
+) : IfNotEmptyCallTextWithSpansParent(size, spanCount) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}, spanCount={1}")
+        fun initParameters() = AllApps.TextLengthsWithSpans
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+class SocialAppIfNotEmptyCallTextWithSpans(
+    size: Int,
+    spanCount: Int
+) : IfNotEmptyCallTextWithSpansParent(size, spanCount) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}, spanCount={1}")
+        fun initParameters() = SocialApps.TextLengthsWithSpans
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+class ChatAppIfNotEmptyCallTextWithSpans(
+    size: Int,
+    spanCount: Int
+) : IfNotEmptyCallTextWithSpansParent(size, spanCount) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}, spanCount={1}")
+        fun initParameters() = ChatApps.TextLengthsWithSpans
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+class ShoppingAppIfNotEmptyCallTextWithSpans(
+    size: Int,
+    spanCount: Int
+) : IfNotEmptyCallTextWithSpansParent(size, spanCount) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}, spanCount={1}")
+        fun initParameters() = ShoppingApps.TextLengthsWithSpans
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/Parameters.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/Parameters.kt
index d571f24..7a91a22 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/Parameters.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/Parameters.kt
@@ -16,6 +16,12 @@
 
 package androidx.compose.foundation.benchmark.text.empirical
 
+import androidx.compose.foundation.text.appendInlineContent
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.SpanStyle
+import androidx.compose.ui.text.buildAnnotatedString
+
 object AllApps {
     /**
      * For all apps, the vast majority of text is <64 characters.
@@ -27,6 +33,18 @@
      * "Click below to learn more"
      */
     val TextLengths: Array<Any> = arrayOf(2, 16, 32, 64)
+    val SpanCounts: Array<Any> = arrayOf(4, 16)
+    val TextLengthsWithSpans: List<Array<Any>> = TextLengths.cartesian(SpanCounts)
+}
+
+object SocialApps {
+    /**
+     * Social apps show lots of adjacent-text like "Profile" or "userName" mixed with some longer
+     * UGC.
+     */
+    val TextLengths: Array<Any> = arrayOf(32)
+    val SpanCounts: Array<Any> = arrayOf(4, 8)
+    val TextLengthsWithSpans: List<Array<Any>> = TextLengths.cartesian(SpanCounts)
 }
 
 object ChatApps {
@@ -34,6 +52,17 @@
      * For chat apps, strings tend to be longer due to user generated content.
      */
     val TextLengths: Array<Any> = arrayOf(256, 512)
+    val SpanCounts: Array<Any> = arrayOf(2)
+    val TextLengthsWithSpans: List<Array<Any>> = TextLengths.cartesian(SpanCounts)
+}
+
+object ShoppingApps {
+    /**
+     * Shopping apps are more designed focused with short, intentional, text usage
+     */
+    val TextLengths: Array<Any> = arrayOf(2, 64)
+    val SpanCounts: Array<Any> = arrayOf(16)
+    val TextLengthsWithSpans: List<Array<Any>> = TextLengths.cartesian(SpanCounts)
 }
 
 fun generateCacheableStringOf(size: Int): String {
@@ -52,4 +81,31 @@
         workingSize--
     }
     return builder.toString()
+}
+
+internal fun String.annotateWithSpans(spanCount: Int): AnnotatedString {
+    return buildAnnotatedString {
+        repeat(spanCount) {
+            // this appends a [ForegroundColorSpan] which is not [MetricsAffectingSpan]
+            pushStyle(SpanStyle(color = Color(it, it, it)))
+        }
+        append(this@annotateWithSpans)
+        pop((spanCount - 1).coerceAtLeast(0))
+    }
+}
+
+internal const val BenchmarkInlineContentId = "BenchmarkInlineContent.Id"
+
+internal fun String.annotateWithInlineContent(): AnnotatedString {
+    return buildAnnotatedString {
+        appendInlineContent(BenchmarkInlineContentId)
+        append(this@annotateWithInlineContent)
+    }
+}
+
+/**
+ * ([1,2,3] X [A, B]) -> [[1, A], [1, B], [2, A], ...
+ */
+private fun Array<Any>.cartesian(rhs: Array<Any>): List<Array<Any>> = flatMap { lhs ->
+    rhs.map { arrayOf(lhs, it) }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFixedSize.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFillMaxWidth.kt
similarity index 87%
rename from compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFixedSize.kt
rename to compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFillMaxWidth.kt
index c9bdc46..6f1b622 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFixedSize.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFillMaxWidth.kt
@@ -37,8 +37,10 @@
  * Toggle between "" and "aaaa..." to simulate backend text loading.
  *
  * This intentionally hits as many text caches as possible, to isolate compose setText behavior.
+ *
+ * This benchmark removes dynamic layout sizing cost by using fillMaxWidth.
  */
-class SetTextFixedSize(private val text: String) : LayeredComposeTestCase(), ToggleableTestCase {
+class SetTextFillMaxWidth(private val text: String) : LayeredComposeTestCase(), ToggleableTestCase {
     private var toggleText = mutableStateOf("")
 
     @Composable
@@ -61,14 +63,14 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-open class SetTextFixedSizeParent(private val size: Int) {
+open class SetTextFillMaxWidthParent(private val size: Int) {
 
     @get:Rule
     val benchmarkRule = ComposeBenchmarkRule()
 
     private val caseFactory = {
         val text = generateCacheableStringOf(size)
-        SetText(text)
+        SetTextFillMaxWidth(text)
     }
 
     companion object {
@@ -93,7 +95,7 @@
  */
 @LargeTest
 @RunWith(Parameterized::class)
-class AllAppsSetTextFixedSize(size: Int) : SetTextParent(size) {
+class AllAppsSetTextFillMaxWidth(size: Int) : SetTextFillMaxWidthParent(size) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "size={0}")
@@ -108,7 +110,7 @@
  */
 @LargeTest
 @RunWith(Parameterized::class)
-class ChatAppSetTextFixedSize(size: Int) : SetTextParent(size) {
+class ChatAppSetTextFillMaxWidth(size: Int) : SetTextFillMaxWidthParent(size) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "size={0}")
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithInlineContent.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithInlineContent.kt
new file mode 100644
index 0000000..feefb13
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithInlineContent.kt
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.foundation.benchmark.text.empirical
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.text.InlineTextContent
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.ToggleableTestCase
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.Placeholder
+import androidx.compose.ui.text.PlaceholderVerticalAlign
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.test.filters.LargeTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Inline content is equivalent to replacementSpan, which typically happens in 1-2 per string
+ *
+ * They are relatively rare overall.
+ *
+ * This benchmark only adds one replacement span, which is a typical case.
+ */
+class SetTextWithInlineContent(
+    private val text: AnnotatedString
+) : LayeredComposeTestCase(), ToggleableTestCase {
+    private var toggleText = mutableStateOf(AnnotatedString(""))
+
+    @Composable
+    override fun MeasuredContent() {
+        Text(toggleText.value,
+            fontFamily = FontFamily.Monospace,
+            inlineContent = mapOf(
+                BenchmarkInlineContentId to InlineTextContent(
+                    Placeholder(12.sp, 12.sp, PlaceholderVerticalAlign.Center)
+                ) {
+                    Box(Modifier.size(12.dp, 12.dp))
+                }
+            )
+        )
+    }
+
+    override fun toggleState() {
+        if (toggleText.value.text.isEmpty()) {
+            toggleText.value = text
+        } else {
+            toggleText.value = AnnotatedString("")
+        }
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+open class SetTextWithInlineContentParent(private val size: Int) {
+
+    @get:Rule
+    val benchmarkRule = ComposeBenchmarkRule()
+
+    private val caseFactory = {
+        val text = generateCacheableStringOf(size)
+        SetTextWithInlineContent(text.annotateWithInlineContent())
+    }
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): List<Array<Any>> = listOf()
+    }
+
+    @Test
+    fun recomposeOnly() {
+        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
+    }
+
+    @Test
+    fun recomposeMeasureLayout() {
+        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory)
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+class AllAppsWithInlineContent(size: Int) : SetTextWithInlineContentParent(size) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters() = AllApps.TextLengths
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+class SocialAppWithInlineContent(size: Int) : SetTextWithInlineContentParent(size) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters() = SocialApps.TextLengths
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+class ChatAppWithInlineContent(size: Int) : SetTextWithInlineContentParent(size) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters() = ChatApps.TextLengths
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+class ShoppingAppWithInlineContent(size: Int) : SetTextWithInlineContentParent(size) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters() = ShoppingApps.TextLengths
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithSpans.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithSpans.kt
new file mode 100644
index 0000000..c40b587
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithSpans.kt
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.foundation.benchmark.text.empirical
+
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.ToggleableTestCase
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.font.FontFamily
+import androidx.test.filters.LargeTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Show the behavior of several spans stacked on top of each other, for the full length of the text.
+ *
+ * 38% of all text displayed contains at least 1 span. The most common # of spans is 16 (due to
+ * usage of spans as text formatting).
+ *
+ * Spans are intentionally limited to
+ *
+ * 1) Not MetricsAffectingSpans (usage is very low)
+ * 2) Not inlineContent (usage is very low).
+ *
+ * Note: If introducing more optimizations that depend on the "full length" assumption, confirm the
+ * frequency of spans that use the full length. This is not verified in the data set that produced
+ * this benchmark. This assumption does not, currently, impact the performance of Compose.
+ */
+class SetTextWithSpans(
+    private val text: AnnotatedString
+) : LayeredComposeTestCase(), ToggleableTestCase {
+    private var toggleText = mutableStateOf(AnnotatedString(""))
+
+    @Composable
+    override fun MeasuredContent() {
+        Text(toggleText.value, fontFamily = FontFamily.Monospace)
+    }
+
+    override fun toggleState() {
+        if (toggleText.value.text.isEmpty()) {
+            toggleText.value = text
+        } else {
+            toggleText.value = AnnotatedString("")
+        }
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+open class SetTextWithSpansParent(private val size: Int, private val spanCount: Int) {
+
+    @get:Rule
+    val benchmarkRule = ComposeBenchmarkRule()
+
+    private val caseFactory = {
+        val text = generateCacheableStringOf(size)
+        SetTextWithSpans(text.annotateWithSpans(spanCount))
+    }
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}, spanCount={1}")
+        fun initParameters(): List<Array<Any>> = listOf()
+    }
+
+    @Test
+    fun recomposeOnly() {
+        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
+    }
+
+    @Test
+    fun recomposeMeasureLayout() {
+        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory)
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+class AllAppsWithSpans(size: Int, spanCount: Int) : SetTextWithSpansParent(size, spanCount) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}, spanCount={1}")
+        fun initParameters() = AllApps.TextLengthsWithSpans
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+class SocialAppWithSpans(size: Int, spanCount: Int) : SetTextWithSpansParent(size, spanCount) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}, spanCount={1}")
+        fun initParameters() = SocialApps.TextLengthsWithSpans
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+class ChatAppWithSpans(size: Int, spanCount: Int) : SetTextWithSpansParent(size, spanCount) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}, spanCount={1}")
+        fun initParameters() = ChatApps.TextLengthsWithSpans
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+class ShoppingAppWithSpans(size: Int, spanCount: Int) : SetTextWithSpansParent(size, spanCount) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}, spanCount={1}")
+        fun initParameters() = ShoppingApps.TextLengthsWithSpans
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
index 7c77de2..8ca5cf2 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
@@ -26,6 +26,7 @@
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
+import androidx.compose.foundation.clickable
 import androidx.compose.foundation.gestures.FlingBehavior
 import androidx.compose.foundation.gestures.ScrollScope
 import androidx.compose.foundation.gestures.animateScrollBy
@@ -39,6 +40,7 @@
 import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.heightIn
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.requiredHeight
@@ -54,8 +56,12 @@
 import androidx.compose.foundation.lazy.items
 import androidx.compose.foundation.lazy.itemsIndexed
 import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid
+import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells
+import androidx.compose.foundation.lazy.staggeredgrid.rememberLazyStaggeredGridState
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.foundation.samples.StickyHeaderSample
+import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.integration.demos.common.ComposableDemo
 import androidx.compose.material.Button
@@ -117,6 +123,7 @@
     ComposableDemo("Item reordering") { PopularBooksDemo() },
     ComposableDemo("List drag and drop") { LazyColumnDragAndDropDemo() },
     ComposableDemo("Grid drag and drop") { LazyGridDragAndDropDemo() },
+    ComposableDemo("Staggered grid") { LazyStaggeredGridDemo() },
     PagingDemos
 )
 
@@ -284,7 +291,10 @@
 private fun Square(index: Int) {
     val width = remember { Random.nextInt(50, 150).dp }
     Box(
-        Modifier.width(width).fillMaxHeight().background(colors[index % colors.size]),
+        Modifier
+            .width(width)
+            .fillMaxHeight()
+            .background(colors[index % colors.size]),
         contentAlignment = Alignment.Center
     ) {
         Text(index.toString())
@@ -330,7 +340,10 @@
     val pages = listOf(Color.LightGray, Color.White, Color.DarkGray)
     LazyRow {
         items(pages) {
-            Spacer(Modifier.fillParentMaxSize().background(it))
+            Spacer(
+                Modifier
+                    .fillParentMaxSize()
+                    .background(it))
         }
     }
 }
@@ -375,7 +388,9 @@
         val items = listOf(Color.Cyan, Color.Blue, Color.Magenta)
         itemsIndexed(items) { index, item ->
             Box(
-                modifier = Modifier.background(item).requiredSize(40.dp),
+                modifier = Modifier
+                    .background(item)
+                    .requiredSize(40.dp),
                 contentAlignment = Alignment.Center
             ) {
                 Text("$index", fontSize = 30.sp)
@@ -431,7 +446,9 @@
             }
             LazyColumn(
                 verticalArrangement = Arrangements[arrangement],
-                modifier = Modifier.weight(1f).fillMaxHeight()
+                modifier = Modifier
+                    .weight(1f)
+                    .fillMaxHeight()
             ) {
                 items(count) {
                     item()
@@ -498,9 +515,13 @@
         }
 
         val itemModifier = if (column) {
-            Modifier.heightIn(200.dp).fillMaxWidth()
+            Modifier
+                .heightIn(200.dp)
+                .fillMaxWidth()
         } else {
-            Modifier.widthIn(200.dp).fillMaxHeight()
+            Modifier
+                .widthIn(200.dp)
+                .fillMaxHeight()
         }
         val item1 = @Composable { index: Int ->
             Text(
@@ -560,7 +581,9 @@
                     LazyColumn(
                         reverseLayout = reverse,
                         state = lazyState,
-                        modifier = Modifier.weight(1f).fillMaxHeight(),
+                        modifier = Modifier
+                            .weight(1f)
+                            .fillMaxHeight(),
                         content = lazyContent
                     )
                 }
@@ -585,7 +608,9 @@
             CompositionLocalProvider(LocalLayoutDirection provides direction) {
                 LazyRow(
                     state = lazyState,
-                    modifier = Modifier.weight(1f).fillMaxWidth(),
+                    modifier = Modifier
+                        .weight(1f)
+                        .fillMaxWidth(),
                     reverseLayout = reverse,
                     content = lazyContent
                 )
@@ -598,7 +623,10 @@
 private fun NestedLazyDemo() {
     val item = @Composable { index: Int ->
         Box(
-            Modifier.padding(16.dp).requiredSize(200.dp).background(Color.LightGray),
+            Modifier
+                .padding(16.dp)
+                .requiredSize(200.dp)
+                .background(Color.LightGray),
             contentAlignment = Alignment.Center
         ) {
             var state by rememberSaveable { mutableStateOf(0) }
@@ -901,3 +929,76 @@
         }
     }
 }
+
+@OptIn(ExperimentalFoundationApi::class)
+@Preview
+@Composable
+private fun LazyStaggeredGridDemo() {
+    val heights = remember {
+        List(100) {
+            (Random.nextInt(100) + 100).dp
+        }
+    }
+
+    val colors = remember {
+        List(100) {
+            Color.hsl(
+                Random.nextFloat() * 360,
+                .5f,
+                .65f
+            )
+        }
+    }
+
+    val indices = remember {
+        mutableStateOf(List(100) { it })
+    }
+
+    var count by remember { mutableStateOf(100) }
+
+    Column(Modifier.fillMaxSize()) {
+        Row(
+            modifier = Modifier.fillMaxWidth(),
+            horizontalArrangement = Arrangement.SpaceBetween
+        ) {
+            Button(onClick = { count++ }) { Text(text = "++") }
+            Button(onClick = {
+                indices.value = indices.value.toMutableList().apply { shuffle() }
+            }) { Text(text = "shuffle") }
+            Button(onClick = { if (count != 0) count-- }) { Text(text = "--") }
+        }
+
+        val scope = rememberCoroutineScope()
+        val state = rememberLazyStaggeredGridState()
+
+        LazyVerticalStaggeredGrid(
+            columns = StaggeredGridCells.Fixed(3),
+            modifier = Modifier.fillMaxSize(),
+            state = state,
+            content = {
+                items(count) {
+                    val index = indices.value[it % indices.value.size]
+                    val color = colors[index]
+                    Box(
+                        modifier = Modifier
+                            .height(heights[index])
+                            .padding(5.dp)
+                            .border(2.dp, color, RoundedCornerShape(5.dp))
+                            .clickable {
+                                scope.launch {
+                                    state.animateScrollToItem(it + 1000, 100)
+                                }
+                            }
+                    ) {
+                        Text(
+                            "$it",
+                            modifier = Modifier.align(Alignment.Center),
+                            color = color,
+                            fontSize = 36.sp
+                        )
+                    }
+                }
+            }
+        )
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DrawTextDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DrawTextDemo.kt
index 18b7fe5..bf3595f 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DrawTextDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DrawTextDemo.kt
@@ -59,6 +59,7 @@
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.text.withStyle
 import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
@@ -141,7 +142,10 @@
             topLeft = Offset(padding, padding),
             style = TextStyle(fontSize = fontSize6),
             overflow = TextOverflow.Visible,
-            size = IntSize((size.width - 2 * padding).toInt(), (size.height - 2 * padding).toInt())
+            maxSize = IntSize(
+                width = (size.width - 2 * padding).toInt(),
+                height = (size.height - 2 * padding).toInt()
+            )
         )
     }
 }
@@ -181,15 +185,12 @@
                 textAlign = TextAlign.Center,
                 platformStyle = PlatformTextStyle(includeFontPadding = includeFontPadding)
             ),
-            size = IntSize((radius * 2).roundToPx(), (radius * 2).roundToPx())
+            constraints = Constraints.fixedWidth((radius * 2).roundToPx())
         )
 
         drawText(
             textLayoutResult,
-            topLeft = center - Offset(
-                textLayoutResult.size.width / 2f,
-                textLayoutResult.size.height / 2f
-            )
+            topLeft = center - Offset(radius.toPx(), textLayoutResult.size.height / 2f)
         )
 
         if (drawLines) {
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/BaseLazyStaggeredGridWithOrientation.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/BaseLazyStaggeredGridWithOrientation.kt
index 8ae92eb..bb4928b 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/BaseLazyStaggeredGridWithOrientation.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/BaseLazyStaggeredGridWithOrientation.kt
@@ -22,11 +22,9 @@
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.gestures.animateScrollBy
-import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.Dp
-import kotlin.math.roundToInt
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
 
@@ -48,24 +46,20 @@
         state: LazyStaggeredGridState = rememberLazyStaggeredGridState(),
         content: LazyStaggeredGridScope.() -> Unit,
     ) {
-        LazyStaggeredGrid(
-            state = state,
-            modifier = modifier,
-            orientation = orientation,
-            userScrollEnabled = true,
-            verticalArrangement = Arrangement.Top,
-            horizontalArrangement = Arrangement.Start,
-            slotSizesSums = { constraints ->
-                val crossAxisSize = if (orientation == Orientation.Vertical) {
-                    constraints.maxWidth
-                } else {
-                    constraints.maxHeight
-                }
-                IntArray(lanes) {
-                    (crossAxisSize / lanes.toDouble() * (it + 1)).roundToInt()
-                }
-            },
-            content = content
-        )
+        if (orientation == Orientation.Vertical) {
+            LazyVerticalStaggeredGrid(
+                columns = StaggeredGridCells.Fixed(lanes),
+                modifier = modifier,
+                state = state,
+                content = content
+            )
+        } else {
+            LazyHorizontalStaggeredGrid(
+                rows = StaggeredGridCells.Fixed(lanes),
+                modifier = modifier,
+                state = state,
+                content = content
+            )
+        }
     }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollTest.kt
index e0b76cc..10040bc 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollTest.kt
@@ -93,8 +93,8 @@
         runBlocking(AutoTestFrameClock() + Dispatchers.Main) {
             state.scrollToItem(2, 10)
         }
-        assertThat(state.firstVisibleItemIndex).isEqualTo(2)
-        assertThat(state.firstVisibleItemScrollOffset).isEqualTo(10)
+        assertThat(state.firstVisibleItemIndex).isEqualTo(1)
+        assertThat(state.firstVisibleItemScrollOffset).isEqualTo(110)
     }
 
     @Test
@@ -113,8 +113,8 @@
             state.scrollToItem(4, -10)
         }
 
-        assertThat(state.firstVisibleItemIndex).isEqualTo(2)
-        assertThat(state.firstVisibleItemScrollOffset).isEqualTo(itemSizePx - 10)
+        assertThat(state.firstVisibleItemIndex).isEqualTo(1)
+        assertThat(state.firstVisibleItemScrollOffset).isEqualTo(itemSizePx * 2 - 10)
     }
 
     @Test
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridTest.kt
index ee0417aa..4058596 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridTest.kt
@@ -22,7 +22,6 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.lazy.grid.scrollBy
 import androidx.compose.foundation.text.BasicText
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
@@ -348,7 +347,7 @@
                                 crossAxis = itemSizeDp,
                                 mainAxis = if (expanded) itemSizeDp * 2 else itemSizeDp
                             )
-                            .testTag("$it")
+                            .testTag("0")
                     )
                 }
                 items(5) {
@@ -413,7 +412,7 @@
                                 crossAxis = itemSizeDp,
                                 mainAxis = if (expanded) itemSizeDp * 2 else itemSizeDp
                             )
-                            .testTag("$it")
+                            .testTag("0")
                     )
                 }
                 items(5) {
@@ -463,8 +462,8 @@
         rule.setContent {
             // intentionally wrong values, normally items should be [0, 1][2, 3][4, 5]
             state = rememberLazyStaggeredGridState(
-                firstVisibleItemIndex = 3,
-                firstVisibleItemOffset = itemSizePx / 2
+                initialFirstVisibleItemIndex = 3,
+                initialFirstVisibleItemScrollOffset = itemSizePx / 2
             )
             LazyStaggeredGrid(
                 lanes = 2,
@@ -685,8 +684,8 @@
         var itemCount by mutableStateOf(20)
         rule.setContent {
             state = rememberLazyStaggeredGridState(
-                firstVisibleItemIndex = 10,
-                firstVisibleItemOffset = 0
+                initialFirstVisibleItemIndex = 10,
+                initialFirstVisibleItemScrollOffset = 0
             )
             LazyStaggeredGrid(
                 lanes = 2,
@@ -730,8 +729,8 @@
     fun staggeredGrid_supportsLargeIndices() {
         rule.setContent {
             state = rememberLazyStaggeredGridState(
-                firstVisibleItemIndex = Int.MAX_VALUE / 2,
-                firstVisibleItemOffset = 0
+                initialFirstVisibleItemIndex = Int.MAX_VALUE / 2,
+                initialFirstVisibleItemScrollOffset = 0
             )
             LazyStaggeredGrid(
                 lanes = 2,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Background.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Background.kt
index a59db97..6fa0739 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Background.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Background.kt
@@ -123,6 +123,7 @@
         brush?.let { drawOutline(outline, brush = brush, alpha = alpha) }
         lastOutline = outline
         lastSize = size
+        lastLayoutDirection = layoutDirection
     }
 
     override fun hashCode(): Int {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGrid.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGrid.kt
index 8cc07ba..e7f1583 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGrid.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGrid.kt
@@ -77,6 +77,7 @@
 
     ScrollPositionUpdater(itemProvider, state)
 
+    // todo(b/182882362): accessibility
     LazyLayout(
         modifier = modifier
             .then(state.remeasurementModifier)
@@ -89,6 +90,7 @@
                     orientation,
                     reverseLayout
                 ),
+                interactionSource = state.mutableInteractionSource,
                 flingBehavior = flingBehavior,
                 state = state,
                 overscrollEffect = overscrollEffect,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridCells.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridCells.kt
new file mode 100644
index 0000000..fc01154
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridCells.kt
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.foundation.lazy.staggeredgrid
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.runtime.Stable
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+
+/**
+ * This class describes the count and the sizes of columns in vertical staggered grids,
+ * or rows in horizontal staggered grids.
+ */
+@ExperimentalFoundationApi
+@Stable
+interface StaggeredGridCells {
+    /**
+     * Calculates the number of cells and their cross axis size based on
+     * [availableSize] and [spacing].
+     *
+     * For example, in vertical grids, [spacing] is passed from the grid's [Arrangement.Horizontal].
+     * The [Arrangement.Horizontal] will also be used to arrange items in a row if the grid is wider
+     * than the calculated sum of columns.
+     *
+     * Note that the calculated cross axis sizes will be considered in an RTL-aware manner --
+     * if the staggered grid is vertical and the layout direction is RTL, the first width in the
+     * returned list will correspond to the rightmost column.
+     *
+     * @param availableSize available size on cross axis, e.g. width of [LazyVerticalStaggeredGrid].
+     * @param spacing cross axis spacing, e.g. horizontal spacing for [LazyVerticalStaggeredGrid].
+     * The spacing is passed from the corresponding [Arrangement] param of the lazy grid.
+     */
+    fun Density.calculateCrossAxisCellSizes(availableSize: Int, spacing: Int): List<Int>
+
+    /**
+     * Defines a grid with fixed number of rows or columns.
+     *
+     * For example, for the vertical [LazyVerticalStaggeredGrid] Fixed(3) would mean that
+     * there are 3 columns 1/3 of the parent width.
+     */
+    class Fixed(private val count: Int) : StaggeredGridCells {
+        init {
+            require(count > 0)
+        }
+
+        override fun Density.calculateCrossAxisCellSizes(
+            availableSize: Int,
+            spacing: Int
+        ): List<Int> {
+            return calculateCellsCrossAxisSizeImpl(availableSize, count, spacing)
+        }
+
+        override fun hashCode(): Int {
+            return -count // Different sign from Adaptive.
+        }
+
+        override fun equals(other: Any?): Boolean {
+            return other is Fixed && count == other.count
+        }
+    }
+
+    /**
+     * Defines a grid with as many rows or columns as possible on the condition that
+     * every cell has at least [minSize] space and all extra space distributed evenly.
+     *
+     * For example, for the vertical [LazyVerticalStaggeredGrid] Adaptive(20.dp) would mean that
+     * there will be as many columns as possible and every column will be at least 20.dp
+     * and all the columns will have equal width. If the screen is 88.dp wide then
+     * there will be 4 columns 22.dp each.
+     */
+    class Adaptive(private val minSize: Dp) : StaggeredGridCells {
+        init {
+            require(minSize > 0.dp)
+        }
+
+        override fun Density.calculateCrossAxisCellSizes(
+            availableSize: Int,
+            spacing: Int
+        ): List<Int> {
+            val count = maxOf((availableSize + spacing) / (minSize.roundToPx() + spacing), 1)
+            return calculateCellsCrossAxisSizeImpl(availableSize, count, spacing)
+        }
+
+        override fun hashCode(): Int {
+            return minSize.hashCode()
+        }
+
+        override fun equals(other: Any?): Boolean {
+            return other is Adaptive && minSize == other.minSize
+        }
+    }
+}
+
+private fun calculateCellsCrossAxisSizeImpl(
+    gridSize: Int,
+    slotCount: Int,
+    spacing: Int
+): List<Int> {
+    val gridSizeWithoutSpacing = gridSize - spacing * (slotCount - 1)
+    val slotSize = gridSizeWithoutSpacing / slotCount
+    val remainingPixels = gridSizeWithoutSpacing % slotCount
+    return List(slotCount) {
+        slotSize + if (it < remainingPixels) 1 else 0
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridDsl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridDsl.kt
index d836948..7e283d5 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridDsl.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridDsl.kt
@@ -17,14 +17,223 @@
 package androidx.compose.foundation.lazy.staggeredgrid
 
 import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.gestures.FlingBehavior
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.ScrollableDefaults
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.calculateEndPadding
+import androidx.compose.foundation.layout.calculateStartPadding
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.LayoutDirection
 
+/**
+ * Vertical staggered grid layout that composes and lays out only items currently visible on screen.
+ *
+ * @param columns description of the size and number of staggered grid columns.
+ * @param modifier modifier to apply to the layout.
+ * @param state state object that can be used to control and observe staggered grid state.
+ * @param flingBehavior logic handling fling.
+ * @param userScrollEnabled whether scroll with gestures or accessibility actions are allowed. It is
+ *  still possible to scroll programmatically through state when
+ *  [userScrollEnabled] is set to false.
+ * @param content a lambda describing the staggered grid content. Inside this block you can use
+ *  [LazyStaggeredGridScope.items] to present list of items or [LazyStaggeredGridScope.item] for a
+ *  single one.
+ */
+// todo(b/182882362): Content padding, reverse layout and arrangement support
+@ExperimentalFoundationApi
+@Composable
+fun LazyVerticalStaggeredGrid(
+    columns: StaggeredGridCells,
+    modifier: Modifier = Modifier,
+    state: LazyStaggeredGridState = rememberLazyStaggeredGridState(),
+    flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(),
+    userScrollEnabled: Boolean = true,
+    content: LazyStaggeredGridScope.() -> Unit
+) {
+    LazyStaggeredGrid(
+        modifier = modifier,
+        orientation = Orientation.Vertical,
+        state = state,
+        flingBehavior = flingBehavior,
+        userScrollEnabled = userScrollEnabled,
+        slotSizesSums = rememberColumnWidthSums(
+            columns,
+            Arrangement.Start,
+            PaddingValues()
+        ),
+        content = content
+    )
+}
+
+/** calculates prefix sums for columns used in staggered grid measure */
+@OptIn(ExperimentalFoundationApi::class)
+@Composable
+private fun rememberColumnWidthSums(
+    columns: StaggeredGridCells,
+    horizontalArrangement: Arrangement.Horizontal,
+    contentPadding: PaddingValues
+) = remember<Density.(Constraints) -> IntArray>(
+    columns,
+    horizontalArrangement,
+    contentPadding,
+) {
+    { constraints ->
+        require(constraints.maxWidth != Constraints.Infinity) {
+            "LazyVerticalStaggeredGrid's width should be bound by parent."
+        }
+        val horizontalPadding =
+            contentPadding.calculateStartPadding(LayoutDirection.Ltr) +
+                contentPadding.calculateEndPadding(LayoutDirection.Ltr)
+        val gridWidth = constraints.maxWidth - horizontalPadding.roundToPx()
+        with(columns) {
+            calculateCrossAxisCellSizes(
+                gridWidth,
+                horizontalArrangement.spacing.roundToPx()
+            ).run {
+                val result = IntArray(size) { this[it] }
+                for (i in 1 until size) {
+                    result[i] += result[i - 1]
+                }
+                result
+            }
+        }
+    }
+}
+
+/**
+ * Horizontal staggered grid layout that composes and lays out only items currently
+ * visible on screen.
+ *
+ * @param rows description of the size and number of staggered grid columns.
+ * @param modifier modifier to apply to the layout.
+ * @param state state object that can be used to control and observe staggered grid state.
+ * @param flingBehavior logic handling fling.
+ * @param userScrollEnabled whether scroll with gestures or accessibility actions are allowed. It is
+ *  still possible to scroll programmatically through state when
+ *  [userScrollEnabled] is set to false.
+ * @param content a lambda describing the staggered grid content. Inside this block you can use
+ *  [LazyStaggeredGridScope.items] to present list of items or [LazyStaggeredGridScope.item] for a
+ *  single one.
+ */
+// todo(b/182882362): Content padding, reverse layout and arrangement support
+@ExperimentalFoundationApi
+@Composable
+fun LazyHorizontalStaggeredGrid(
+    rows: StaggeredGridCells,
+    modifier: Modifier = Modifier,
+    state: LazyStaggeredGridState = rememberLazyStaggeredGridState(),
+    flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(),
+    userScrollEnabled: Boolean = true,
+    content: LazyStaggeredGridScope.() -> Unit
+) {
+    LazyStaggeredGrid(
+        modifier = modifier,
+        orientation = Orientation.Horizontal,
+        state = state,
+        flingBehavior = flingBehavior,
+        userScrollEnabled = userScrollEnabled,
+        slotSizesSums = rememberRowHeightSums(rows, Arrangement.Top, PaddingValues()),
+        content = content
+    )
+}
+
+/** calculates prefix sums for rows used in staggered grid measure */
+@OptIn(ExperimentalFoundationApi::class)
+@Composable
+private fun rememberRowHeightSums(
+    rows: StaggeredGridCells,
+    verticalArrangement: Arrangement.Vertical,
+    contentPadding: PaddingValues
+) = remember<Density.(Constraints) -> IntArray>(
+    rows,
+    verticalArrangement,
+    contentPadding,
+) {
+    { constraints ->
+        require(constraints.maxHeight != Constraints.Infinity) {
+            "LazyHorizontalStaggeredGrid's height should be bound by parent."
+        }
+        val verticalPadding = contentPadding.calculateTopPadding() +
+            contentPadding.calculateBottomPadding()
+        val gridHeight = constraints.maxHeight - verticalPadding.roundToPx()
+        with(rows) {
+            calculateCrossAxisCellSizes(
+                gridHeight,
+                verticalArrangement.spacing.roundToPx()
+            ).run {
+                val result = IntArray(size) { this[it] }
+                for (i in 1 until size) {
+                    result[i] += result[i - 1]
+                }
+                result
+            }
+        }
+    }
+}
+
+/** Dsl marker for [LazyStaggeredGridScope] below **/
 @DslMarker
 internal annotation class LazyStaggeredGridScopeMarker
 
+/**
+ * Receiver scope for itemContent in [LazyStaggeredGridScope.item]
+ */
+@ExperimentalFoundationApi
+sealed interface LazyStaggeredGridItemScope
+
+/**
+ * Receiver scope for [LazyVerticalStaggeredGrid] and [LazyHorizontalStaggeredGrid]
+ */
 @ExperimentalFoundationApi
 @LazyStaggeredGridScopeMarker
-internal sealed interface LazyStaggeredGridScope {
+sealed interface LazyStaggeredGridScope {
+
+    /**
+     * Add a single item to the staggered grid.
+     *
+     * @param key a factory of stable and unique keys representing the item. The key
+     *  MUST be saveable via Bundle on Android. If set to null (by default), the position of the
+     *  item will be used as a key instead.
+     *  Using the same key for multiple items in the staggered grid is not allowed.
+     *
+     *  When you specify the key the scroll position will be maintained based on the key, which
+     *  means if you add/remove items before the current visible item the item with the given key
+     *  will be kept as the first visible one.
+     * @param contentType a factory of content types representing the item. Content for item of
+     *  the same type can be reused more efficiently. null is a valid type as well and items
+     *  of such type will be considered compatible.
+     * @param content composable content displayed by current item
+     */
+    @ExperimentalFoundationApi
+    fun item(
+        key: Any? = null,
+        contentType: Any? = null,
+        content: @Composable LazyStaggeredGridItemScope.() -> Unit
+    )
+
+    /**
+     * Add a [count] of items to the staggered grid.
+     *
+     * @param count number of items to add.
+     * @param key a factory of stable and unique keys representing the item. The key
+     *  MUST be saveable via Bundle on Android. If set to null (by default), the position of the
+     *  item will be used as a key instead.
+     *  Using the same key for multiple items in the staggered grid is not allowed.
+     *
+     *  When you specify the key the scroll position will be maintained based on the key, which
+     *  means if you add/remove items before the current visible item the item with the given key
+     *  will be kept as the first visible one.
+     * @param contentType a factory of content types representing the item. Content for item of
+     *  the same type can be reused more efficiently. null is a valid type as well and items
+     *  of such type will be considered compatible.
+     * @param itemContent composable content displayed by item on provided position
+     */
     fun items(
         count: Int,
         key: ((index: Int) -> Any)? = null,
@@ -33,21 +242,138 @@
     )
 }
 
+/**
+ * Add a list of items to the staggered grid.
+ *
+ * @param items a data list to present
+ * @param key a factory of stable and unique keys representing the item. The key
+ *  MUST be saveable via Bundle on Android. If set to null (by default), the position of the
+ *  item will be used as a key instead.
+ *  Using the same key for multiple items in the staggered grid is not allowed.
+ *
+ *  When you specify the key the scroll position will be maintained based on the key, which
+ *  means if you add/remove items before the current visible item the item with the given key
+ *  will be kept as the first visible one.
+ * @param contentType a factory of content types representing the item. Content for item of
+ *  the same type can be reused more efficiently. null is a valid type as well and items
+ *  of such type will be considered compatible.
+ * @param itemContent composable content displayed by the provided item
+ */
 @ExperimentalFoundationApi
-internal sealed interface LazyStaggeredGridItemScope
-
-@ExperimentalFoundationApi
-internal fun LazyStaggeredGridScope.item(
-    key: Any? = null,
-    contentType: Any? = null,
-    itemContent: @Composable LazyStaggeredGridItemScope.(index: Int) -> Unit
+fun <T> LazyStaggeredGridScope.items(
+    items: List<T>,
+    key: ((item: T) -> Any)? = null,
+    contentType: (item: T) -> Any? = { null },
+    itemContent: @Composable LazyStaggeredGridItemScope.(item: T) -> Unit
 ) {
     items(
-        count = 1,
-        key = key?.let { { it } },
-        contentType = { contentType },
-        itemContent = itemContent
+        count = items.size,
+        key = key?.let {
+            { index -> key(items[index]) }
+        },
+        contentType = { index -> contentType(items[index]) },
+        itemContent = { index -> itemContent(items[index]) }
     )
 }
 
-// todo(b/182882362): item DSL for lists/arrays
\ No newline at end of file
+/**
+ * Add a list of items with index-aware content to the staggered grid.
+ *
+ * @param items a data list to present
+ * @param key a factory of stable and unique keys representing the item. The key
+ *  MUST be saveable via Bundle on Android. If set to null (by default), the position of the
+ *  item will be used as a key instead.
+ *  Using the same key for multiple items in the staggered grid is not allowed.
+ *
+ *  When you specify the key the scroll position will be maintained based on the key, which
+ *  means if you add/remove items before the current visible item the item with the given key
+ *  will be kept as the first visible one.
+ * @param contentType a factory of content types representing the item. Content for item of
+ *  the same type can be reused more efficiently. null is a valid type as well and items
+ *  of such type will be considered compatible.
+ * @param itemContent composable content displayed given item and index
+ */
+@ExperimentalFoundationApi
+fun <T> LazyStaggeredGridScope.itemsIndexed(
+    items: List<T>,
+    key: ((index: Int, item: T) -> Any)? = null,
+    contentType: (index: Int, item: T) -> Any? = { _, _ -> null },
+    itemContent: @Composable LazyStaggeredGridItemScope.(index: Int, item: T) -> Unit
+) {
+    items(
+        count = items.size,
+        key = key?.let {
+            { index -> key(index, items[index]) }
+        },
+        contentType = { index -> contentType(index, items[index]) },
+        itemContent = { index -> itemContent(index, items[index]) }
+    )
+}
+
+/**
+ * Add an array of items to the staggered grid.
+ *
+ * @param items a data array to present
+ * @param key a factory of stable and unique keys representing the item. The key
+ *  MUST be saveable via Bundle on Android. If set to null (by default), the position of the
+ *  item will be used as a key instead.
+ *  Using the same key for multiple items in the staggered grid is not allowed.
+ *
+ *  When you specify the key the scroll position will be maintained based on the key, which
+ *  means if you add/remove items before the current visible item the item with the given key
+ *  will be kept as the first visible one.
+ * @param contentType a factory of content types representing the item. Content for item of
+ *  the same type can be reused more efficiently. null is a valid type as well and items
+ *  of such type will be considered compatible.
+ * @param itemContent composable content displayed by the provided item
+ */
+@ExperimentalFoundationApi
+fun <T> LazyStaggeredGridScope.items(
+    items: Array<T>,
+    key: ((item: T) -> Any)? = null,
+    contentType: (item: T) -> Any? = { null },
+    itemContent: @Composable LazyStaggeredGridItemScope.(item: T) -> Unit
+) {
+    items(
+        count = items.size,
+        key = key?.let {
+            { index -> key(items[index]) }
+        },
+        contentType = { index -> contentType(items[index]) },
+        itemContent = { index -> itemContent(items[index]) }
+    )
+}
+
+/**
+ * Add an array of items with index-aware content to the staggered grid.
+ *
+ * @param items a data array to present
+ * @param key a factory of stable and unique keys representing the item. The key
+ *  MUST be saveable via Bundle on Android. If set to null (by default), the position of the
+ *  item will be used as a key instead.
+ *  Using the same key for multiple items in the staggered grid is not allowed.
+ *
+ *  When you specify the key the scroll position will be maintained based on the key, which
+ *  means if you add/remove items before the current visible item the item with the given key
+ *  will be kept as the first visible one.
+ * @param contentType a factory of content types representing the item. Content for item of
+ *  the same type can be reused more efficiently. null is a valid type as well and items
+ *  of such type will be considered compatible.
+ * @param itemContent composable content displayed given item and index
+ */
+@ExperimentalFoundationApi
+fun <T> LazyStaggeredGridScope.itemsIndexed(
+    items: Array<T>,
+    key: ((index: Int, item: T) -> Any)? = null,
+    contentType: (index: Int, item: T) -> Any? = { _, _ -> null },
+    itemContent: @Composable LazyStaggeredGridItemScope.(index: Int, item: T) -> Unit
+) {
+    items(
+        count = items.size,
+        key = key?.let {
+            { index -> key(index, items[index]) }
+        },
+        contentType = { index -> contentType(index, items[index]) },
+        itemContent = { index -> itemContent(index, items[index]) }
+    )
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt
index c69a765..1355171 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt
@@ -526,7 +526,7 @@
     }
 }
 
-private fun IntArray.indexOfMinValue(): Int {
+internal fun IntArray.indexOfMinValue(): Int {
     var result = -1
     var min = Int.MAX_VALUE
     for (i in indices) {
@@ -661,6 +661,7 @@
         )
 }
 
+@OptIn(ExperimentalFoundationApi::class)
 private class LazyStaggeredGridPositionedItem(
     override val offset: IntOffset,
     override val index: Int,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt
index ce3c42c..88738b5 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt
@@ -16,39 +16,64 @@
 
 package androidx.compose.foundation.lazy.staggeredgrid
 
+import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 
-internal class LazyStaggeredGridMeasureResult(
-    val firstVisibleItemIndices: IntArray,
-    val firstVisibleItemScrollOffsets: IntArray,
-    val consumedScroll: Float,
-    val measureResult: MeasureResult,
-    val canScrollForward: Boolean,
-    val canScrollBackward: Boolean,
-    override val totalItemsCount: Int,
-    override val visibleItemsInfo: List<LazyStaggeredGridItemInfo>
-) : LazyStaggeredGridLayoutInfo, MeasureResult by measureResult
-
-internal interface LazyStaggeredGridItemInfo {
+/**
+ * Information about layout state of individual item in lazy staggered grid.
+ * @see [LazyStaggeredGridLayoutInfo]
+ */
+@ExperimentalFoundationApi
+interface LazyStaggeredGridItemInfo {
+    /**
+     * Relative offset from the start of the staggered grid.
+     */
     val offset: IntOffset
+
+    /**
+     * Index of the item.
+     */
     val index: Int
+
+    /**
+     * Column (for vertical staggered grids) or row (for horizontal staggered grids) that the item
+     * is in.
+     */
     val lane: Int
+
+    /**
+     * Key of the item passed in [LazyStaggeredGridScope.items]
+     */
     val key: Any
+
+    /**
+     * Item size in pixels. If item contains multiple layouts, the size is calculated as a sum of
+     * their sizes.
+     */
     val size: IntSize
 }
 
-internal interface LazyStaggeredGridLayoutInfo {
+/**
+ * Information about layout state of lazy staggered grids.
+ * Can be retrieved from [LazyStaggeredGridState.layoutInfo].
+ */
+// todo(b/182882362): expose more information about layout state
+@ExperimentalFoundationApi
+interface LazyStaggeredGridLayoutInfo {
+    /**
+     * The list of [LazyStaggeredGridItemInfo] per each visible item ordered by index.
+     */
     val visibleItemsInfo: List<LazyStaggeredGridItemInfo>
-    val totalItemsCount: Int
 
-    companion object Empty : LazyStaggeredGridLayoutInfo {
-        override val visibleItemsInfo: List<LazyStaggeredGridItemInfo> = emptyList()
-        override val totalItemsCount: Int = 0
-    }
+    /**
+     * The total count of items passed to staggered grid.
+     */
+    val totalItemsCount: Int
 }
 
+@OptIn(ExperimentalFoundationApi::class)
 internal fun LazyStaggeredGridLayoutInfo.findVisibleItem(
     itemIndex: Int
 ): LazyStaggeredGridItemInfo? {
@@ -62,4 +87,22 @@
 
     val index = visibleItemsInfo.binarySearch { it.index - itemIndex }
     return visibleItemsInfo.getOrNull(index)
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+internal class LazyStaggeredGridMeasureResult(
+    val firstVisibleItemIndices: IntArray,
+    val firstVisibleItemScrollOffsets: IntArray,
+    val consumedScroll: Float,
+    val measureResult: MeasureResult,
+    val canScrollForward: Boolean,
+    val canScrollBackward: Boolean,
+    override val totalItemsCount: Int,
+    override val visibleItemsInfo: List<LazyStaggeredGridItemInfo>
+) : LazyStaggeredGridLayoutInfo, MeasureResult by measureResult
+
+@OptIn(ExperimentalFoundationApi::class)
+internal object EmptyLazyStaggeredGridLayoutInfo : LazyStaggeredGridLayoutInfo {
+    override val visibleItemsInfo: List<LazyStaggeredGridItemInfo> = emptyList()
+    override val totalItemsCount: Int = 0
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScope.kt
index 3881306..f9685fd 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScope.kt
@@ -25,6 +25,20 @@
 internal class LazyStaggeredGridScopeImpl : LazyStaggeredGridScope {
     val intervals = MutableIntervalList<LazyStaggeredGridIntervalContent>()
 
+    @ExperimentalFoundationApi
+    override fun item(
+        key: Any?,
+        contentType: Any?,
+        content: @Composable LazyStaggeredGridItemScope.() -> Unit
+    ) {
+        items(
+            count = 1,
+            key = key?.let { { it } },
+            contentType = { contentType },
+            itemContent = { content() }
+        )
+    }
+
     override fun items(
         count: Int,
         key: ((index: Int) -> Any)?,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollPosition.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollPosition.kt
index 8f5928d..b1a3529 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollPosition.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollPosition.kt
@@ -24,6 +24,7 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.runtime.snapshots.Snapshot
 
+@ExperimentalFoundationApi
 internal class LazyStaggeredGridScrollPosition(
     initialIndices: IntArray,
     initialOffsets: IntArray,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridState.kt
index fb2c5f4..0203256 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridState.kt
@@ -20,6 +20,9 @@
 import androidx.compose.foundation.MutatePriority
 import androidx.compose.foundation.gestures.ScrollScope
 import androidx.compose.foundation.gestures.ScrollableState
+import androidx.compose.foundation.interaction.InteractionSource
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.lazy.layout.LazyAnimateScrollScope
 import androidx.compose.foundation.lazy.layout.LazyLayoutItemProvider
 import androidx.compose.foundation.lazy.layout.LazyLayoutPrefetchState
 import androidx.compose.foundation.lazy.layout.LazyLayoutPrefetchState.PrefetchHandle
@@ -36,24 +39,46 @@
 import androidx.compose.ui.unit.Density
 import kotlin.math.abs
 
+/**
+ * Creates a [LazyStaggeredGridState] that is remembered across composition.
+ *
+ * Calling this function with different parameters on recomposition WILL NOT recreate or change
+ * the state.
+ * Use [LazyStaggeredGridState.scrollToItem] or [LazyStaggeredGridState.animateScrollToItem] to
+ * adjust position instead.
+ *
+ * @param initialFirstVisibleItemIndex initial position for
+ *  [LazyStaggeredGridState.firstVisibleItemIndex]
+ * @param initialFirstVisibleItemScrollOffset initial value for
+ *  [LazyStaggeredGridState.firstVisibleItemScrollOffset]
+ * @return created and memoized [LazyStaggeredGridState] with given parameters.
+ */
 @ExperimentalFoundationApi
 @Composable
-internal fun rememberLazyStaggeredGridState(
-    firstVisibleItemIndex: Int = 0,
-    firstVisibleItemOffset: Int = 0
+fun rememberLazyStaggeredGridState(
+    initialFirstVisibleItemIndex: Int = 0,
+    initialFirstVisibleItemScrollOffset: Int = 0
 ): LazyStaggeredGridState =
     rememberSaveable(saver = LazyStaggeredGridState.Saver) {
         LazyStaggeredGridState(
-            firstVisibleItemIndex,
-            firstVisibleItemOffset
+            initialFirstVisibleItemIndex,
+            initialFirstVisibleItemScrollOffset
         )
     }
 
+/**
+ * Hoisted state object controlling [LazyVerticalStaggeredGrid] or [LazyHorizontalStaggeredGrid].
+ * In most cases, it should be created via [rememberLazyStaggeredGridState].
+ */
 @ExperimentalFoundationApi
-internal class LazyStaggeredGridState private constructor(
+class LazyStaggeredGridState private constructor(
     initialFirstVisibleItems: IntArray,
     initialFirstVisibleOffsets: IntArray,
 ) : ScrollableState {
+    /**
+     * @param initialFirstVisibleItemIndex initial value for [firstVisibleItemIndex]
+     * @param initialFirstVisibleItemOffset initial value for [firstVisibleItemScrollOffset]
+     */
     constructor(
         initialFirstVisibleItemIndex: Int = 0,
         initialFirstVisibleItemOffset: Int = 0
@@ -62,28 +87,55 @@
         intArrayOf(initialFirstVisibleItemOffset)
     )
 
-    val firstVisibleItemIndex: Int get() = scrollPosition.indices.getOrNull(0) ?: 0
+    /**
+     * Index of the first visible item across all staggered grid lanes.
+     *
+     * This property is observable and when use it in composable function it will be recomposed on
+     * each scroll, potentially causing performance issues.
+     */
+    val firstVisibleItemIndex: Int
+        get() = scrollPosition.indices.minOrNull() ?: 0
 
-    val firstVisibleItemScrollOffset: Int get() = scrollPosition.offsets.getOrNull(0) ?: 0
+    /**
+     * Current offset of the item with [firstVisibleItemIndex] relative to the container start.
+     *
+     * This property is observable and when use it in composable function it will be recomposed on
+     * each scroll, potentially causing performance issues.
+     */
+    val firstVisibleItemScrollOffset: Int
+        get() = scrollPosition.offsets.run {
+            if (isEmpty()) 0 else this[scrollPosition.indices.indexOfMinValue()]
+        }
 
-    val layoutInfo: LazyStaggeredGridLayoutInfo get() = layoutInfoState.value
-
-    private val layoutInfoState: MutableState<LazyStaggeredGridLayoutInfo> =
-        mutableStateOf(LazyStaggeredGridLayoutInfo.Empty)
-
-    internal val spans = LazyStaggeredGridSpans()
-
-    private var canScrollForward = true
-    private var canScrollBackward = true
-
-    private val animateScrollScope = LazyStaggeredGridAnimateScrollScope(this)
-
+    /** holder for current scroll position **/
     internal val scrollPosition = LazyStaggeredGridScrollPosition(
         initialFirstVisibleItems,
         initialFirstVisibleOffsets,
         ::fillNearestIndices
     )
 
+    /**
+     * Layout information calculated during last layout pass, with information about currently
+     * visible items and container parameters.
+     *
+     * This property is observable and when use it in composable function it will be recomposed on
+     * each scroll, potentially causing performance issues.
+     */
+    val layoutInfo: LazyStaggeredGridLayoutInfo get() = layoutInfoState.value
+
+    /** backing state for [layoutInfo] **/
+    private val layoutInfoState: MutableState<LazyStaggeredGridLayoutInfo> =
+        mutableStateOf(EmptyLazyStaggeredGridLayoutInfo)
+
+    /** storage for lane assignments for each item for consistent scrolling in both directions **/
+    internal val spans = LazyStaggeredGridSpans()
+
+    private var canScrollForward = true
+    private var canScrollBackward = true
+
+    /** implementation of [LazyAnimateScrollScope] scope required for [animateScrollToItem] **/
+    private val animateScrollScope = LazyStaggeredGridAnimateScrollScope(this)
+
     private var remeasurement: Remeasurement? = null
 
     internal val remeasurementModifier = object : RemeasurementModifier {
@@ -92,25 +144,48 @@
         }
     }
 
+    /** prefetch state used for precomputing items in the direction of scroll **/
     internal val prefetchState: LazyLayoutPrefetchState = LazyLayoutPrefetchState()
 
+    /** state controlling the scroll **/
     private val scrollableState = ScrollableState { -onScroll(-it) }
 
+    /** scroll to be consumed during next/current layout pass **/
     internal var scrollToBeConsumed = 0f
         private set
 
     /* @VisibleForTesting */
     internal var measurePassCount = 0
 
+    /** states required for prefetching **/
     private var wasScrollingForward = true
     internal var isVertical = false
     internal var laneWidthsPrefixSum: IntArray = IntArray(0)
     private var prefetchBaseIndex: Int = -1
     private val currentItemPrefetchHandles = mutableVectorOf<PrefetchHandle>()
 
+    /** state required for implementing [animateScrollScope] **/
     internal var density: Density = Density(1f, 1f)
     internal val laneCount get() = laneWidthsPrefixSum.size
 
+    /**
+     * [InteractionSource] that will be used to dispatch drag events when this
+     * list is being dragged. If you want to know whether the fling (or animated scroll) is in
+     * progress, use [isScrollInProgress].
+     */
+    val interactionSource get(): InteractionSource = mutableInteractionSource
+
+    /** backing field mutable field for [interactionSource] **/
+    internal val mutableInteractionSource = MutableInteractionSource()
+
+    /**
+     * Call this function to take control of scrolling and gain the ability to send scroll events
+     * via [ScrollScope.scrollBy]. All actions that change the logical scroll position must be
+     * performed within a [scroll] block (even if they don't call any other methods on this
+     * object) in order to guarantee that mutual exclusion is enforced.
+     *
+     * If [scroll] is called from elsewhere, this will be canceled.
+     */
     override suspend fun scroll(
         scrollPriority: MutatePriority,
         block: suspend ScrollScope.() -> Unit
@@ -118,6 +193,14 @@
         scrollableState.scroll(scrollPriority, block)
     }
 
+    /**
+     * Whether this [scrollableState] is currently scrolling by gesture, fling or programmatically or
+     * not.
+     */
+    override val isScrollInProgress: Boolean
+        get() = scrollableState.isScrollInProgress
+
+    /** Main scroll callback which adjusts scroll delta and remeasures layout **/
     private fun onScroll(distance: Float): Float {
         if (distance < 0 && !canScrollForward || distance > 0 && !canScrollBackward) {
             return 0f
@@ -150,6 +233,15 @@
         }
     }
 
+    /**
+     * Instantly brings the item at [index] to the top of layout viewport, offset by [scrollOffset]
+     * pixels.
+     *
+     * @param index the index to which to scroll. MUST NOT be negative.
+     * @param scrollOffset the offset where the item should end up after the scroll. Note that
+     * positive offset refers to forward scroll, so in a reversed list, positive offset will
+     * scroll the item further upward (taking it partly offscreen).
+     */
     suspend fun scrollToItem(
         /* @IntRange(from = 0) */
         index: Int,
@@ -160,6 +252,14 @@
         }
     }
 
+    /**
+     * Animate (smooth scroll) to the given item.
+     *
+     * @param index the index to which to scroll. MUST NOT be negative.
+     * @param scrollOffset the offset that the item should end up after the scroll. Note that
+     * positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
+     * scroll the item further upward (taking it partly offscreen).
+     */
     suspend fun animateScrollToItem(
         /* @IntRange(from = 0) */
         index: Int,
@@ -190,6 +290,7 @@
     override fun dispatchRawDelta(delta: Float): Float =
         scrollableState.dispatchRawDelta(delta)
 
+    /** Start prefetch of the items based on provided delta **/
     private fun notifyPrefetch(delta: Float) {
         val info = layoutInfoState.value
         if (info.visibleItemsInfo.isNotEmpty()) {
@@ -264,6 +365,7 @@
         }
     }
 
+    /** updates state after measure pass **/
     internal fun applyMeasureResult(result: LazyStaggeredGridMeasureResult) {
         scrollToBeConsumed -= result.consumedScroll
         canScrollBackward = result.canScrollBackward
@@ -275,9 +377,6 @@
         measurePassCount++
     }
 
-    override val isScrollInProgress: Boolean
-        get() = scrollableState.isScrollInProgress
-
     private fun fillNearestIndices(itemIndex: Int, laneCount: Int): IntArray {
         // reposition spans if needed to ensure valid indices
         spans.ensureValidIndex(itemIndex + laneCount)
@@ -311,6 +410,9 @@
     }
 
     companion object {
+        /**
+         * The default implementation of [Saver] for [LazyStaggeredGridState]
+         */
         val Saver = listSaver<LazyStaggeredGridState, IntArray>(
             save = { state ->
                 listOf(
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoApp.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoApp.kt
index a252388..d8d442f 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoApp.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoApp.kt
@@ -22,14 +22,12 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.ExperimentalLayoutApi
-import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.consumedWindowInsets
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.heightIn
 import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.safeDrawing
 import androidx.compose.foundation.layout.wrapContentHeight
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.foundation.rememberScrollState
@@ -51,9 +49,9 @@
 import androidx.compose.material3.IconButton
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Scaffold
-import androidx.compose.material3.SmallTopAppBar
 import androidx.compose.material3.Surface
 import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
 import androidx.compose.material3.TopAppBarDefaults
 import androidx.compose.material3.TopAppBarScrollBehavior
 import androidx.compose.runtime.Composable
@@ -111,8 +109,8 @@
             .nestedScroll(scrollBehavior.nestedScrollConnection)
     ) { innerPadding ->
         val modifier = Modifier
-            // as scaffold currently doesn't consume the safe drawing internally - consume here
-            .consumedWindowInsets(WindowInsets.safeDrawing)
+            // as scaffold currently doesn't consume - consume what's needed
+            .consumedWindowInsets(innerPadding)
             .padding(innerPadding)
         DemoContent(
             modifier,
@@ -245,7 +243,7 @@
             scrollBehavior = scrollBehavior
         )
     } else {
-        SmallTopAppBar(
+        TopAppBar(
             title = {
                 Text(title, Modifier.testTag(Tags.AppBarTitle))
             },
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoFilter.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoFilter.kt
index c6f9984..e883852 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoFilter.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoFilter.kt
@@ -33,8 +33,8 @@
 import androidx.compose.material3.LocalContentColor
 import androidx.compose.material3.LocalTextStyle
 import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.SmallTopAppBar
 import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
 import androidx.compose.material3.TopAppBarScrollBehavior
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
@@ -71,7 +71,7 @@
 }
 
 /**
- * [SmallTopAppBar] with a text field allowing filtering all the demos.
+ * [TopAppBar] with a text field allowing filtering all the demos.
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
@@ -81,7 +81,7 @@
     onClose: () -> Unit,
     scrollBehavior: TopAppBarScrollBehavior
 ) {
-    SmallTopAppBar(
+    TopAppBar(
         navigationIcon = {
             IconButton(onClick = onClose) {
                 Icon(Icons.Filled.Close, null)
@@ -156,7 +156,9 @@
         ListItem(
             onClick = { onNavigate(demo) }) {
             Text(
-                modifier = Modifier.height(56.dp).wrapContentSize(Alignment.Center),
+                modifier = Modifier
+                    .height(56.dp)
+                    .wrapContentSize(Alignment.Center),
                 text = annotatedString
             )
         }
diff --git a/compose/integration-tests/macrobenchmark/build.gradle b/compose/integration-tests/macrobenchmark/build.gradle
index 52926c1..8b403e6 100644
--- a/compose/integration-tests/macrobenchmark/build.gradle
+++ b/compose/integration-tests/macrobenchmark/build.gradle
@@ -44,10 +44,3 @@
 // Define a task dependency so the app is installed before we run macro benchmarks.
 tasks.getByPath(":compose:integration-tests:macrobenchmark:connectedCheck")
     .dependsOn(tasks.getByPath(":compose:integration-tests:macrobenchmark-target:installRelease"))
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/compose/material/material/icons/generator/build.gradle b/compose/material/material/icons/generator/build.gradle
index 23b40fb..1ad5ecd 100644
--- a/compose/material/material/icons/generator/build.gradle
+++ b/compose/material/material/icons/generator/build.gradle
@@ -48,9 +48,3 @@
     description = "Generator module that parses XML drawables to generate programmatic " +
             "representations of Material Icons."
 }
-
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
-    }
-}
diff --git a/compose/material3/material3/api/1.0.0-beta02.txt b/compose/material3/material3/api/1.0.0-beta02.txt
index a5cf8de..f8ee54f 100644
--- a/compose/material3/material3/api/1.0.0-beta02.txt
+++ b/compose/material3/material3/api/1.0.0-beta02.txt
@@ -437,9 +437,6 @@
     method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.material3.RadioButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
-  public final class SafeDrawingInsets_androidKt {
-  }
-
   public final class ScaffoldKt {
   }
 
@@ -578,6 +575,9 @@
     method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? thumbContent, optional boolean enabled, optional androidx.compose.material3.SwitchColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
+  public final class SystemBarsDefaultInsets_androidKt {
+  }
+
   public final class TabKt {
     method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
diff --git a/compose/material3/material3/api/current.ignore b/compose/material3/material3/api/current.ignore
new file mode 100644
index 0000000..a8bfe80
--- /dev/null
+++ b/compose/material3/material3/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.material3.SafeDrawingInsets_androidKt:
+    Removed class androidx.compose.material3.SafeDrawingInsets_androidKt
diff --git a/compose/material3/material3/api/current.txt b/compose/material3/material3/api/current.txt
index a5cf8de..f8ee54f 100644
--- a/compose/material3/material3/api/current.txt
+++ b/compose/material3/material3/api/current.txt
@@ -437,9 +437,6 @@
     method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.material3.RadioButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
-  public final class SafeDrawingInsets_androidKt {
-  }
-
   public final class ScaffoldKt {
   }
 
@@ -578,6 +575,9 @@
     method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? thumbContent, optional boolean enabled, optional androidx.compose.material3.SwitchColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
+  public final class SystemBarsDefaultInsets_androidKt {
+  }
+
   public final class TabKt {
     method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
diff --git a/compose/material3/material3/api/public_plus_experimental_1.0.0-beta01.txt b/compose/material3/material3/api/public_plus_experimental_1.0.0-beta01.txt
index 033a145..f7c40ab 100644
--- a/compose/material3/material3/api/public_plus_experimental_1.0.0-beta01.txt
+++ b/compose/material3/material3/api/public_plus_experimental_1.0.0-beta01.txt
@@ -691,6 +691,7 @@
   }
 
   public final class SliderKt {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void CustomSlider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.material3.SliderColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit>? thumb, optional kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit>? track);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void RangeSlider(kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> value, kotlin.jvm.functions.Function1<? super kotlin.ranges.ClosedFloatingPointRange<java.lang.Float>,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.material3.SliderColors colors);
     method @androidx.compose.runtime.Composable public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.material3.SliderColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
diff --git a/compose/material3/material3/api/public_plus_experimental_1.0.0-beta02.txt b/compose/material3/material3/api/public_plus_experimental_1.0.0-beta02.txt
index 164b8aa..9ab602f 100644
--- a/compose/material3/material3/api/public_plus_experimental_1.0.0-beta02.txt
+++ b/compose/material3/material3/api/public_plus_experimental_1.0.0-beta02.txt
@@ -35,7 +35,8 @@
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void CenterAlignedTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void LargeTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void MediumTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void SmallTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @Deprecated @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void SmallTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.TopAppBarState rememberTopAppBarState(optional float initialHeightOffsetLimit, optional float initialHeightOffset, optional float initialContentOffset);
   }
 
@@ -634,11 +635,14 @@
     method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.material3.RadioButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
-  public final class SafeDrawingInsets_androidKt {
+  @androidx.compose.material3.ExperimentalMaterial3Api public final class ScaffoldDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getContentWindowInsets();
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets contentWindowInsets;
+    field public static final androidx.compose.material3.ScaffoldDefaults INSTANCE;
   }
 
   public final class ScaffoldKt {
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional long containerColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional long containerColor, optional long contentColor, optional androidx.compose.foundation.layout.WindowInsets contentWindowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
   }
 
   @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class SelectableChipBorder {
@@ -686,6 +690,8 @@
   }
 
   public final class SliderDefaults {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public void Thumb(androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material3.SliderColors colors, optional boolean enabled, optional long thumbSize);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public void Track(androidx.compose.material3.SliderPositions sliderPositions, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material3.SliderColors colors, optional boolean enabled);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.SliderColors colors(optional long thumbColor, optional long activeTrackColor, optional long activeTickColor, optional long inactiveTrackColor, optional long inactiveTickColor, optional long disabledThumbColor, optional long disabledActiveTrackColor, optional long disabledActiveTickColor, optional long disabledInactiveTrackColor, optional long disabledInactiveTickColor);
     field public static final androidx.compose.material3.SliderDefaults INSTANCE;
   }
@@ -693,6 +699,16 @@
   public final class SliderKt {
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void RangeSlider(kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> value, kotlin.jvm.functions.Function1<? super kotlin.ranges.ClosedFloatingPointRange<java.lang.Float>,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.material3.SliderColors colors);
     method @androidx.compose.runtime.Composable public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.material3.SliderColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.material3.SliderColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.material3.SliderPositions,kotlin.Unit> thumb);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function1<? super androidx.compose.material3.SliderPositions,kotlin.Unit> track, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.material3.SliderColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional kotlin.jvm.functions.Function1<? super androidx.compose.material3.SliderPositions,kotlin.Unit> thumb);
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public final class SliderPositions {
+    ctor public SliderPositions(float initialPositionFraction, float[] initialTickFractions);
+    method public float getPositionFraction();
+    method public float[] getTickFractions();
+    property public final float positionFraction;
+    property public final float[] tickFractions;
   }
 
   @androidx.compose.runtime.Stable public interface SnackbarData {
@@ -805,6 +821,9 @@
     method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? thumbContent, optional boolean enabled, optional androidx.compose.material3.SwitchColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
+  public final class SystemBarsDefaultInsets_androidKt {
+  }
+
   public final class TabKt {
     method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
diff --git a/compose/material3/material3/api/public_plus_experimental_current.txt b/compose/material3/material3/api/public_plus_experimental_current.txt
index 164b8aa..9ab602f 100644
--- a/compose/material3/material3/api/public_plus_experimental_current.txt
+++ b/compose/material3/material3/api/public_plus_experimental_current.txt
@@ -35,7 +35,8 @@
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void CenterAlignedTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void LargeTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void MediumTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void SmallTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @Deprecated @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void SmallTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.TopAppBarState rememberTopAppBarState(optional float initialHeightOffsetLimit, optional float initialHeightOffset, optional float initialContentOffset);
   }
 
@@ -634,11 +635,14 @@
     method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.material3.RadioButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
-  public final class SafeDrawingInsets_androidKt {
+  @androidx.compose.material3.ExperimentalMaterial3Api public final class ScaffoldDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getContentWindowInsets();
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets contentWindowInsets;
+    field public static final androidx.compose.material3.ScaffoldDefaults INSTANCE;
   }
 
   public final class ScaffoldKt {
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional long containerColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional long containerColor, optional long contentColor, optional androidx.compose.foundation.layout.WindowInsets contentWindowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
   }
 
   @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class SelectableChipBorder {
@@ -686,6 +690,8 @@
   }
 
   public final class SliderDefaults {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public void Thumb(androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material3.SliderColors colors, optional boolean enabled, optional long thumbSize);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public void Track(androidx.compose.material3.SliderPositions sliderPositions, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material3.SliderColors colors, optional boolean enabled);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.SliderColors colors(optional long thumbColor, optional long activeTrackColor, optional long activeTickColor, optional long inactiveTrackColor, optional long inactiveTickColor, optional long disabledThumbColor, optional long disabledActiveTrackColor, optional long disabledActiveTickColor, optional long disabledInactiveTrackColor, optional long disabledInactiveTickColor);
     field public static final androidx.compose.material3.SliderDefaults INSTANCE;
   }
@@ -693,6 +699,16 @@
   public final class SliderKt {
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void RangeSlider(kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> value, kotlin.jvm.functions.Function1<? super kotlin.ranges.ClosedFloatingPointRange<java.lang.Float>,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.material3.SliderColors colors);
     method @androidx.compose.runtime.Composable public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.material3.SliderColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.material3.SliderColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.material3.SliderPositions,kotlin.Unit> thumb);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function1<? super androidx.compose.material3.SliderPositions,kotlin.Unit> track, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.material3.SliderColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional kotlin.jvm.functions.Function1<? super androidx.compose.material3.SliderPositions,kotlin.Unit> thumb);
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public final class SliderPositions {
+    ctor public SliderPositions(float initialPositionFraction, float[] initialTickFractions);
+    method public float getPositionFraction();
+    method public float[] getTickFractions();
+    property public final float positionFraction;
+    property public final float[] tickFractions;
   }
 
   @androidx.compose.runtime.Stable public interface SnackbarData {
@@ -805,6 +821,9 @@
     method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? thumbContent, optional boolean enabled, optional androidx.compose.material3.SwitchColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
+  public final class SystemBarsDefaultInsets_androidKt {
+  }
+
   public final class TabKt {
     method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
diff --git a/compose/material3/material3/api/restricted_1.0.0-beta02.txt b/compose/material3/material3/api/restricted_1.0.0-beta02.txt
index a5cf8de..f8ee54f 100644
--- a/compose/material3/material3/api/restricted_1.0.0-beta02.txt
+++ b/compose/material3/material3/api/restricted_1.0.0-beta02.txt
@@ -437,9 +437,6 @@
     method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.material3.RadioButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
-  public final class SafeDrawingInsets_androidKt {
-  }
-
   public final class ScaffoldKt {
   }
 
@@ -578,6 +575,9 @@
     method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? thumbContent, optional boolean enabled, optional androidx.compose.material3.SwitchColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
+  public final class SystemBarsDefaultInsets_androidKt {
+  }
+
   public final class TabKt {
     method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
diff --git a/compose/material3/material3/api/restricted_current.ignore b/compose/material3/material3/api/restricted_current.ignore
new file mode 100644
index 0000000..a8bfe80
--- /dev/null
+++ b/compose/material3/material3/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.material3.SafeDrawingInsets_androidKt:
+    Removed class androidx.compose.material3.SafeDrawingInsets_androidKt
diff --git a/compose/material3/material3/api/restricted_current.txt b/compose/material3/material3/api/restricted_current.txt
index a5cf8de..f8ee54f 100644
--- a/compose/material3/material3/api/restricted_current.txt
+++ b/compose/material3/material3/api/restricted_current.txt
@@ -437,9 +437,6 @@
     method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.material3.RadioButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
-  public final class SafeDrawingInsets_androidKt {
-  }
-
   public final class ScaffoldKt {
   }
 
@@ -578,6 +575,9 @@
     method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? thumbContent, optional boolean enabled, optional androidx.compose.material3.SwitchColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
+  public final class SystemBarsDefaultInsets_androidKt {
+  }
+
   public final class TabKt {
     method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
index c8eb38d..4a4736c 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
@@ -44,7 +44,7 @@
 import androidx.compose.material3.samples.ElevatedCardSample
 import androidx.compose.material3.samples.ElevatedFilterChipSample
 import androidx.compose.material3.samples.ElevatedSuggestionChipSample
-import androidx.compose.material3.samples.EnterAlwaysSmallTopAppBar
+import androidx.compose.material3.samples.EnterAlwaysTopAppBar
 import androidx.compose.material3.samples.ExitUntilCollapsedLargeTopAppBar
 import androidx.compose.material3.samples.ExitUntilCollapsedMediumTopAppBar
 import androidx.compose.material3.samples.ExposedDropdownMenuSample
@@ -87,7 +87,7 @@
 import androidx.compose.material3.samples.OutlinedTextFieldSample
 import androidx.compose.material3.samples.PasswordTextField
 import androidx.compose.material3.samples.PermanentNavigationDrawerSample
-import androidx.compose.material3.samples.PinnedSmallTopAppBar
+import androidx.compose.material3.samples.PinnedTopAppBar
 import androidx.compose.material3.samples.RadioButtonSample
 import androidx.compose.material3.samples.RadioGroupSample
 import androidx.compose.material3.samples.RangeSliderSample
@@ -100,9 +100,11 @@
 import androidx.compose.material3.samples.SimpleBottomAppBar
 import androidx.compose.material3.samples.SimpleCenterAlignedTopAppBar
 import androidx.compose.material3.samples.SimpleOutlinedTextFieldSample
-import androidx.compose.material3.samples.SimpleSmallTopAppBar
 import androidx.compose.material3.samples.SimpleTextFieldSample
+import androidx.compose.material3.samples.SimpleTopAppBar
 import androidx.compose.material3.samples.SliderSample
+import androidx.compose.material3.samples.SliderWithCustomThumbSample
+import androidx.compose.material3.samples.SliderWithCustomTrackAndThumb
 import androidx.compose.material3.samples.SmallFloatingActionButtonSample
 import androidx.compose.material3.samples.StepRangeSliderSample
 import androidx.compose.material3.samples.StepsSliderSample
@@ -364,25 +366,25 @@
 val TopAppBarExamples =
     listOf(
         Example(
-            name = ::SimpleSmallTopAppBar.name,
+            name = ::SimpleTopAppBar.name,
             description = TopAppBarExampleDescription,
             sourceUrl = TopAppBarExampleSourceUrl,
-        ) { SimpleSmallTopAppBar() },
+        ) { SimpleTopAppBar() },
         Example(
             name = ::SimpleCenterAlignedTopAppBar.name,
             description = TopAppBarExampleDescription,
             sourceUrl = TopAppBarExampleSourceUrl,
         ) { SimpleCenterAlignedTopAppBar() },
         Example(
-            name = ::PinnedSmallTopAppBar.name,
+            name = ::PinnedTopAppBar.name,
             description = TopAppBarExampleDescription,
             sourceUrl = TopAppBarExampleSourceUrl,
-        ) { PinnedSmallTopAppBar() },
+        ) { PinnedTopAppBar() },
         Example(
-            name = ::EnterAlwaysSmallTopAppBar.name,
+            name = ::EnterAlwaysTopAppBar.name,
             description = TopAppBarExampleDescription,
             sourceUrl = TopAppBarExampleSourceUrl,
-        ) { EnterAlwaysSmallTopAppBar() },
+        ) { EnterAlwaysTopAppBar() },
         Example(
             name = ::ExitUntilCollapsedMediumTopAppBar.name,
             description = TopAppBarExampleDescription,
@@ -683,6 +685,20 @@
     ) {
         StepRangeSliderSample()
     },
+    Example(
+        name = ::SliderWithCustomThumbSample.name,
+        description = SlidersExampleDescription,
+        sourceUrl = SlidersExampleSourceUrl
+    ) {
+        SliderWithCustomThumbSample()
+    },
+    Example(
+        name = ::SliderWithCustomTrackAndThumb.name,
+        description = SlidersExampleDescription,
+        sourceUrl = SlidersExampleSourceUrl
+    ) {
+        SliderWithCustomTrackAndThumb()
+    }
 )
 
 private const val SnackbarsExampleDescription = "Snackbars examples"
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogTopAppBar.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogTopAppBar.kt
index dd1672d..34cb679f 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogTopAppBar.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogTopAppBar.kt
@@ -28,8 +28,8 @@
 import androidx.compose.material3.Icon
 import androidx.compose.material3.IconButton
 import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.SmallTopAppBar
 import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
 import androidx.compose.material3.TopAppBarScrollBehavior
 import androidx.compose.material3.catalog.library.R
 import androidx.compose.runtime.Composable
@@ -58,7 +58,7 @@
     onLicensesClick: () -> Unit = {}
 ) {
     var moreMenuExpanded by remember { mutableStateOf(false) }
-    SmallTopAppBar(
+    TopAppBar(
         title = {
             Text(
                 text = title,
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/Component.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/Component.kt
index 3a3b28d..8a4cf2c 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/Component.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/Component.kt
@@ -23,12 +23,10 @@
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.calculateEndPadding
 import androidx.compose.foundation.layout.calculateStartPadding
-import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.consumedWindowInsets
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.safeDrawing
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.items
@@ -71,7 +69,7 @@
         onBackClick = onBackClick
     ) { paddingValues ->
         LazyColumn(
-            modifier = Modifier.consumedWindowInsets(WindowInsets.safeDrawing),
+            modifier = Modifier.consumedWindowInsets(paddingValues),
             contentPadding = PaddingValues(
                 start = paddingValues.calculateStartPadding(ltr) + ComponentPadding,
                 top = paddingValues.calculateTopPadding() + ComponentPadding,
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt
index e7463be..723aa26 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt
@@ -39,8 +39,8 @@
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.MediumTopAppBar
 import androidx.compose.material3.Scaffold
-import androidx.compose.material3.SmallTopAppBar
 import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
 import androidx.compose.material3.TopAppBarDefaults
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
@@ -49,17 +49,17 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * A sample for a simple use of [SmallTopAppBar].
+ * A sample for a simple use of small [TopAppBar].
  *
  * The top app bar here does not react to any scroll events in the content under it.
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Sampled
 @Composable
-fun SimpleSmallTopAppBar() {
+fun SimpleTopAppBar() {
     Scaffold(
         topBar = {
-            SmallTopAppBar(
+            TopAppBar(
                 title = {
                     Text(
                         "Simple TopAppBar",
@@ -163,7 +163,7 @@
 }
 
 /**
- * A sample for a pinned [SmallTopAppBar].
+ * A sample for a pinned small [TopAppBar].
  *
  * The top app bar here is pinned to its location and changes its container color when the content
  * under it is scrolled.
@@ -171,15 +171,15 @@
 @OptIn(ExperimentalMaterial3Api::class)
 @Sampled
 @Composable
-fun PinnedSmallTopAppBar() {
+fun PinnedTopAppBar() {
     val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
     Scaffold(
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         topBar = {
-            SmallTopAppBar(
+            TopAppBar(
                 title = {
                     Text(
-                        "Small TopAppBar",
+                        "TopAppBar",
                         maxLines = 1,
                         overflow = TextOverflow.Ellipsis
                     )
@@ -231,21 +231,21 @@
 }
 
 /**
- * A sample for a [SmallTopAppBar] that collapses when the content is scrolled up, and
+ * A sample for a small [TopAppBar] that collapses when the content is scrolled up, and
  * appears when the content scrolled down.
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Sampled
 @Composable
-fun EnterAlwaysSmallTopAppBar() {
+fun EnterAlwaysTopAppBar() {
     val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior()
     Scaffold(
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         topBar = {
-            SmallTopAppBar(
+            TopAppBar(
                 title = {
                     Text(
-                        "Small TopAppBar",
+                        "TopAppBar",
                         maxLines = 1,
                         overflow = TextOverflow.Ellipsis
                     )
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ScaffoldSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ScaffoldSamples.kt
index 8ce6ef3..02cd361 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ScaffoldSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ScaffoldSamples.kt
@@ -21,13 +21,11 @@
 import androidx.compose.foundation.border
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.ExperimentalLayoutApi
-import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.consumedWindowInsets
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.safeDrawing
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.material.icons.Icons
@@ -40,7 +38,6 @@
 import androidx.compose.material3.IconButton
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Scaffold
-import androidx.compose.material3.SmallTopAppBar
 import androidx.compose.material3.Snackbar
 import androidx.compose.material3.SnackbarDuration
 import androidx.compose.material3.SnackbarHost
@@ -49,6 +46,7 @@
 import androidx.compose.material3.SnackbarVisuals
 import androidx.compose.material3.Text
 import androidx.compose.material3.TextButton
+import androidx.compose.material3.TopAppBar
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
@@ -60,7 +58,6 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.channels.Channel
-import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.flow.receiveAsFlow
 import kotlinx.coroutines.launch
 
@@ -78,7 +75,7 @@
 
     Scaffold(
         topBar = {
-            SmallTopAppBar(
+            TopAppBar(
                 title = { Text("Simple Scaffold Screen") },
                 navigationIcon = {
                     IconButton(
@@ -99,8 +96,8 @@
         },
         content = { innerPadding ->
             LazyColumn(
-                // consume insets as scaffold doesn't do it by default (yet)
-                modifier = Modifier.consumedWindowInsets(WindowInsets.safeDrawing),
+                // consume insets as scaffold doesn't do it by default
+                modifier = Modifier.consumedWindowInsets(innerPadding),
                 contentPadding = innerPadding
             ) {
                 items(count = 100) {
@@ -140,7 +137,10 @@
         content = { innerPadding ->
             Text(
                 text = "Body content",
-                modifier = Modifier.padding(innerPadding).fillMaxSize().wrapContentSize()
+                modifier = Modifier
+                    .padding(innerPadding)
+                    .fillMaxSize()
+                    .wrapContentSize()
             )
         }
     )
@@ -173,7 +173,10 @@
         content = { innerPadding ->
             Text(
                 text = "Body content",
-                modifier = Modifier.padding(innerPadding).fillMaxSize().wrapContentSize()
+                modifier = Modifier
+                    .padding(innerPadding)
+                    .fillMaxSize()
+                    .wrapContentSize()
             )
         }
     )
@@ -247,7 +250,10 @@
         content = { innerPadding ->
             Text(
                 text = "Custom Snackbar Demo",
-                modifier = Modifier.padding(innerPadding).fillMaxSize().wrapContentSize()
+                modifier = Modifier
+                    .padding(innerPadding)
+                    .fillMaxSize()
+                    .wrapContentSize()
             )
         }
     )
@@ -292,7 +298,10 @@
         content = { innerPadding ->
             Text(
                 "Snackbar demo",
-                modifier = Modifier.padding(innerPadding).fillMaxSize().wrapContentSize()
+                modifier = Modifier
+                    .padding(innerPadding)
+                    .fillMaxSize()
+                    .wrapContentSize()
             )
         }
     )
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SliderSample.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SliderSample.kt
index c656ac6..cfee610 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SliderSample.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SliderSample.kt
@@ -17,10 +17,17 @@
 package androidx.compose.material3.samples
 
 import androidx.annotation.Sampled
+import androidx.compose.foundation.interaction.MutableInteractionSource
 import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.size
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.material3.ButtonDefaults
 import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.Icon
 import androidx.compose.material3.RangeSlider
 import androidx.compose.material3.Slider
+import androidx.compose.material3.SliderDefaults
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
@@ -28,6 +35,7 @@
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.semantics.contentDescription
 import androidx.compose.ui.semantics.semantics
 
@@ -44,6 +52,7 @@
     }
 }
 
+@OptIn(ExperimentalMaterial3Api::class)
 @Sampled
 @Composable
 fun StepsSliderSample() {
@@ -104,3 +113,66 @@
         )
     }
 }
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Sampled
+@Composable
+fun SliderWithCustomThumbSample() {
+    var sliderPosition by remember { mutableStateOf(0f) }
+    Column {
+        Text(text = sliderPosition.toString())
+        Slider(
+            modifier = Modifier.semantics { contentDescription = "Localized Description" },
+            value = sliderPosition,
+            onValueChange = { sliderPosition = it },
+            valueRange = 0f..5f,
+            steps = 4,
+            onValueChangeFinished = {
+                // launch some business logic update with the state you hold
+                // viewModel.updateSelectedSliderValue(sliderPosition)
+            },
+            thumb = {
+                Icon(
+                    imageVector = Icons.Filled.Favorite,
+                    contentDescription = null,
+                    modifier = Modifier.size(ButtonDefaults.IconSize),
+                    tint = Color.Red
+                )
+            }
+        )
+    }
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Sampled
+@Composable
+fun SliderWithCustomTrackAndThumb() {
+    var sliderPosition by remember { mutableStateOf(0f) }
+    val interactionSource = MutableInteractionSource()
+    Column {
+        Text(text = sliderPosition.toString())
+        Slider(
+            modifier = Modifier.semantics { contentDescription = "Localized Description" },
+            value = sliderPosition,
+            onValueChange = { sliderPosition = it },
+            valueRange = 0f..100f,
+            onValueChangeFinished = {
+                // launch some business logic update with the state you hold
+                // viewModel.updateSelectedSliderValue(sliderPosition)
+            },
+            interactionSource = interactionSource,
+            thumb = {
+                SliderDefaults.Thumb(
+                    interactionSource = interactionSource,
+                    colors = SliderDefaults.colors(thumbColor = Color.Red)
+                )
+            },
+            track = { sliderPositions ->
+                SliderDefaults.Track(
+                    colors = SliderDefaults.colors(activeTrackColor = Color.Red),
+                    sliderPositions = sliderPositions
+                )
+            }
+        )
+    }
+}
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt
index 4c3ec55..7742393 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt
@@ -59,7 +59,7 @@
     fun smallAppBar_lightTheme() {
         composeTestRule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
-                SmallTopAppBar(
+                TopAppBar(
                     navigationIcon = {
                         IconButton(onClick = { /* doSomething() */ }) {
                             Icon(
@@ -91,7 +91,7 @@
         composeTestRule.setMaterialContent(lightColorScheme()) {
             val behavior = enterAlwaysScrollBehavior(rememberTopAppBarState())
             Box(Modifier.testTag(TopAppBarTestTag)) {
-                SmallTopAppBar(
+                TopAppBar(
                     navigationIcon = {
                         IconButton(onClick = { /* doSomething() */ }) {
                             Icon(
@@ -132,7 +132,7 @@
     fun smallAppBar_darkTheme() {
         composeTestRule.setMaterialContent(darkColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
-                SmallTopAppBar(
+                TopAppBar(
                     navigationIcon = {
                         IconButton(onClick = { /* doSomething() */ }) {
                             Icon(
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarTest.kt
index 1a521cf..198a756 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarTest.kt
@@ -91,7 +91,7 @@
     fun smallTopAppBar_expandsToScreen() {
         rule
             .setMaterialContentForSizeAssertions {
-                SmallTopAppBar(title = { Text("Title") })
+                TopAppBar(title = { Text("Title") })
             }
             .assertHeightIsEqualTo(TopAppBarSmallTokens.ContainerHeight)
             .assertWidthIsEqualTo(rule.rootWidth())
@@ -102,7 +102,7 @@
         val title = "Title"
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
-                SmallTopAppBar(title = { Text(title) })
+                TopAppBar(title = { Text(title) })
             }
         }
         rule.onNodeWithText(title).assertIsDisplayed()
@@ -112,7 +112,7 @@
     fun smallTopAppBar_default_positioning() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
-                SmallTopAppBar(
+                TopAppBar(
                     navigationIcon = {
                         FakeIcon(Modifier.testTag(NavigationIconTestTag))
                     },
@@ -132,7 +132,7 @@
     fun smallTopAppBar_noNavigationIcon_positioning() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
-                SmallTopAppBar(
+                TopAppBar(
                     title = {
                         Text("Title", Modifier.testTag(TitleTestTag))
                     },
@@ -150,7 +150,7 @@
         var textStyle: TextStyle? = null
         var expectedTextStyle: TextStyle? = null
         rule.setMaterialContent(lightColorScheme()) {
-            SmallTopAppBar(title = {
+            TopAppBar(title = {
                 Text("Title")
                 textStyle = LocalTextStyle.current
                 expectedTextStyle =
@@ -174,7 +174,7 @@
         var expectedContainerColor: Color = Color.Unspecified
 
         rule.setMaterialContent(lightColorScheme()) {
-            SmallTopAppBar(
+            TopAppBar(
                 modifier = Modifier.testTag(TopAppBarTestTag),
                 navigationIcon = {
                     FakeIcon(Modifier.testTag(NavigationIconTestTag))
@@ -219,8 +219,7 @@
         lateinit var scrollBehavior: TopAppBarScrollBehavior
         rule.setMaterialContent(lightColorScheme()) {
             scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
-            SmallTopAppBar(
-                modifier = Modifier.testTag(TopAppBarTestTag),
+            TopAppBar(
                 title = {
                     Text("Title", Modifier.testTag(TitleTestTag))
                     // fraction = 1f to indicate a scroll.
@@ -228,6 +227,7 @@
                         TopAppBarDefaults.smallTopAppBarColors()
                             .containerColor(colorTransitionFraction = 1f)
                 },
+                modifier = Modifier.testTag(TopAppBarTestTag),
                 scrollBehavior = scrollBehavior
             )
         }
@@ -251,9 +251,9 @@
         rule.setMaterialContent(lightColorScheme()) {
             scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior()
             scrollHeightOffsetPx = with(LocalDensity.current) { scrollHeightOffsetDp.toPx() }
-            SmallTopAppBar(
-                modifier = Modifier.testTag(TopAppBarTestTag),
+            TopAppBar(
                 title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                modifier = Modifier.testTag(TopAppBarTestTag),
                 scrollBehavior = scrollBehavior
             )
         }
@@ -750,11 +750,11 @@
     @Test
     fun topAppBar_smallPinnedDraggedAppBar() {
         rule.setMaterialContentForSizeAssertions {
-            SmallTopAppBar(
-                modifier = Modifier.testTag(TopAppBarTestTag),
+            TopAppBar(
                 title = {
                     Text("Title")
                 },
+                modifier = Modifier.testTag(TopAppBarTestTag),
                 scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
             )
         }
@@ -1031,10 +1031,10 @@
         Scaffold(
             modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
             topBar = {
-                SmallTopAppBar(
-                    modifier = Modifier.testTag(TopAppBarTestTag),
+                TopAppBar(
                     title = { Text(text = "Title") },
-                    scrollBehavior = scrollBehavior,
+                    modifier = Modifier.testTag(TopAppBarTestTag),
+                    scrollBehavior = scrollBehavior
                 )
             }
         ) { contentPadding ->
@@ -1061,7 +1061,7 @@
     }
 
     /**
-     * Checks the app bar's components positioning when it's a [SmallTopAppBar], a
+     * Checks the app bar's components positioning when it's a [TopAppBar], a
      * [CenterAlignedTopAppBar], or a larger app bar that is scrolled up and collapsed into a small
      * configuration and there is no navigation icon.
      */
@@ -1089,7 +1089,7 @@
     }
 
     /**
-     * Checks the app bar's components positioning when it's a [SmallTopAppBar] or a
+     * Checks the app bar's components positioning when it's a [TopAppBar] or a
      * [CenterAlignedTopAppBar].
      */
     private fun assertSmallDefaultPositioning(isCenteredTitle: Boolean = false) {
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/MaterialComponentsInsetSupportTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/MaterialComponentsInsetSupportTest.kt
index 8f21ca2..2959fc6 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/MaterialComponentsInsetSupportTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/MaterialComponentsInsetSupportTest.kt
@@ -20,7 +20,7 @@
 import androidx.compose.foundation.layout.WindowInsetsSides
 import androidx.compose.foundation.layout.asPaddingValues
 import androidx.compose.foundation.layout.only
-import androidx.compose.foundation.layout.safeDrawing
+import androidx.compose.foundation.layout.systemBars
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.test.junit4.createAndroidComposeRule
@@ -51,7 +51,7 @@
         var contentPadding: WindowInsets? = null
         var expected: WindowInsets? = null
         rule.setContent {
-            expected = WindowInsets.safeDrawing
+            expected = WindowInsets.systemBars
                 .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top)
             contentPadding = TopAppBarDefaults.windowInsets
         }
@@ -66,7 +66,7 @@
         var contentPadding: WindowInsets? = null
         var expected: WindowInsets? = null
         rule.setContent {
-            expected = WindowInsets.safeDrawing
+            expected = WindowInsets.systemBars
                 .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
             contentPadding = BottomAppBarDefaults.windowInsets
         }
@@ -82,7 +82,7 @@
         var contentPadding: WindowInsets? = null
         var expected: WindowInsets? = null
         rule.setContent {
-            expected = WindowInsets.safeDrawing
+            expected = WindowInsets.systemBars
                 .only(WindowInsetsSides.Start + WindowInsetsSides.Vertical)
             contentPadding = DrawerDefaults.windowInsets
         }
@@ -97,7 +97,7 @@
         var contentPadding: WindowInsets? = null
         var expected: WindowInsets? = null
         rule.setContent {
-            expected = WindowInsets.safeDrawing
+            expected = WindowInsets.systemBars
                 .only(WindowInsetsSides.Bottom + WindowInsetsSides.Horizontal)
             contentPadding = NavigationBarDefaults.windowInsets
         }
@@ -112,7 +112,7 @@
         var contentPadding: WindowInsets? = null
         var expected: WindowInsets? = null
         rule.setContent {
-            expected = WindowInsets.safeDrawing
+            expected = WindowInsets.systemBars
                 .only(WindowInsetsSides.Start + WindowInsetsSides.Vertical)
             contentPadding = NavigationRailDefaults.windowInsets
         }
@@ -129,7 +129,7 @@
         var layoutDirection: LayoutDirection? = null
         rule.setContent {
             layoutDirection = LocalLayoutDirection.current
-            expected = WindowInsets.safeDrawing
+            expected = WindowInsets.systemBars
                 .asPaddingValues(LocalDensity.current)
             Scaffold { paddingValues ->
                 contentPadding = paddingValues
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ScaffoldTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ScaffoldTest.kt
index 45be968..54a55f4 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ScaffoldTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ScaffoldTest.kt
@@ -20,6 +20,7 @@
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
@@ -60,6 +61,7 @@
     val rule = createComposeRule()
 
     private val scaffoldTag = "Scaffold"
+    private val roundingError = 0.5.dp
 
     @Test
     fun scaffold_onlyContent_takesWholeScreen() {
@@ -230,12 +232,13 @@
                 Modifier
                     .requiredSize(10.dp, 20.dp)
                     .semantics(mergeDescendants = true) {}
-                    .testTag("Scaffold")
+                    .testTag(scaffoldTag)
             ) {
                 Scaffold(
                     topBar = {
                         Box(
-                            Modifier.requiredSize(10.dp)
+                            Modifier
+                                .requiredSize(10.dp)
                                 .shadow(4.dp)
                                 .zIndex(4f)
                                 .background(color = Color.White)
@@ -243,14 +246,15 @@
                     }
                 ) {
                     Box(
-                        Modifier.requiredSize(10.dp)
+                        Modifier
+                            .requiredSize(10.dp)
                             .background(color = Color.White)
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("Scaffold")
+        rule.onNodeWithTag(scaffoldTag)
             .captureToImage().asAndroidBitmap().apply {
                 // asserts the appbar(top half part) has the shadow
                 val yPos = height / 2 + 2
@@ -259,4 +263,86 @@
                 assertThat(Color(getPixel(width - 1, yPos))).isNotEqualTo(Color.White)
             }
     }
+
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun scaffold_providesInsets_respectTopAppBar() {
+        rule.setContent {
+            Box(Modifier.requiredSize(10.dp, 20.dp)) {
+                Scaffold(
+                    contentWindowInsets = WindowInsets(top = 5.dp, bottom = 3.dp),
+                    topBar = {
+                        Box(Modifier.requiredSize(10.dp))
+                    }
+                ) { paddingValues ->
+                    // top is like top app bar + rounding error
+                    assertThat(paddingValues.calculateTopPadding() - 10.dp)
+                        .isLessThan(roundingError)
+                    // bottom is like the insets
+                    assertThat(paddingValues.calculateBottomPadding() - 30.dp).isLessThan(
+                        roundingError
+                    )
+                    Box(
+                        Modifier
+                            .requiredSize(10.dp)
+                            .background(color = Color.White)
+                    )
+                }
+            }
+        }
+    }
+
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun scaffold_providesInsets_respectCollapsedTopAppBar() {
+        rule.setContent {
+            Box(Modifier.requiredSize(10.dp, 20.dp)) {
+                Scaffold(
+                    contentWindowInsets = WindowInsets(top = 5.dp, bottom = 3.dp),
+                    topBar = {
+                        Box(Modifier.requiredSize(0.dp))
+                    }
+                ) { paddingValues ->
+                    // top is like the collapsed top app bar (i.e. 0dp) + rounding error
+                    assertThat(paddingValues.calculateTopPadding()).isLessThan(roundingError)
+                    // bottom is like the insets
+                    assertThat(paddingValues.calculateBottomPadding() - 30.dp).isLessThan(
+                        roundingError
+                    )
+                    Box(
+                        Modifier
+                            .requiredSize(10.dp)
+                            .background(color = Color.White)
+                    )
+                }
+            }
+        }
+    }
+
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun scaffold_providesInsets_respectsBottomAppBar() {
+        rule.setContent {
+            Box(Modifier.requiredSize(10.dp, 20.dp)) {
+                Scaffold(
+                    contentWindowInsets = WindowInsets(top = 5.dp, bottom = 3.dp),
+                    bottomBar = {
+                        Box(Modifier.requiredSize(10.dp))
+                    }
+                ) { paddingValues ->
+                    // bottom is like bottom app bar + rounding error
+                    assertThat(paddingValues.calculateBottomPadding() - 10.dp).isLessThan(
+                        roundingError
+                    )
+                    // top is like the insets
+                    assertThat(paddingValues.calculateTopPadding() - 5.dp).isLessThan(roundingError)
+                    Box(
+                        Modifier
+                            .requiredSize(10.dp)
+                            .background(color = Color.White)
+                    )
+                }
+            }
+        }
+    }
 }
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SafeDrawingInsets.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SystemBarsDefaultInsets.android.kt
similarity index 82%
rename from compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SafeDrawingInsets.android.kt
rename to compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SystemBarsDefaultInsets.android.kt
index 2b232b0..9cb5c3c 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SafeDrawingInsets.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SystemBarsDefaultInsets.android.kt
@@ -17,9 +17,9 @@
 package androidx.compose.material3
 
 import androidx.compose.foundation.layout.WindowInsets
-import androidx.compose.foundation.layout.safeDrawing
+import androidx.compose.foundation.layout.systemBars
 import androidx.compose.runtime.Composable
 
-internal actual val WindowInsets.Companion.safeDrawingForVisualComponents: WindowInsets
+internal actual val WindowInsets.Companion.systemBarsForVisualComponents: WindowInsets
     @Composable
-    get() = safeDrawing
\ No newline at end of file
+    get() = systemBars
\ No newline at end of file
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 11e9b0b..b41fb99 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
@@ -91,16 +91,16 @@
  *
  * Top app bars display information and actions at the top of a screen.
  *
- * This SmallTopAppBar has slots for a title, navigation icon, and actions.
+ * This small TopAppBar has slots for a title, navigation icon, and actions.
  *
  * ![Small top app bar image](https://developer.android.com/images/reference/androidx/compose/material3/small-top-app-bar.png)
  *
  * A simple top app bar looks like:
- * @sample androidx.compose.material3.samples.SimpleSmallTopAppBar
+ * @sample androidx.compose.material3.samples.SimpleTopAppBar
  * A top app bar that uses a [scrollBehavior] to customize its nested scrolling behavior when
  * working in conjunction with a scrolling content looks like:
- * @sample androidx.compose.material3.samples.PinnedSmallTopAppBar
- * @sample androidx.compose.material3.samples.EnterAlwaysSmallTopAppBar
+ * @sample androidx.compose.material3.samples.PinnedTopAppBar
+ * @sample androidx.compose.material3.samples.EnterAlwaysTopAppBar
  *
  * @param title the title to be displayed in the top app bar
  * @param modifier the [Modifier] to be applied to this top app bar
@@ -118,7 +118,7 @@
  */
 @ExperimentalMaterial3Api
 @Composable
-fun SmallTopAppBar(
+fun TopAppBar(
     title: @Composable () -> Unit,
     modifier: Modifier = Modifier,
     navigationIcon: @Composable () -> Unit = {},
@@ -141,6 +141,57 @@
 }
 
 /**
+ * <a href="https://m3.material.io/components/top-app-bar/overview" class="external" target="_blank">Material Design small top app bar</a>.
+ *
+ * Top app bars display information and actions at the top of a screen.
+ *
+ * This SmallTopAppBar has slots for a title, navigation icon, and actions.
+ *
+ * ![Small top app bar image](https://developer.android.com/images/reference/androidx/compose/material3/small-top-app-bar.png)
+ *
+ * A simple top app bar looks like:
+ * @sample androidx.compose.material3.samples.SimpleTopAppBar
+ * A top app bar that uses a [scrollBehavior] to customize its nested scrolling behavior when
+ * working in conjunction with a scrolling content looks like:
+ * @sample androidx.compose.material3.samples.PinnedTopAppBar
+ * @sample androidx.compose.material3.samples.EnterAlwaysTopAppBar
+ *
+ * @param title the title to be displayed in the top app bar
+ * @param modifier the [Modifier] to be applied to this top app bar
+ * @param navigationIcon the navigation icon displayed at the start of the top app bar. This should
+ * typically be an [IconButton] or [IconToggleButton].
+ * @param actions the actions displayed at the end of the top app bar. This should typically be
+ * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ * @param windowInsets a window insets that app bar will respect.
+ * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app
+ * bar in different states. See [TopAppBarDefaults.smallTopAppBarColors].
+ * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
+ * applied by this top app bar to set up its height and colors. A scroll behavior is designed to
+ * work in conjunction with a scrolled content to change the top app bar appearance as the content
+ * scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
+ * @deprecated use [TopAppBar] instead
+ */
+@Deprecated(
+    message = "Use TopAppBar instead.",
+    replaceWith = ReplaceWith(
+        "TopAppBar(title, modifier, navigationIcon, actions, windowInsets, colors, " +
+            "scrollBehavior)"
+    ),
+    level = DeprecationLevel.ERROR
+)
+@ExperimentalMaterial3Api
+@Composable
+fun SmallTopAppBar(
+    title: @Composable () -> Unit,
+    modifier: Modifier = Modifier,
+    navigationIcon: @Composable () -> Unit = {},
+    actions: @Composable RowScope.() -> Unit = {},
+    windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,
+    colors: TopAppBarColors = TopAppBarDefaults.smallTopAppBarColors(),
+    scrollBehavior: TopAppBarScrollBehavior? = null
+) = TopAppBar(title, modifier, navigationIcon, actions, windowInsets, colors, scrollBehavior)
+
+/**
  * <a href="https://m3.material.io/components/top-app-bar/overview" class="external" target="_blank">Material Design center-aligned small top app bar</a>.
  *
  * Top app bars display information and actions at the top of a screen.
@@ -515,7 +566,7 @@
      */
     val windowInsets: WindowInsets
         @Composable
-        get() = WindowInsets.safeDrawingForVisualComponents
+        get() = WindowInsets.systemBarsForVisualComponents
             .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top)
 
     /**
@@ -901,7 +952,7 @@
     val windowInsets: WindowInsets
         @Composable
         get() {
-            return WindowInsets.safeDrawingForVisualComponents
+            return WindowInsets.systemBarsForVisualComponents
                 .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
         }
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
index bf42087..0844cfd 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
@@ -270,7 +270,7 @@
      */
     val windowInsets: WindowInsets
         @Composable
-        get() = WindowInsets.safeDrawingForVisualComponents
+        get() = WindowInsets.systemBarsForVisualComponents
             .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
 }
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
index 8c8f77c..ae8de70 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
@@ -631,7 +631,7 @@
      */
     val windowInsets: WindowInsets
         @Composable
-        get() = WindowInsets.safeDrawingForVisualComponents
+        get() = WindowInsets.systemBarsForVisualComponents
             .only(WindowInsetsSides.Vertical + WindowInsetsSides.Start)
 }
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
index b5f0582..fa38529 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
@@ -268,7 +268,7 @@
      */
     val windowInsets: WindowInsets
         @Composable
-        get() = WindowInsets.safeDrawingForVisualComponents
+        get() = WindowInsets.systemBarsForVisualComponents
             .only(WindowInsetsSides.Vertical + WindowInsetsSides.Start)
 }
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
index fd6cd8e..cbad81d 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
@@ -19,6 +19,8 @@
 import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.asPaddingValues
+import androidx.compose.foundation.layout.calculateEndPadding
+import androidx.compose.foundation.layout.calculateStartPadding
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.Immutable
@@ -58,6 +60,10 @@
  * @param contentColor the preferred color for content inside this scaffold. Defaults to either the
  * matching content color for [containerColor], or to the current [LocalContentColor] if
  * [containerColor] is not a color from the theme.
+ * @param contentWindowInsets window insets to be passed to [content] slot via [PaddingValues]
+ * params. Scaffold will take the insets into account from the top/bottom only if the [topBar]/
+ * [bottomBar] are not present, as the scaffold expect [topBar]/[bottomBar] to handle insets
+ * instead
  * @param content content of the screen. The lambda receives a [PaddingValues] that should be
  * applied to the content root via [Modifier.padding] and [Modifier.consumeWindowInsets] to
  * properly offset top and bottom bars. If using [Modifier.verticalScroll], apply this modifier to
@@ -74,6 +80,7 @@
     floatingActionButtonPosition: FabPosition = FabPosition.End,
     containerColor: Color = MaterialTheme.colorScheme.background,
     contentColor: Color = contentColorFor(containerColor),
+    contentWindowInsets: WindowInsets = ScaffoldDefaults.contentWindowInsets,
     content: @Composable (PaddingValues) -> Unit
 ) {
     Surface(modifier = modifier, color = containerColor, contentColor = contentColor) {
@@ -83,6 +90,7 @@
             bottomBar = bottomBar,
             content = content,
             snackbar = snackbarHost,
+            contentWindowInsets = contentWindowInsets,
             fab = floatingActionButton
         )
     }
@@ -108,6 +116,7 @@
     content: @Composable (PaddingValues) -> Unit,
     snackbar: @Composable () -> Unit,
     fab: @Composable () -> Unit,
+    contentWindowInsets: WindowInsets,
     bottomBar: @Composable () -> Unit
 
 ) {
@@ -184,17 +193,22 @@
             }
 
             val bodyContentPlaceables = subcompose(ScaffoldLayoutContent.MainContent) {
-                val insets = WindowInsets.safeDrawingForVisualComponents
-                    .asPaddingValues(this@SubcomposeLayout)
+                val insets = contentWindowInsets.asPaddingValues(this@SubcomposeLayout)
                 val innerPadding = PaddingValues(
                     top =
-                    if (topBarHeight == 0) insets.calculateTopPadding()
-                    else topBarHeight.toDp(),
+                    if (topBarPlaceables.isEmpty()) {
+                        insets.calculateTopPadding()
+                    } else {
+                        topBarHeight.toDp()
+                    },
                     bottom =
-                    if (bottomBarHeight == 0) insets.calculateBottomPadding()
-                    else bottomBarHeight.toDp(),
-                    start = insets.calculateLeftPadding((this@SubcomposeLayout).layoutDirection),
-                    end = insets.calculateRightPadding((this@SubcomposeLayout).layoutDirection)
+                    if (bottomBarPlaceables.isEmpty()) {
+                        insets.calculateBottomPadding()
+                    } else {
+                        bottomBarHeight.toDp()
+                    },
+                    start = insets.calculateStartPadding((this@SubcomposeLayout).layoutDirection),
+                    end = insets.calculateEndPadding((this@SubcomposeLayout).layoutDirection)
                 )
                 content(innerPadding)
             }.map { it.measure(looseConstraints) }
@@ -228,6 +242,19 @@
 }
 
 /**
+ * Object containing various default values for [Scaffold] component.
+ */
+@ExperimentalMaterial3Api
+object ScaffoldDefaults {
+    /**
+     * Default insets to be used and consumed by the scaffold content slot
+     */
+    val contentWindowInsets: WindowInsets
+        @Composable
+        get() = WindowInsets.systemBarsForVisualComponents
+}
+
+/**
  * The possible positions for a [FloatingActionButton] attached to a [Scaffold].
  */
 @ExperimentalMaterial3Api
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 1e3eee8..b76ab43 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
@@ -43,6 +43,7 @@
 import androidx.compose.foundation.layout.BoxWithConstraints
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.heightIn
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.requiredSizeIn
@@ -55,6 +56,7 @@
 import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateListOf
@@ -79,6 +81,8 @@
 import androidx.compose.ui.input.pointer.PointerType
 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.layoutId
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.debugInspectorInfo
@@ -95,6 +99,7 @@
 import kotlin.math.floor
 import kotlin.math.max
 import kotlin.math.min
+import kotlin.math.roundToInt
 import kotlinx.coroutines.CancellationException
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.coroutineScope
@@ -105,6 +110,8 @@
  *
  * Sliders allow users to make selections from a range of values.
  *
+ * It uses [SliderDefaults.Thumb] and [SliderDefaults.Track] as the thumb and track.
+ *
  * Sliders reflect a range of values along a bar, from which users may select a single value.
  * They are ideal for adjusting settings such as volume, brightness, or applying image filters.
  *
@@ -140,9 +147,9 @@
  * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
  * for this slider. You can create and pass in your own `remember`ed instance to observe
  * [Interaction]s and customize the appearance / behavior of this slider in different states.
-
  */
 // TODO(b/229979132): Add m.io link
+@OptIn(ExperimentalMaterial3Api::class)
 @Composable
 fun Slider(
     value: Float,
@@ -156,18 +163,185 @@
     colors: SliderColors = SliderDefaults.colors(),
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
 ) {
+    Slider(
+        value = value,
+        onValueChange = onValueChange,
+        modifier = modifier,
+        enabled = enabled,
+        valueRange = valueRange,
+        steps = steps,
+        onValueChangeFinished = onValueChangeFinished,
+        colors = colors,
+        interactionSource = interactionSource,
+        thumb = {
+            SliderDefaults.Thumb(
+                interactionSource = interactionSource,
+                colors = colors,
+                enabled = enabled
+            )
+        },
+        track = { sliderPositions ->
+            SliderDefaults.Track(
+                colors = colors,
+                enabled = enabled,
+                sliderPositions = sliderPositions
+            )
+        }
+    )
+}
+
+/**
+ * <a href="https://m3.material.io/components/sliders/overview" class="external" target="_blank">Material Design slider</a>.
+ *
+ * Sliders allow users to make selections from a range of values.
+ *
+ * This uses the provided thumb and [SliderDefaults.Track] as the thumb and track.
+ *
+ * Sliders reflect a range of values along a bar, from which users may select a single value.
+ * They are ideal for adjusting settings such as volume, brightness, or applying image filters.
+ *
+ * ![Sliders image](https://developer.android.com/images/reference/androidx/compose/material3/sliders.png)
+ *
+ * Slider using a custom thumb:
+ *
+ * @sample androidx.compose.material3.samples.SliderWithCustomThumbSample
+ *
+ * @param value current value of the slider. If outside of [valueRange] provided, value will be
+ * coerced to this range.
+ * @param onValueChange callback in which value should be updated
+ * @param modifier the [Modifier] to be applied to this slider
+ * @param enabled controls the enabled state of this slider. When `false`, this component will not
+ * respond to user input, and it will appear visually disabled and disabled to accessibility
+ * services.
+ * @param valueRange range of values that this slider can take. The passed [value] will be coerced
+ * to this range.
+ * @param steps if greater than 0, specifies the amount of discrete allowable values, evenly
+ * distributed across the whole value range. If 0, the slider will behave continuously and allow any
+ * value from the range specified. Must not be negative.
+ * @param onValueChangeFinished called when value change has ended. This should not be used to
+ * update the slider value (use [onValueChange] instead), but rather to know when the user has
+ * completed selecting a new value by ending a drag or a click.
+ * @param colors [SliderColors] that will be used to resolve the colors used for this slider in
+ * different states. See [SliderDefaults.colors].
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this slider. You can create and pass in your own `remember`ed instance to observe
+ * [Interaction]s and customize the appearance / behavior of this slider in different states.
+ * @param thumb the thumb to be displayed on the slider, it is placed on top of the track. The lambda
+ * receives a [SliderPositions] which is used to obtain the current active track and the tick positions
+ * if the slider is discrete.
+ */
+@Composable
+@ExperimentalMaterial3Api
+fun Slider(
+    value: Float,
+    onValueChange: (Float) -> Unit,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    valueRange: ClosedFloatingPointRange<Float> = 0f..1f,
+    /*@IntRange(from = 0)*/
+    steps: Int = 0,
+    onValueChangeFinished: (() -> Unit)? = null,
+    colors: SliderColors = SliderDefaults.colors(),
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    thumb: @Composable (SliderPositions) -> Unit
+) {
+    Slider(
+        value = value,
+        onValueChange = onValueChange,
+        modifier = modifier,
+        enabled = enabled,
+        valueRange = valueRange,
+        steps = steps,
+        onValueChangeFinished = onValueChangeFinished,
+        colors = colors,
+        interactionSource = interactionSource,
+        thumb = thumb,
+        track = { sliderPositions ->
+            SliderDefaults.Track(
+                colors = colors,
+                enabled = enabled,
+                sliderPositions = sliderPositions
+            )
+        }
+    )
+}
+
+/**
+ * <a href="https://m3.material.io/components/sliders/overview" class="external" target="_blank">Material Design slider</a>.
+ *
+ * Sliders allow users to make selections from a range of values.
+ *
+ * Sliders reflect a range of values along a bar, from which users may select a single value.
+ * They are ideal for adjusting settings such as volume, brightness, or applying image filters.
+ *
+ * ![Sliders image](https://developer.android.com/images/reference/androidx/compose/material3/sliders.png)
+ *
+ * Slider using custom track and thumb:
+ *
+ * @sample androidx.compose.material3.samples.SliderWithCustomTrackAndThumb
+ *
+ * @param value current value of the slider. If outside of [valueRange] provided, value will be
+ * coerced to this range.
+ * @param onValueChange callback in which value should be updated
+ * @param track the track to be displayed on the slider, it is placed underneath the thumb. The lambda
+ * receives a [SliderPositions] which is used to obtain the current active track and the tick positions
+ * if the slider is discrete.
+ * @param modifier the [Modifier] to be applied to this slider
+ * @param enabled controls the enabled state of this slider. When `false`, this component will not
+ * respond to user input, and it will appear visually disabled and disabled to accessibility
+ * services.
+ * @param valueRange range of values that this slider can take. The passed [value] will be coerced
+ * to this range.
+ * @param steps if greater than 0, specifies the amount of discrete allowable values, evenly
+ * distributed across the whole value range. If 0, the slider will behave continuously and allow any
+ * value from the range specified. Must not be negative.
+ * @param onValueChangeFinished called when value change has ended. This should not be used to
+ * update the slider value (use [onValueChange] instead), but rather to know when the user has
+ * completed selecting a new value by ending a drag or a click.
+ * @param colors [SliderColors] that will be used to resolve the colors used for this slider in
+ * different states. See [SliderDefaults.colors].
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this slider. You can create and pass in your own `remember`ed instance to observe
+ * [Interaction]s and customize the appearance / behavior of this slider in different states.
+ * @param thumb the thumb to be displayed on the slider, it is placed on top of the track. The lambda
+ * receives a [SliderPositions] which is used to obtain the current active track and the tick positions
+ * if the slider is discrete.
+ */
+@Composable
+@ExperimentalMaterial3Api
+fun Slider(
+    value: Float,
+    onValueChange: (Float) -> Unit,
+    track: @Composable (SliderPositions) -> Unit,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    valueRange: ClosedFloatingPointRange<Float> = 0f..1f,
+    /*@IntRange(from = 0)*/
+    steps: Int = 0,
+    onValueChangeFinished: (() -> Unit)? = null,
+    colors: SliderColors = SliderDefaults.colors(),
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    thumb: @Composable (SliderPositions) -> Unit = {
+        SliderDefaults.Thumb(
+            colors = colors,
+            enabled = enabled,
+            interactionSource = interactionSource
+        )
+    }
+) {
     require(steps >= 0) { "steps should be >= 0" }
 
     SliderImpl(
-        colors = colors,
+        modifier = modifier,
         enabled = enabled,
         interactionSource = interactionSource,
-        modifier = modifier,
         onValueChange = onValueChange,
         onValueChangeFinished = onValueChangeFinished,
         steps = steps,
         value = value,
-        valueRange = valueRange
+        valueRange = valueRange,
+        thumb = thumb,
+        track = track
     )
 }
 
@@ -331,12 +505,13 @@
     }
 }
 
+@OptIn(ExperimentalMaterial3Api::class)
 @Composable
 private fun RangeSliderImpl(
     enabled: Boolean,
     positionFractionStart: Float,
     positionFractionEnd: Float,
-    tickFractions: List<Float>,
+    tickFractions: FloatArray,
     colors: SliderColors,
     width: Float,
     startInteractionSource: MutableInteractionSource,
@@ -357,7 +532,8 @@
 
         val offsetStart = widthDp * positionFractionStart
         val offsetEnd = widthDp * positionFractionEnd
-        Track(
+
+        TempRangeSliderTrack(
             Modifier
                 .align(Alignment.CenterStart)
                 .fillMaxSize(),
@@ -370,27 +546,37 @@
             trackStrokeWidth
         )
 
-        SliderThumb(
-            Modifier
-                .semantics(mergeDescendants = true) { contentDescription = startContentDescription }
-                .focusable(true, startInteractionSource)
-                .then(startThumbSemantics),
-            offsetStart,
-            startInteractionSource,
-            colors,
-            enabled,
-            ThumbSize
+        TempRangeSliderThumb(
+            offset = offsetStart,
+            content = {
+                SliderDefaults.Thumb(
+                    modifier = Modifier
+                        .semantics(mergeDescendants = true) {
+                            contentDescription = startContentDescription
+                        }
+                        .focusable(true, startInteractionSource)
+                        .then(startThumbSemantics),
+                    colors = colors,
+                    enabled = enabled,
+                    interactionSource = startInteractionSource
+                )
+            }
         )
-        SliderThumb(
-            Modifier
-                .semantics(mergeDescendants = true) { contentDescription = endContentDescription }
-                .focusable(true, endInteractionSource)
-                .then(endThumbSemantics),
-            offsetEnd,
-            endInteractionSource,
-            colors,
-            enabled,
-            ThumbSize
+        TempRangeSliderThumb(
+            offset = offsetEnd,
+            content = {
+                SliderDefaults.Thumb(
+                    modifier = Modifier
+                        .semantics(mergeDescendants = true) {
+                            contentDescription = endContentDescription
+                        }
+                        .focusable(true, endInteractionSource)
+                        .then(endThumbSemantics),
+                    colors = colors,
+                    enabled = enabled,
+                    interactionSource = endInteractionSource
+                )
+            }
         )
     }
 }
@@ -467,170 +653,28 @@
         disabledInactiveTrackColor = disabledInactiveTrackColor,
         disabledInactiveTickColor = disabledInactiveTickColor
     )
-}
 
-@Composable
-internal fun SliderImpl(
-    modifier: Modifier,
-    colors: SliderColors,
-    enabled: Boolean,
-    interactionSource: MutableInteractionSource,
-    onValueChange: (Float) -> Unit,
-    onValueChangeFinished: (() -> Unit)?,
-    steps: Int,
-    value: Float,
-    valueRange: ClosedFloatingPointRange<Float>
-) {
-    val onValueChangeState = rememberUpdatedState<(Float) -> Unit> {
-        if (it != value) {
-            onValueChange(it)
-        }
-    }
-
-    val tickFractions = remember(steps) {
-        stepsToTickFractions(steps)
-    }
-    BoxWithConstraints(
-        modifier
-            .minimumTouchTargetSize()
-            .requiredSizeIn(
-                minWidth = SliderTokens.HandleWidth,
-                minHeight = SliderTokens.HandleHeight
-            )
-            .sliderSemantics(
-                value,
-                enabled,
-                onValueChange,
-                onValueChangeFinished,
-                valueRange,
-                steps
-            )
-            .focusable(enabled, interactionSource)
-    ) {
-        val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
-        val widthPx = constraints.maxWidth.toFloat()
-        val maxPx: Float
-        val minPx: Float
-        val thumbRadius = ThumbDiameter / 2
-
-        with(LocalDensity.current) {
-            maxPx = max(widthPx - thumbRadius.toPx(), 0f)
-            minPx = min(thumbRadius.toPx(), maxPx)
-        }
-
-        fun scaleToUserValue(offset: Float) =
-            scale(minPx, maxPx, offset, valueRange.start, valueRange.endInclusive)
-
-        fun scaleToOffset(userValue: Float) =
-            scale(valueRange.start, valueRange.endInclusive, userValue, minPx, maxPx)
-
-        val rawOffset = remember { mutableStateOf(scaleToOffset(value)) }
-        val pressOffset = remember { mutableStateOf(0f) }
-
-        val draggableState = remember(minPx, maxPx, valueRange) {
-            SliderDraggableState {
-                rawOffset.value = (rawOffset.value + it + pressOffset.value)
-                pressOffset.value = 0f
-                val offsetInTrack = snapValueToTick(rawOffset.value, tickFractions, minPx, maxPx)
-                onValueChangeState.value.invoke(scaleToUserValue(offsetInTrack))
-            }
-        }
-
-        val gestureEndAction = rememberUpdatedState {
-            if (!draggableState.isDragging) {
-                // check isDragging in case the change is still in progress (touch -> drag case)
-                onValueChangeFinished?.invoke()
-            }
-        }
-
-        val press = Modifier.sliderTapModifier(
-            draggableState,
-            interactionSource,
-            widthPx,
-            isRtl,
-            rawOffset,
-            gestureEndAction,
-            pressOffset,
-            enabled
-        )
-
-        val drag = Modifier.draggable(
-            orientation = Orientation.Horizontal,
-            reverseDirection = isRtl,
-            enabled = enabled,
-            interactionSource = interactionSource,
-            onDragStopped = { _ -> gestureEndAction.value.invoke() },
-            startDragImmediately = draggableState.isDragging,
-            state = draggableState
-        )
-
-        val coerced = value.coerceIn(valueRange.start, valueRange.endInclusive)
-        val positionFraction = calcFraction(valueRange.start, valueRange.endInclusive, coerced)
-
-        val width = maxPx - minPx
-        val widthDp: Dp
-        val trackStrokeWidth: Float
-
-        with(LocalDensity.current) {
-            widthDp = width.toDp()
-            trackStrokeWidth = TrackHeight.toPx()
-        }
-
-        val offset = widthDp * positionFraction
-
-        SliderLayout(
-            track = {
-                Track(
-                    Modifier.fillMaxSize(),
-                    colors,
-                    enabled,
-                    0f,
-                    positionFraction,
-                    tickFractions,
-                    ThumbWidth,
-                    trackStrokeWidth
-                )
-            },
-            thumb = {
-                SliderThumb(
-                    Modifier,
-                    offset,
-                    interactionSource,
-                    colors,
-                    enabled,
-                    ThumbSize
-                )
-            },
-            modifier = press.then(drag)
-        )
-    }
-}
-
-@Composable
-private fun SliderLayout(
-    modifier: Modifier,
-    thumb: @Composable BoxScope.() -> Unit,
-    track: @Composable () -> Unit,
-) {
-    Box(modifier.then(DefaultSliderConstraints)) {
-        track()
-        thumb()
-    }
-}
-
-@Composable
-private fun BoxScope.SliderThumb(
-    modifier: Modifier,
-    offset: Dp,
-    interactionSource: MutableInteractionSource,
-    colors: SliderColors,
-    enabled: Boolean,
-    thumbSize: DpSize
-) {
-    Box(
-        Modifier
-            .padding(start = offset)
-            .align(Alignment.CenterStart)
+    /**
+     * The Default thumb for [Slider] and [RangeSlider]
+     *
+     * @param interactionSource the [MutableInteractionSource] representing the stream of
+     * [Interaction]s for this thumb. You can create and pass in your own `remember`ed
+     * instance to observe
+     * @param modifier the [Modifier] to be applied to the thumb.
+     * @param colors [SliderColors] that will be used to resolve the colors used for this thumb in
+     * different states. See [SliderDefaults.colors].
+     * @param enabled controls the enabled state of this slider. When `false`, this component will
+     * not respond to user input, and it will appear visually disabled and disabled to
+     * accessibility services.
+     */
+    @Composable
+    @ExperimentalMaterial3Api
+    fun Thumb(
+        interactionSource: MutableInteractionSource,
+        modifier: Modifier = Modifier,
+        colors: SliderColors = colors(),
+        enabled: Boolean = true,
+        thumbSize: DpSize = ThumbSize
     ) {
         val interactions = remember { mutableStateListOf<Interaction>() }
         LaunchedEffect(interactionSource) {
@@ -652,6 +696,7 @@
             ThumbDefaultElevation
         }
         val shape = SliderTokens.HandleShape.toShape()
+
         Spacer(
             modifier
                 .size(thumbSize)
@@ -667,16 +712,248 @@
                 .background(colors.thumbColor(enabled).value, shape)
         )
     }
+
+    /**
+     * The Default track for [Slider] and [RangeSlider]
+     *
+     * @param modifier the [Modifier] to be applied to the track.
+     * @param colors [SliderColors] that will be used to resolve the colors used for this track in
+     * different states. See [SliderDefaults.colors].
+     * @param enabled controls the enabled state of this slider. When `false`, this component will
+     * not respond to user input, and it will appear visually disabled and disabled to
+     * accessibility services.
+     * @param sliderPositions [SliderPositions] which is used to obtain the current active track
+     * and the tick positions if the slider is discrete.
+     */
+    @Composable
+    @ExperimentalMaterial3Api
+    fun Track(
+        sliderPositions: SliderPositions,
+        modifier: Modifier = Modifier,
+        colors: SliderColors = colors(),
+        enabled: Boolean = true,
+    ) {
+        val inactiveTrackColor = colors.trackColor(enabled, active = false)
+        val activeTrackColor = colors.trackColor(enabled, active = true)
+        val inactiveTickColor = colors.tickColor(enabled, active = false)
+        val activeTickColor = colors.tickColor(enabled, active = true)
+        Canvas(modifier.fillMaxWidth()) {
+            val isRtl = layoutDirection == LayoutDirection.Rtl
+            val sliderLeft = Offset(0f, center.y)
+            val sliderRight = Offset(size.width, center.y)
+            val sliderStart = if (isRtl) sliderRight else sliderLeft
+            val sliderEnd = if (isRtl) sliderLeft else sliderRight
+            val tickSize = TickSize.toPx()
+            val trackStrokeWidth = TrackHeight.toPx()
+            drawLine(
+                inactiveTrackColor.value,
+                sliderStart,
+                sliderEnd,
+                trackStrokeWidth,
+                StrokeCap.Round
+            )
+            val sliderValueEnd = Offset(
+                sliderStart.x +
+                    (sliderEnd.x - sliderStart.x) * sliderPositions.positionFraction,
+                center.y
+            )
+
+            val sliderValueStart = Offset(
+                sliderStart.x +
+                    (sliderEnd.x - sliderStart.x) * 0f,
+                center.y
+            )
+
+            drawLine(
+                activeTrackColor.value,
+                sliderValueStart,
+                sliderValueEnd,
+                trackStrokeWidth,
+                StrokeCap.Round
+            )
+            sliderPositions.tickFractions.groupBy {
+                it > sliderPositions.positionFraction ||
+                    it < 0f
+            }.forEach { (outsideFraction, list) ->
+                    drawPoints(
+                        list.map {
+                            Offset(lerp(sliderStart, sliderEnd, it).x, center.y)
+                        },
+                        PointMode.Points,
+                        (if (outsideFraction) inactiveTickColor else activeTickColor).value,
+                        tickSize,
+                        StrokeCap.Round
+                    )
+                }
+        }
+    }
 }
 
+@OptIn(ExperimentalMaterial3Api::class)
 @Composable
-private fun Track(
+private fun SliderImpl(
+    modifier: Modifier,
+    enabled: Boolean,
+    interactionSource: MutableInteractionSource,
+    onValueChange: (Float) -> Unit,
+    onValueChangeFinished: (() -> Unit)?,
+    steps: Int,
+    value: Float,
+    valueRange: ClosedFloatingPointRange<Float>,
+    thumb: @Composable (SliderPositions) -> Unit,
+    track: @Composable (SliderPositions) -> Unit
+) {
+    val onValueChangeState = rememberUpdatedState<(Float) -> Unit> {
+        if (it != value) {
+            onValueChange(it)
+        }
+    }
+
+    val tickFractions = remember(steps) {
+        stepsToTickFractions(steps)
+    }
+
+    val thumbWidth = remember { mutableStateOf(ThumbWidth.value) }
+    val totalWidth = remember { mutableStateOf(0) }
+
+    fun scaleToUserValue(minPx: Float, maxPx: Float, offset: Float) =
+        scale(minPx, maxPx, offset, valueRange.start, valueRange.endInclusive)
+
+    fun scaleToOffset(minPx: Float, maxPx: Float, userValue: Float) =
+        scale(valueRange.start, valueRange.endInclusive, userValue, minPx, maxPx)
+
+    val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
+    val rawOffset = remember { mutableStateOf(scaleToOffset(0f, 0f, value)) }
+    val pressOffset = remember { mutableStateOf(0f) }
+    val coerced = value.coerceIn(valueRange.start, valueRange.endInclusive)
+
+    val positionFraction = calcFraction(valueRange.start, valueRange.endInclusive, coerced)
+    val sliderPositions = remember { SliderPositions(positionFraction, tickFractions) }
+    sliderPositions.positionFraction = positionFraction
+    sliderPositions.tickFractions = tickFractions
+
+    val draggableState = remember(valueRange) {
+        SliderDraggableState {
+            val maxPx = max(totalWidth.value - thumbWidth.value / 2, 0f)
+            val minPx = min(thumbWidth.value / 2, maxPx)
+            rawOffset.value = (rawOffset.value + it + pressOffset.value)
+            pressOffset.value = 0f
+            val offsetInTrack = snapValueToTick(rawOffset.value, tickFractions, minPx, maxPx)
+            onValueChangeState.value.invoke(scaleToUserValue(minPx, maxPx, offsetInTrack))
+        }
+    }
+
+    val gestureEndAction = rememberUpdatedState {
+        if (!draggableState.isDragging) {
+            // check isDragging in case the change is still in progress (touch -> drag case)
+            onValueChangeFinished?.invoke()
+        }
+    }
+
+    val press = Modifier.sliderTapModifier(
+        draggableState,
+        interactionSource,
+        totalWidth.value,
+        isRtl,
+        rawOffset,
+        gestureEndAction,
+        pressOffset,
+        enabled
+    )
+
+    val drag = Modifier.draggable(
+        orientation = Orientation.Horizontal,
+        reverseDirection = isRtl,
+        enabled = enabled,
+        interactionSource = interactionSource,
+        onDragStopped = { _ -> gestureEndAction.value.invoke() },
+        startDragImmediately = draggableState.isDragging,
+        state = draggableState
+    )
+
+    Layout(
+        {
+            Box(modifier = Modifier.layoutId(SliderComponents.THUMB)) { thumb(sliderPositions) }
+            Box(modifier = Modifier.layoutId(SliderComponents.TRACK)) { track(sliderPositions) }
+        },
+        modifier = modifier
+            .minimumTouchTargetSize()
+            .sliderSemantics(
+                value,
+                enabled,
+                onValueChange,
+                onValueChangeFinished,
+                valueRange,
+                steps
+            )
+            .focusable(enabled, interactionSource)
+            .then(press)
+            .then(drag)
+    ) { measurables, constraints ->
+
+        val thumbPlaceable = measurables.first { it.layoutId == SliderComponents.THUMB }.measure(
+            constraints
+        )
+
+        val maxTrackWidth = max(constraints.minWidth, constraints.maxWidth - thumbPlaceable.width)
+        val trackPlaceable = measurables.first { it.layoutId == SliderComponents.TRACK }.measure(
+            constraints.copy(maxWidth = maxTrackWidth)
+        )
+
+        val sliderWidth = max(SliderTokens.HandleWidth.roundToPx(), constraints.maxWidth)
+        val sliderHeight = maxOf(
+            SliderTokens.HandleHeight.roundToPx(),
+            trackPlaceable.height,
+            thumbPlaceable.height
+        )
+
+        thumbWidth.value = thumbPlaceable.width.toFloat()
+        totalWidth.value = sliderWidth
+
+        val trackOffsetX = thumbPlaceable.width / 2
+        val thumbOffsetX = ((trackPlaceable.width) * positionFraction).roundToInt()
+        val trackOffsetY = sliderHeight / 2 - trackPlaceable.height / 2
+        val thumbOffsetY = sliderHeight / 2 - thumbPlaceable.height / 2
+
+        layout(
+            sliderWidth,
+            sliderHeight
+        ) {
+            trackPlaceable.placeRelative(
+                trackOffsetX,
+                trackOffsetY
+            )
+            thumbPlaceable.placeRelative(
+                thumbOffsetX,
+                thumbOffsetY
+            )
+        }
+    }
+}
+
+// TODO: Remove during b/242600007
+@Composable
+private fun BoxScope.TempRangeSliderThumb(
+    offset: Dp,
+    content: @Composable BoxScope.() -> Unit
+) {
+    Box(
+        Modifier
+            .padding(start = offset)
+            .align(Alignment.CenterStart),
+        content = content
+    )
+}
+
+// TODO: Remove during b/242600007
+@Composable
+private fun TempRangeSliderTrack(
     modifier: Modifier,
     colors: SliderColors,
     enabled: Boolean,
     positionFractionStart: Float,
     positionFractionEnd: Float,
-    tickFractions: List<Float>,
+    tickFractions: FloatArray,
     thumbWidth: Dp,
     trackStrokeWidth: Float
 ) {
@@ -737,7 +1014,7 @@
 
 private fun snapValueToTick(
     current: Float,
-    tickFractions: List<Float>,
+    tickFractions: FloatArray,
     minPx: Float,
     maxPx: Float
 ): Float {
@@ -761,8 +1038,8 @@
     return if (afterSlopResult != null) afterSlopResult to initialDelta else null
 }
 
-private fun stepsToTickFractions(steps: Int): List<Float> {
-    return if (steps == 0) emptyList() else List(steps + 2) { it.toFloat() / (steps + 1) }
+private fun stepsToTickFractions(steps: Int): FloatArray {
+    return if (steps == 0) floatArrayOf() else FloatArray(steps + 2) { it.toFloat() / (steps + 1) }
 }
 
 // Scale x1 from a1..b1 range to a2..b2 range
@@ -827,7 +1104,7 @@
 private fun Modifier.sliderTapModifier(
     draggableState: DraggableState,
     interactionSource: MutableInteractionSource,
-    maxPx: Float,
+    maxPx: Int,
     isRtl: Boolean,
     rawOffset: State<Float>,
     gestureEndAction: State<() -> Unit>,
@@ -1120,4 +1397,51 @@
     override fun dispatchRawDelta(delta: Float) {
         return onDelta(delta)
     }
+}
+
+private enum class SliderComponents {
+    THUMB,
+    TRACK
+}
+
+/**
+ * Class that holds information about [Slider]'s active track and fractional
+ * positions where the discrete ticks should be drawn on the track.
+ */
+@Stable
+@ExperimentalMaterial3Api
+class SliderPositions(
+    initialPositionFraction: Float,
+    initialTickFractions: FloatArray
+) {
+    /**
+     * [Float] within the range [0f, 1f] that indicates the current position of
+     * the thumb as a fraction of the entire track.
+     */
+    var positionFraction: Float by mutableStateOf(initialPositionFraction)
+        internal set
+
+    /**
+     * The discrete points where a tick should be drawn on the track.
+     * Each value of tickFractions should be within the range [0f, 1f]. If
+     * the track is continuous, then tickFractions will be an empty [FloatArray].
+     */
+    var tickFractions: FloatArray by mutableStateOf(initialTickFractions)
+        internal set
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is SliderPositions) return false
+
+        if (positionFraction != other.positionFraction) return false
+        if (!tickFractions.contentEquals(other.tickFractions)) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = positionFraction.hashCode()
+        result = 31 * result + tickFractions.contentHashCode()
+        return result
+    }
 }
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SafeDrawingInsets.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SystemBarsDefaultInsets.kt
similarity index 89%
rename from compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SafeDrawingInsets.kt
rename to compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SystemBarsDefaultInsets.kt
index 7d8aac1..0a3fcad 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SafeDrawingInsets.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SystemBarsDefaultInsets.kt
@@ -19,5 +19,5 @@
 import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.runtime.Composable
 
-internal expect val WindowInsets.Companion.safeDrawingForVisualComponents: WindowInsets
+internal expect val WindowInsets.Companion.systemBarsForVisualComponents: WindowInsets
     @Composable get
\ No newline at end of file
diff --git a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/SafeDrawingInsets.desktop.kt b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/SystemBarsDefaultInsets.desktop.kt
similarity index 90%
rename from compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/SafeDrawingInsets.desktop.kt
rename to compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/SystemBarsDefaultInsets.desktop.kt
index 8fa5fb2..fe5ca33 100644
--- a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/SafeDrawingInsets.desktop.kt
+++ b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/SystemBarsDefaultInsets.desktop.kt
@@ -20,6 +20,6 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.runtime.Composable
 
-internal actual val WindowInsets.Companion.safeDrawingForVisualComponents: WindowInsets
+internal actual val WindowInsets.Companion.systemBarsForVisualComponents: WindowInsets
     @Composable
     get() = WindowInsets(0.dp, 0.dp, 0.dp, 0.dp)
\ No newline at end of file
diff --git a/compose/runtime/runtime-tracing/OWNERS b/compose/runtime/runtime-tracing/OWNERS
new file mode 100644
index 0000000..0c9265f
--- /dev/null
+++ b/compose/runtime/runtime-tracing/OWNERS
@@ -0,0 +1,4 @@
+# Bug component: 873508
+ccraik@google.com
+jgielzak@google.com
+rahulrav@google.com
diff --git a/compose/runtime/runtime-tracing/build.gradle b/compose/runtime/runtime-tracing/build.gradle
index c12bfd6..5977424 100644
--- a/compose/runtime/runtime-tracing/build.gradle
+++ b/compose/runtime/runtime-tracing/build.gradle
@@ -42,12 +42,6 @@
     androidTestImplementation(libs.truth)
 }
 
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
-    }
-}
-
 androidx {
     name = "Compose Runtime: Tracing"
     publish = Publish.SNAPSHOT_AND_RELEASE
diff --git a/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/LiveEditApiTests.kt b/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/LiveEditApiTests.kt
index 3e04f55..549814d 100644
--- a/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/LiveEditApiTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/LiveEditApiTests.kt
@@ -392,6 +392,36 @@
             assertThat(errors).hasSize(0)
         }
     }
+
+    @Test
+    @MediumTest
+    fun throwErrorOnReload_recoversAfterInvalidate() {
+        var shouldThrow = false
+        activity.show {
+            TestError { shouldThrow }
+        }
+
+        activity.waitForAFrame()
+
+        run {
+            shouldThrow = true
+            simulateHotReload(Unit)
+
+            val start = errorInvoked
+            var errors = compositionErrors()
+            assertThat(errors).hasSize(1)
+            assertThat(errors[0].first.message).isEqualTo("Test crash!")
+            assertThat(errors[0].second).isEqualTo(true)
+
+            shouldThrow = false
+            invalidateGroup(errorKey)
+
+            assertTrue("TestError should be invoked!", errorInvoked > start)
+
+            errors = compositionErrors()
+            assertThat(errors).hasSize(0)
+        }
+    }
 }
 
 const val someFunctionKey = -1580285603 // Extracted from .class file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
index 4e06f54..bc62e6c 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
@@ -1485,7 +1485,7 @@
         return if (!forceRecomposeScopes) {
             forceRecomposeScopes = true
             forciblyRecompose = true
-             true
+            true
         } else {
             false
         }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
index c4b90f1..725fb0d 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
@@ -261,6 +261,7 @@
         mutableMapOf<MovableContent<Any?>, MutableList<MovableContentStateReference>>()
     private val compositionValueStatesAvailable =
         mutableMapOf<MovableContentStateReference, MovableContentState>()
+    private var failedCompositions: MutableList<ControlledComposition>? = null
     private var workContinuation: CancellableContinuation<Unit>? = null
     private var concurrentCompositionsOutstanding = 0
     private var isClosed: Boolean = false
@@ -280,8 +281,10 @@
             compositionInvalidations.clear()
             compositionsAwaitingApply.clear()
             compositionValuesAwaitingInsert.clear()
+            failedCompositions = null
             workContinuation?.cancel()
             workContinuation = null
+            errorState = null
             return null
         }
 
@@ -362,8 +365,11 @@
                 .fastMap { HotReloadable(it).apply { clearContent() } }
         }
 
-        fun getAndResetErrorState(): RecomposerErrorState? =
-            this@Recomposer.getAndResetErrorState()
+        fun resetErrorState(): RecomposerErrorState? =
+            this@Recomposer.resetErrorState()
+
+        fun retryFailedCompositions() =
+            this@Recomposer.retryFailedCompositions()
     }
 
     private class HotReloadable(
@@ -380,19 +386,14 @@
             composition.composable = composable
         }
 
-        fun recompose(rootOnly: Boolean = true) {
-            if (rootOnly) {
-                if (composition.isRoot) {
-                    composition.setContent(composable)
-                }
-            } else {
+        fun recompose() {
+            if (composition.isRoot) {
                 composition.setContent(composable)
             }
         }
     }
 
     private class RecomposerErrorState(
-        val failedInitialComposition: HotReloadable?,
         override val recoverable: Boolean,
         override val cause: Exception
     ) : RecomposerErrorInfo
@@ -647,13 +648,22 @@
                 compositionValueStatesAvailable.clear()
 
                 errorState = RecomposerErrorState(
-                    failedInitialComposition = (failedInitialComposition as? CompositionImpl)?.let {
-                        HotReloadable(it)
-                    },
                     recoverable = recoverable,
                     cause = e
                 )
 
+                if (failedInitialComposition != null) {
+                    val failedCompositions = failedCompositions
+                        ?: mutableListOf<ControlledComposition>().also {
+                            failedCompositions = it
+                        }
+
+                    if (failedInitialComposition !in failedCompositions) {
+                        failedCompositions += failedInitialComposition
+                    }
+                    knownCompositions -= failedInitialComposition
+                }
+
                 deriveStateLocked()
             }
         } else {
@@ -661,7 +671,7 @@
         }
     }
 
-    private fun getAndResetErrorState(): RecomposerErrorState? {
+    private fun resetErrorState(): RecomposerErrorState? {
         val errorState = synchronized(stateLock) {
             val error = errorState
             if (error != null) {
@@ -673,6 +683,22 @@
         return errorState
     }
 
+    private fun retryFailedCompositions() {
+        synchronized(stateLock) {
+            val failedCompositions = failedCompositions ?: return
+
+            while (failedCompositions.isNotEmpty()) {
+                val composition = failedCompositions.removeLast()
+                if (composition !is CompositionImpl) continue
+
+                composition.invalidateAll()
+                composition.setContent(composition.composable)
+
+                if (errorState != null) break
+            }
+        }
+    }
+
     /**
      * Await the invalidation of any associated [Composer]s, recompose them, and apply their
      * changes to their associated [Composition]s if recomposition is successful.
@@ -945,9 +971,6 @@
             performInitialMovableContentInserts(composition)
         } catch (e: Exception) {
             processCompositionError(e, composition, recoverable = true)
-            synchronized(stateLock) {
-                knownCompositions -= composition
-            }
             return
         }
 
@@ -1250,8 +1273,8 @@
             // to ensure that we pause recompositions before this call.
             _hotReloadEnabled.set(true)
 
-            val errorStates = _runningRecomposers.value.map {
-                it.getAndResetErrorState()
+            _runningRecomposers.value.forEach {
+                it.resetErrorState()
             }
 
             @Suppress("UNCHECKED_CAST")
@@ -1259,11 +1282,8 @@
             holders.fastForEach { it.resetContent() }
             holders.fastForEach { it.recompose() }
 
-            errorStates.fastForEach {
-                 it?.failedInitialComposition?.let { c ->
-                     c.resetContent()
-                     c.recompose(rootOnly = false)
-                 }
+            _runningRecomposers.value.forEach {
+                it.retryFailedCompositions()
             }
         }
 
@@ -1274,14 +1294,11 @@
                     return@forEach
                 }
 
-                val errorState = it.getAndResetErrorState()
+                it.resetErrorState()
 
                 it.invalidateGroupsWithKey(key)
 
-                errorState?.failedInitialComposition?.let { c ->
-                    c.resetContent()
-                    c.recompose(rootOnly = false)
-                }
+                it.retryFailedCompositions()
             }
         }
 
@@ -1292,7 +1309,7 @@
 
         internal fun clearErrors() {
             _runningRecomposers.value.mapNotNull {
-                it.getAndResetErrorState()
+                it.resetErrorState()
             }
         }
     }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt
index c5a0450..612736f 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt
@@ -298,8 +298,8 @@
      * which we know will no longer have the same structure so we want to remove them before
      * recomposing.
      *
-     * Returns true if all the groups were successfully invalidated. If this returns fals then
-     * the a full composition must be foreced.
+     * Returns a list of groups if they were successfully invalidated. If this returns null then
+     * a full composition must be forced.
      */
     internal fun invalidateGroupsWithKey(target: Int): List<RecomposeScopeImpl>? {
         val anchors = mutableListOf<Anchor>()
@@ -939,7 +939,7 @@
      *  Skip a group. Must be called at the start of a group.
      */
     fun skipGroup(): Int {
-        require(emptyCount == 0) { "Cannot skip while in an empty region" }
+        runtimeCheck(emptyCount == 0) { "Cannot skip while in an empty region" }
         val count = if (groups.isNode(currentGroup)) 1 else groups.nodeCount(currentGroup)
         currentGroup += groups.groupSize(currentGroup)
         return count
@@ -949,7 +949,7 @@
      * Skip to the end of the current group.
      */
     fun skipToGroupEnd() {
-        require(emptyCount == 0) { "Cannot skip the enclosing group while in an empty region" }
+        runtimeCheck(emptyCount == 0) { "Cannot skip the enclosing group while in an empty region" }
         currentGroup = currentEnd
     }
 
@@ -957,7 +957,7 @@
      * Reposition the read to the group at [index].
      */
     fun reposition(index: Int) {
-        require(emptyCount == 0) { "Cannot reposition while in an empty region" }
+        runtimeCheck(emptyCount == 0) { "Cannot reposition while in an empty region" }
         currentGroup = index
         val parent = if (index < groupsSize) groups.parentAnchor(index) else -1
         this.parent = parent
@@ -976,7 +976,7 @@
         val newCurrentEnd = index + groups.groupSize(index)
         val current = currentGroup
         @Suppress("ConvertTwoComparisonsToRangeCheck")
-        require(current >= index && current <= newCurrentEnd) {
+        runtimeCheck(current >= index && current <= newCurrentEnd) {
             "Index $index is not a parent of $current"
         }
         this.parent = index
@@ -990,7 +990,9 @@
      */
     fun endGroup() {
         if (emptyCount == 0) {
-            require(currentGroup == currentEnd) { "endGroup() not called at the end of a group" }
+            runtimeCheck(currentGroup == currentEnd) {
+                "endGroup() not called at the end of a group"
+            }
             val parent = groups.parentAnchor(parent)
             this.parent = parent
             currentEnd = if (parent < 0)
@@ -1476,7 +1478,7 @@
      * currently started [parent].
      */
     fun advanceBy(amount: Int) {
-        require(amount >= 0) { "Cannot seek backwards" }
+        runtimeCheck(amount >= 0) { "Cannot seek backwards" }
         check(insertCount <= 0) { "Cannot call seek() while inserting" }
         if (amount == 0) return
         val index = currentGroup + amount
@@ -1532,7 +1534,7 @@
      * Enter the group at current without changing it. Requires not currently inserting.
      */
     fun startGroup() {
-        require(insertCount == 0) { "Key must be supplied when inserting" }
+        runtimeCheck(insertCount == 0) { "Key must be supplied when inserting" }
         startGroup(key = 0, objectKey = Composer.Empty, isNode = false, aux = Composer.Empty)
     }
 
@@ -1657,7 +1659,7 @@
             nodeCount = nodeCountStack.pop() + if (isNode) 1 else newNodes
             parent = groups.parent(groupIndex)
         } else {
-            require(currentGroup == currentGroupEnd) {
+            runtimeCheck(currentGroup == currentGroupEnd) {
                 "Expected to be at the end of a group"
             }
             // Update group length
@@ -1733,12 +1735,12 @@
      * group is reached.
      */
     fun ensureStarted(index: Int) {
-        require(insertCount <= 0) { "Cannot call ensureStarted() while inserting" }
+        runtimeCheck(insertCount <= 0) { "Cannot call ensureStarted() while inserting" }
         val parent = parent
         if (parent != index) {
             // The new parent a child of the current group.
             @Suppress("ConvertTwoComparisonsToRangeCheck")
-            require(index >= parent && index < currentGroupEnd) {
+            runtimeCheck(index >= parent && index < currentGroupEnd) {
                 "Started group at $index must be a subgroup of the group at $parent"
             }
 
@@ -1770,7 +1772,7 @@
      * Remove the current group. Returns if any anchors were in the group removed.
      */
     fun removeGroup(): Boolean {
-        require(insertCount == 0) { "Cannot remove group while inserting" }
+        runtimeCheck(insertCount == 0) { "Cannot remove group while inserting" }
         val oldGroup = currentGroup
         val oldSlot = currentSlot
         val count = skipGroup()
@@ -1813,8 +1815,8 @@
      * number of groups after the [currentGroup] left in the [parent] group.
      */
     fun moveGroup(offset: Int) {
-        require(insertCount == 0) { "Cannot move a group while inserting" }
-        require(offset >= 0) { "Parameter offset is out of bounds" }
+        runtimeCheck(insertCount == 0) { "Cannot move a group while inserting" }
+        runtimeCheck(offset >= 0) { "Parameter offset is out of bounds" }
         if (offset == 0) return
         val current = currentGroup
         val parent = parent
@@ -1827,7 +1829,7 @@
             groupToMove += groups.groupSize(
                 address = groupIndexToAddress(groupToMove)
             )
-            require(groupToMove <= parentEnd) { "Parameter offset is out of bounds" }
+            runtimeCheck(groupToMove <= parentEnd) { "Parameter offset is out of bounds" }
             count--
         }
 
@@ -2104,12 +2106,12 @@
      * This requires [writer] be inserting and this writer to not be inserting.
      */
     fun moveTo(anchor: Anchor, offset: Int, writer: SlotWriter): List<Anchor> {
-        require(writer.insertCount > 0)
-        require(insertCount == 0)
-        require(anchor.valid)
+        runtimeCheck(writer.insertCount > 0)
+        runtimeCheck(insertCount == 0)
+        runtimeCheck(anchor.valid)
         val location = anchorIndex(anchor) + offset
         val currentGroup = currentGroup
-        require(location in currentGroup until currentGroupEnd)
+        runtimeCheck(location in currentGroup until currentGroupEnd)
         val parent = parent(location)
         val size = groupSize(location)
         val nodes = if (isNode(location)) 1 else nodeCount(location)
@@ -2154,7 +2156,7 @@
      * @return a list of the anchors that were moved
      */
     fun moveFrom(table: SlotTable, index: Int): List<Anchor> {
-        require(insertCount > 0)
+        runtimeCheck(insertCount > 0)
 
         if (index == 0 && currentGroup == 0 && this.table.groupsSize == 0) {
             // Special case for moving the entire slot table into an empty table. This case occurs
@@ -3218,7 +3220,7 @@
 
 private fun IntArray.updateNodeCount(address: Int, value: Int) {
     @Suppress("ConvertTwoComparisonsToRangeCheck")
-    require(value >= 0 && value < NodeCount_Mask)
+    runtimeCheck(value >= 0 && value < NodeCount_Mask)
     this[address * Group_Fields_Size + GroupInfo_Offset] =
         (this[address * Group_Fields_Size + GroupInfo_Offset] and NodeCount_Mask.inv()) or value
 }
@@ -3241,7 +3243,7 @@
 // Slot count access
 private fun IntArray.groupSize(address: Int) = this[address * Group_Fields_Size + Size_Offset]
 private fun IntArray.updateGroupSize(address: Int, value: Int) {
-    require(value >= 0)
+    runtimeCheck(value >= 0)
     this[address * Group_Fields_Size + Size_Offset] = value
 }
 
diff --git a/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/LiveEditTests.kt b/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/LiveEditTests.kt
index 3e2426c..dcb954f 100644
--- a/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/LiveEditTests.kt
+++ b/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/LiveEditTests.kt
@@ -34,7 +34,7 @@
     @After
     fun tearDown() {
         clearCompositionErrors()
-        Recomposer.setHotReloadEnabled(true)
+        Recomposer.setHotReloadEnabled(false)
     }
 
     @Test
diff --git a/compose/ui/ui-inspection/build.gradle b/compose/ui/ui-inspection/build.gradle
index d85ef1c..8146736 100644
--- a/compose/ui/ui-inspection/build.gradle
+++ b/compose/ui/ui-inspection/build.gradle
@@ -95,7 +95,6 @@
 tasks.withType(KotlinCompile).configureEach {
     kotlinOptions {
         freeCompilerArgs += [
-                "-opt-in=kotlin.RequiresOptIn",
                 "-P", "plugin:androidx.compose.compiler.plugins.kotlin:sourceInformation=true"
         ]
     }
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ComposeViewTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ComposeViewTest.kt
index 9f6366a..a6321c17 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ComposeViewTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ComposeViewTest.kt
@@ -20,7 +20,7 @@
 import androidx.compose.ui.inspection.rules.sendCommand
 import androidx.compose.ui.inspection.testdata.ComposeViewTestActivity
 import androidx.compose.ui.inspection.util.GetComposablesCommand
-import androidx.compose.ui.inspection.util.GetParametersCommand
+import androidx.compose.ui.inspection.util.GetParametersByIdCommand
 import androidx.compose.ui.inspection.util.flatten
 import androidx.compose.ui.inspection.util.toMap
 import androidx.test.filters.LargeTest
@@ -59,7 +59,7 @@
     private val ComposableNode.textParameter: String?
         get() = runBlocking {
             val params = rule.inspectorTester.sendCommand(
-                GetParametersCommand(
+                GetParametersByIdCommand(
                     rule.rootId,
                     skipSystemComposables = false,
                     composableId = id
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ParametersTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ParametersTest.kt
index c68924c..4e4932e 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ParametersTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ParametersTest.kt
@@ -23,6 +23,7 @@
 import androidx.compose.ui.inspection.util.GetParameterDetailsCommand
 import androidx.compose.ui.inspection.util.GetParametersByAnchorIdCommand
 import androidx.compose.ui.inspection.util.GetParametersCommand
+import androidx.compose.ui.inspection.util.GetParametersByIdCommand
 import androidx.compose.ui.inspection.util.GetUpdateSettingsCommand
 import androidx.compose.ui.inspection.util.flatten
 import androidx.compose.ui.inspection.util.toMap
@@ -48,7 +49,8 @@
             .getComposablesResponse
 
         val text = composables.filter("Text").first()
-        val params = rule.inspectorTester.sendCommand(GetParametersCommand(rule.rootId, text.id))
+        val params = rule.inspectorTester
+            .sendCommand(GetParametersByIdCommand(rule.rootId, text.id))
             .getParametersResponse
 
         val resourceValue = params.find("fontFamily").resourceValue
@@ -65,13 +67,14 @@
 
         val buttons = composables.filter("Button")
         val buttonId = buttons.first().id
-        val params = rule.inspectorTester.sendCommand(GetParametersCommand(rule.rootId, buttonId))
+        val params = rule.inspectorTester
+            .sendCommand(GetParametersByIdCommand(rule.rootId, buttonId))
             .getParametersResponse
 
         val lambdaValue = params.find("onClick").lambdaValue
         assertThat(lambdaValue.fileName.resolve(params)).isEqualTo("ParametersTestActivity.kt")
-        assertThat(lambdaValue.startLineNumber).isEqualTo(52)
-        assertThat(lambdaValue.endLineNumber).isEqualTo(52)
+        assertThat(lambdaValue.startLineNumber).isEqualTo(53)
+        assertThat(lambdaValue.endLineNumber).isEqualTo(53)
         assertThat(lambdaValue.packageName.resolve(params))
             .isEqualTo("androidx.compose.ui.inspection.testdata")
     }
@@ -83,13 +86,13 @@
 
         val buttons = composables.filter("SomeContent")
         val someId = buttons.single().id
-        val params = rule.inspectorTester.sendCommand(GetParametersCommand(rule.rootId, someId))
+        val params = rule.inspectorTester.sendCommand(GetParametersByIdCommand(rule.rootId, someId))
             .getParametersResponse
 
         val lambdaValue = params.find("content").lambdaValue
         assertThat(lambdaValue.fileName.resolve(params)).isEqualTo("ParametersTestActivity.kt")
-        assertThat(lambdaValue.startLineNumber).isEqualTo(61)
-        assertThat(lambdaValue.endLineNumber).isEqualTo(64)
+        assertThat(lambdaValue.startLineNumber).isEqualTo(62)
+        assertThat(lambdaValue.endLineNumber).isEqualTo(65)
         assertThat(lambdaValue.packageName.resolve(params))
             .isEqualTo("androidx.compose.ui.inspection.testdata")
     }
@@ -101,13 +104,14 @@
 
         val buttons = composables.filter("Button")
         val buttonId = buttons.last().id
-        val params = rule.inspectorTester.sendCommand(GetParametersCommand(rule.rootId, buttonId))
+        val params = rule.inspectorTester
+            .sendCommand(GetParametersByIdCommand(rule.rootId, buttonId))
             .getParametersResponse
 
         val lambdaValue = params.find("onClick").lambdaValue
         assertThat(lambdaValue.fileName.resolve(params)).isEqualTo("ParametersTestActivity.kt")
-        assertThat(lambdaValue.startLineNumber).isEqualTo(55)
-        assertThat(lambdaValue.endLineNumber).isEqualTo(55)
+        assertThat(lambdaValue.startLineNumber).isEqualTo(56)
+        assertThat(lambdaValue.endLineNumber).isEqualTo(56)
         assertThat(lambdaValue.functionName.resolve(params)).isEqualTo("testClickHandler")
         assertThat(lambdaValue.packageName.resolve(params))
             .isEqualTo("androidx.compose.ui.inspection.testdata")
@@ -120,22 +124,15 @@
     fun testIntArrayWithDelayedExtraction() = intArray(useDelayedParameterExtraction = true)
 
     private fun intArray(useDelayedParameterExtraction: Boolean): Unit = runBlocking {
-        if (useDelayedParameterExtraction) {
-            val updated = rule.inspectorTester.sendCommand(
-                GetUpdateSettingsCommand(delayParameterExtractions = true)
-            ).updateSettingsResponse
-            assertThat(updated.canDelayParameterExtractions).isTrue()
-        }
+        setUpDelayedExtraction(useDelayedParameterExtraction)
 
         val tester = rule.inspectorTester
         val nodes = tester.sendCommand(GetComposablesCommand(rule.rootId)).getComposablesResponse
 
         val function = nodes.filter("FunctionWithIntArray").single()
-        val paramResponse = if (useDelayedParameterExtraction) {
-            tester.sendCommand(GetParametersByAnchorIdCommand(rule.rootId, function.anchorHash))
-        } else {
-            tester.sendCommand(GetParametersCommand(rule.rootId, function.id))
-        }
+        val paramResponse = tester.sendCommand(
+            GetParametersCommand(rule.rootId, function, useDelayedParameterExtraction)
+        )
         val params = paramResponse.getParametersResponse
 
         val intArray = params.find("intArray")
@@ -176,14 +173,24 @@
     }
 
     @Test
-    fun unmergedSemantics(): Unit = runBlocking {
+    fun testUnmergedSemanticsWithoutDelayedExtraction() =
+        unmergedSemantics(useDelayedParameterExtraction = false)
+
+    @Test
+    fun testUnmergedSemanticsWithDelayedExtraction() =
+        unmergedSemantics(useDelayedParameterExtraction = true)
+
+    private fun unmergedSemantics(useDelayedParameterExtraction: Boolean): Unit = runBlocking {
+        setUpDelayedExtraction(useDelayedParameterExtraction)
+
         val composables = rule.inspectorTester.sendCommand(GetComposablesCommand(rule.rootId))
             .getComposablesResponse
 
         val texts = composables.filter("Text")
-        val textOne = texts.first().id
-        val params = rule.inspectorTester.sendCommand(GetParametersCommand(rule.rootId, textOne))
-            .getParametersResponse
+        val textOne = texts.first()
+        val params = rule.inspectorTester.sendCommand(
+            GetParametersCommand(rule.rootId, textOne, useDelayedParameterExtraction)
+        ).getParametersResponse
 
         val text = params.findUnmerged("Text")
         assertThat(text.type).isEqualTo(Parameter.Type.ITERABLE)
@@ -196,14 +203,23 @@
     }
 
     @Test
-    fun mergedSemantics(): Unit = runBlocking {
+    fun testMergedSemanticsWithoutDelayedExtraction() =
+        mergedSemantics(useDelayedParameterExtraction = false)
+
+    @Test
+    fun testMergedSemanticsWithDelayedExtraction() =
+        mergedSemantics(useDelayedParameterExtraction = true)
+
+    private fun mergedSemantics(useDelayedParameterExtraction: Boolean): Unit = runBlocking {
+        setUpDelayedExtraction(useDelayedParameterExtraction)
+
         val composables = rule.inspectorTester.sendCommand(GetComposablesCommand(rule.rootId))
             .getComposablesResponse
 
-        val texts = composables.filter("Column")
-        val id = texts.first().id
-        val params = rule.inspectorTester.sendCommand(GetParametersCommand(rule.rootId, id))
-            .getParametersResponse
+        val textFirst = composables.filter("Column").first()
+        val params = rule.inspectorTester.sendCommand(
+            GetParametersCommand(rule.rootId, textFirst, useDelayedParameterExtraction)
+        ).getParametersResponse
 
         val text = params.findMerged("Text")
         val strings = params.stringsList
@@ -218,14 +234,45 @@
         assertThat(strings.toMap()[second.int32Value]).isEqualTo("four")
         assertThat(strings.toMap()[third.int32Value]).isEqualTo("five")
         assertThat(text.elementsList.size).isEqualTo(3)
+
+        val row = composables.filter("Row").single()
+        val params2 = rule.inspectorTester.sendCommand(
+            GetParametersCommand(rule.rootId, row, useDelayedParameterExtraction)
+        ).getParametersResponse
+
+        val texts2 = params2.findMerged("Text")
+        val strings2 = params2.stringsList
+
+        checkStringParam(strings2, texts2, "Text", "List[8]", 0)
+        assertThat(texts2.elementsCount).isEqualTo(5)
+        checkStringParam(strings2, texts2.elementsList[0], "[0]", "Text1", 0)
+        checkStringParam(strings2, texts2.elementsList[1], "[1]", "Text2", 1)
+        checkStringParam(strings2, texts2.elementsList[2], "[2]", "Text3", 2)
+        checkStringParam(strings2, texts2.elementsList[3], "[3]", "Text4", 3)
+        checkStringParam(strings2, texts2.elementsList[4], "[4]", "Text5", 4)
+
+        val reference = texts2.reference.toBuilder()
+        val expanded =
+            rule.inspectorTester.sendCommand(
+                GetParameterDetailsCommand(
+                    rule.rootId,
+                    reference.build(),
+                    startIndex = 5,
+                    maxElements = 5
+                )
+            ).getParameterDetailsResponse
+        val texts3 = expanded.parameter
+        val strings3 = expanded.stringsList
+        checkStringParam(strings3, texts3, "Text", "List[8]", 0)
+        assertThat(texts3.elementsCount).isEqualTo(3)
+        checkStringParam(strings3, texts3.elementsList[0], "[5]", "Text6", 5)
+        checkStringParam(strings3, texts3.elementsList[1], "[6]", "Text7", 6)
+        checkStringParam(strings3, texts3.elementsList[2], "[7]", "Text8", 7)
     }
 
     @Test
     fun delayedExtraction(): Unit = runBlocking {
-        val updated = rule.inspectorTester.sendCommand(
-            GetUpdateSettingsCommand(delayParameterExtractions = true)
-        ).updateSettingsResponse
-        assertThat(updated.canDelayParameterExtractions).isTrue()
+        setUpDelayedExtraction(true)
 
         val composables = rule.inspectorTester.sendCommand(GetComposablesCommand(rule.rootId))
             .getComposablesResponse
@@ -234,7 +281,7 @@
         var text = column.childrenList.single { strings[it.name] == "Text" }
 
         var paramsById = rule.inspectorTester.sendCommand(
-            GetParametersCommand(rule.rootId, text.id)
+            GetParametersByIdCommand(rule.rootId, text.id)
         ).getParametersResponse
         // We are using delayed parameter extractions so the cache does not have parameters
         // (The code should look for an anchor but the anchor is not specified.)
@@ -242,7 +289,7 @@
 
         // But looking up by anchor will find the parameters
         var paramsByAnchor = rule.inspectorTester.sendCommand(
-            GetParametersByAnchorIdCommand(rule.rootId, text.anchorHash)
+            GetParametersByAnchorIdCommand(rule.rootId, text.anchorHash, text.id)
         ).getParametersResponse
         strings = paramsByAnchor.stringsList.toMap()
         assertThat(paramsByAnchor.parameterGroup.parameterList).isNotEmpty()
@@ -257,7 +304,7 @@
         text = column.childrenList.single { strings[it.name] == "Text" }
 
         paramsById = rule.inspectorTester.sendCommand(
-            GetParametersCommand(rule.rootId, text.id)
+            GetParametersByIdCommand(rule.rootId, text.id)
         ).getParametersResponse
         // Even when using delayed parameter extractions, use the cache if it contains all params:
         strings = paramsById.stringsList.toMap()
@@ -265,12 +312,21 @@
         textValue = paramsById.find("text")
         assertThat(strings[textValue.int32Value]).isEqualTo("four")
 
-        // Looking up by anchor should not find parameters
-        // (The code should use the cached values but the id is not specified.)
+        // Looking up by anchor should find the parameters
+        // (The code should use the cached values.)
         paramsByAnchor = rule.inspectorTester.sendCommand(
-            GetParametersByAnchorIdCommand(rule.rootId, text.anchorHash)
+            GetParametersByAnchorIdCommand(rule.rootId, text.anchorHash, text.id)
         ).getParametersResponse
-        assertThat(paramsByAnchor.parameterGroup.parameterList).isEmpty()
+        assertThat(paramsByAnchor.parameterGroup.parameterList).isNotEmpty()
+    }
+
+    private suspend fun setUpDelayedExtraction(useDelayedParameterExtraction: Boolean) {
+        if (useDelayedParameterExtraction) {
+            val updated = rule.inspectorTester.sendCommand(
+                GetUpdateSettingsCommand(delayParameterExtractions = true)
+            ).updateSettingsResponse
+            assertThat(updated.canDelayParameterExtractions).isTrue()
+        }
     }
 }
 
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/ParametersTestActivity.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/ParametersTestActivity.kt
index 2de2411..282d0a1 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/ParametersTestActivity.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/ParametersTestActivity.kt
@@ -20,6 +20,7 @@
 import androidx.activity.ComponentActivity
 import androidx.activity.compose.setContent
 import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
 import androidx.compose.material.Button
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
@@ -62,6 +63,16 @@
                         Text("five")
                     }
                 }
+                Row(modifier = Modifier.semantics(true) {}) {
+                    Text("Text1")
+                    Text("Text2")
+                    Text("Text3")
+                    Text("Text4")
+                    Text("Text5")
+                    Text("Text6")
+                    Text("Text7")
+                    Text("Text8")
+                }
             }
         }
     }
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/util/ProtoExtensions.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/util/ProtoExtensions.kt
index c11d2c8..528b4c1 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/util/ProtoExtensions.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/util/ProtoExtensions.kt
@@ -30,6 +30,17 @@
 
 fun GetParametersCommand(
     rootViewId: Long,
+    node: ComposableNode,
+    useDelayedParameterExtraction: Boolean,
+    skipSystemComposables: Boolean = true
+): Command = if (useDelayedParameterExtraction) {
+    GetParametersByAnchorIdCommand(rootViewId, node.anchorHash, node.id, skipSystemComposables)
+} else {
+    GetParametersByIdCommand(rootViewId, node.id, skipSystemComposables)
+}
+
+fun GetParametersByIdCommand(
+    rootViewId: Long,
     composableId: Long,
     skipSystemComposables: Boolean = true
 ): Command = Command.newBuilder().apply {
@@ -43,11 +54,13 @@
 fun GetParametersByAnchorIdCommand(
     rootViewId: Long,
     anchorId: Int,
+    composableId: Long,
     skipSystemComposables: Boolean = true
 ): Command = Command.newBuilder().apply {
     getParametersCommand = GetParametersCommand.newBuilder().apply {
         this.rootViewId = rootViewId
         this.anchorHash = anchorId
+        this.composableId = composableId
         this.skipSystemComposables = skipSystemComposables
     }.build()
 }.build()
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/ComposeLayoutInspector.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/ComposeLayoutInspector.kt
index 02720a2..ad027c5 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/ComposeLayoutInspector.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/ComposeLayoutInspector.kt
@@ -176,7 +176,6 @@
         getParametersCommand: GetParametersCommand,
         callback: CommandCallback
     ) {
-
         val foundComposable = if (delayParameterExtractions && !cachedHasAllParameters) {
             getComposableFromAnchor(getParametersCommand.anchorHash)
         } else {
@@ -187,12 +186,16 @@
                 getParametersCommand.generation
             )?.lookup?.get(getParametersCommand.composableId)
         }
+        val semanticsNode = getCachedComposableNodes(
+            getParametersCommand.rootViewId
+        )?.lookup?.get(getParametersCommand.composableId)
 
         callback.reply {
             getParametersResponse = if (foundComposable != null) {
                 val stringTable = StringTable()
                 GetParametersResponse.newBuilder().apply {
                     parameterGroup = foundComposable.convertToParameterGroup(
+                        semanticsNode ?: foundComposable,
                         layoutInspectorTree,
                         getParametersCommand.rootViewId,
                         getParametersCommand.maxRecursions.orElse(MAX_RECURSIONS),
@@ -223,6 +226,7 @@
             val stringTable = StringTable()
             val parameterGroups = allComposables.map { composable ->
                 composable.convertToParameterGroup(
+                    composable,
                     layoutInspectorTree,
                     getAllParametersCommand.rootViewId,
                     getAllParametersCommand.maxRecursions.orElse(MAX_RECURSIONS),
@@ -260,10 +264,13 @@
                 getParameterDetailsCommand.generation
             )?.lookup?.get(reference.nodeId)
         }
+        val semanticsNode = getCachedComposableNodes(
+            getParameterDetailsCommand.rootViewId
+        )?.lookup?.get(getParameterDetailsCommand.reference.composableId)
         val expanded = foundComposable?.let { composable ->
             layoutInspectorTree.expandParameter(
                 getParameterDetailsCommand.rootViewId,
-                composable,
+                semanticsNode ?: composable,
                 reference,
                 getParameterDetailsCommand.startIndex,
                 getParameterDetailsCommand.maxElements,
@@ -347,6 +354,12 @@
     }
 
     /**
+     * Return the cached [InspectorNode]s found under the layout tree rooted by [rootViewId].
+     */
+    private fun getCachedComposableNodes(rootViewId: Long): CacheData? =
+      cachedNodes[rootViewId]
+
+    /**
      * Find an [InspectorNode] with extracted parameters that represent the composable with the
      * specified anchor hash.
      */
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/ComposeExtensions.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/ComposeExtensions.kt
index 173dd2a..c6e0cae 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/ComposeExtensions.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/ComposeExtensions.kt
@@ -32,6 +32,7 @@
  * Convert parameters and semantics from [InspectorNode] into a [ParameterGroup].
  */
 fun InspectorNode.convertToParameterGroup(
+    semanticsNode: InspectorNode,
     layoutInspectorTree: LayoutInspectorTree,
     rootId: Long,
     maxRecursions: Int,
@@ -45,12 +46,12 @@
         ).convertAll(stringTable)
     )
     addAllMergedSemantics(
-        convertParameters(
+        semanticsNode.convertParameters(
             layoutInspectorTree, MergedSemantics, rootId, maxRecursions, maxInitialIterableSize
         ).convertAll(stringTable)
     )
     addAllUnmergedSemantics(
-        convertParameters(
+        semanticsNode.convertParameters(
             layoutInspectorTree, UnmergedSemantics, rootId, maxRecursions, maxInitialIterableSize
         ).convertAll(stringTable)
     )
diff --git a/compose/ui/ui-text/api/public_plus_experimental_1.3.0-beta02.txt b/compose/ui/ui-text/api/public_plus_experimental_1.3.0-beta02.txt
index cde0c73..0e0b313 100644
--- a/compose/ui/ui-text/api/public_plus_experimental_1.3.0-beta02.txt
+++ b/compose/ui/ui-text/api/public_plus_experimental_1.3.0-beta02.txt
@@ -464,7 +464,7 @@
 
   @androidx.compose.runtime.Immutable @androidx.compose.ui.text.ExperimentalTextApi public final class TextMeasurer {
     ctor public TextMeasurer(androidx.compose.ui.text.font.FontFamily.Resolver fallbackFontFamilyResolver, androidx.compose.ui.unit.Density fallbackDensity, androidx.compose.ui.unit.LayoutDirection fallbackLayoutDirection, optional int cacheSize);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextLayoutResult measure(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional long size, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, optional boolean skipCache);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextLayoutResult measure(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional long constraints, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, optional boolean skipCache);
   }
 
   public final class TextMeasurerKt {
@@ -476,8 +476,8 @@
   }
 
   public final class TextPainterKt {
-    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, androidx.compose.ui.text.AnnotatedString text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional long size);
-    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, String text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional long size);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, androidx.compose.ui.text.AnnotatedString text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional long maxSize);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, String text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional long maxSize);
     method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextLayoutResult textLayoutResult, optional long color, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration);
     method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextLayoutResult textLayoutResult, androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration);
   }
diff --git a/compose/ui/ui-text/api/public_plus_experimental_current.txt b/compose/ui/ui-text/api/public_plus_experimental_current.txt
index cde0c73..0e0b313 100644
--- a/compose/ui/ui-text/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-text/api/public_plus_experimental_current.txt
@@ -464,7 +464,7 @@
 
   @androidx.compose.runtime.Immutable @androidx.compose.ui.text.ExperimentalTextApi public final class TextMeasurer {
     ctor public TextMeasurer(androidx.compose.ui.text.font.FontFamily.Resolver fallbackFontFamilyResolver, androidx.compose.ui.unit.Density fallbackDensity, androidx.compose.ui.unit.LayoutDirection fallbackLayoutDirection, optional int cacheSize);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextLayoutResult measure(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional long size, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, optional boolean skipCache);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextLayoutResult measure(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional long constraints, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, optional boolean skipCache);
   }
 
   public final class TextMeasurerKt {
@@ -476,8 +476,8 @@
   }
 
   public final class TextPainterKt {
-    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, androidx.compose.ui.text.AnnotatedString text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional long size);
-    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, String text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional long size);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, androidx.compose.ui.text.AnnotatedString text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional long maxSize);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, String text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional long maxSize);
     method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextLayoutResult textLayoutResult, optional long color, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration);
     method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextLayoutResult textLayoutResult, androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration);
   }
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/TextMeasurerBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/TextMeasurerBenchmark.kt
index 5dbd7a9..3a5ebaf 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/TextMeasurerBenchmark.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/TextMeasurerBenchmark.kt
@@ -30,8 +30,8 @@
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.drawText
 import androidx.compose.ui.text.font.createFontFamilyResolver
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.sp
 import androidx.compose.ui.unit.toSize
@@ -109,7 +109,7 @@
                 textMeasurer.measure(
                     text,
                     style = TextStyle(color = Color.Red, fontSize = fontSize),
-                    size = IntSize(width, Int.MAX_VALUE)
+                    constraints = Constraints.fixedWidth(width)
                 )
             }
         }
@@ -130,7 +130,7 @@
                 textMeasurer.measure(
                     text,
                     style = TextStyle(color = Color.Red, fontSize = fontSize),
-                    size = IntSize(width, Int.MAX_VALUE)
+                    constraints = Constraints.fixedWidth(width)
                 )
             }
         }
@@ -149,7 +149,7 @@
             val textLayoutResult = textMeasurer.measure(
                 text(textGenerator),
                 style = TextStyle(color = Color.Red, fontSize = fontSize),
-                size = IntSize(width, Int.MAX_VALUE)
+                constraints = Constraints.fixedWidth(width)
             )
             val drawScope = CanvasDrawScope()
             val canvas = Canvas(
@@ -181,7 +181,7 @@
             val textLayoutResult = textMeasurer.measure(
                 text(textGenerator),
                 style = TextStyle(color = Color.Red, fontSize = fontSize),
-                size = IntSize(width, Int.MAX_VALUE)
+                constraints = Constraints.fixedWidth(width)
             )
             val drawScope = CanvasDrawScope()
             val canvas = Canvas(
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidParagraphTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidParagraphTest.kt
index 14de512..232d59a 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidParagraphTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidParagraphTest.kt
@@ -1343,25 +1343,29 @@
     }
 
     @Test
-    fun testSpanStyle_textDecoration_underline_appliedOnTextPaint() {
+    fun testSpanStyle_textDecoration_underline_appliedAsSpan() {
+        val text = "abc"
         val paragraph = simpleParagraph(
-            text = "",
+            text = text,
             style = TextStyle(textDecoration = TextDecoration.Underline),
             width = 0.0f
         )
 
-        assertThat(paragraph.textPaint.isUnderlineText).isTrue()
+        assertThat(paragraph.charSequence)
+            .hasSpan(TextDecorationSpan::class, 0, text.length) { it.isUnderlineText }
     }
 
     @Test
-    fun testSpanStyle_textDecoration_lineThrough_appliedOnTextPaint() {
+    fun testSpanStyle_textDecoration_lineThrough_appliedAsSpan() {
+        val text = "abc"
         val paragraph = simpleParagraph(
-            text = "",
+            text = text,
             style = TextStyle(textDecoration = TextDecoration.LineThrough),
             width = 0.0f
         )
 
-        assertThat(paragraph.textPaint.isStrikeThruText).isTrue()
+        assertThat(paragraph.charSequence)
+            .hasSpan(TextDecorationSpan::class, 0, text.length) { it.isStrikethroughText }
     }
 
     @Test
@@ -1389,7 +1393,6 @@
             style = TextStyle(textDecoration = null),
             width = 0.0f
         )
-        assertThat(paragraph.textPaint.isUnderlineText).isFalse()
 
         val canvas = Canvas(android.graphics.Canvas())
         paragraph.paint(canvas, textDecoration = TextDecoration.Underline)
@@ -1405,9 +1408,12 @@
             ),
             width = 0.0f
         )
+        // Underline text is not applied on TextPaint initially. It is set as a span.
+        // Once drawn, this span gets applied on the TextPaint.
+        val canvas = Canvas(android.graphics.Canvas())
+        paragraph.paint(canvas, textDecoration = TextDecoration.Underline)
         assertThat(paragraph.textPaint.isUnderlineText).isTrue()
 
-        val canvas = Canvas(android.graphics.Canvas())
         paragraph.paint(canvas, textDecoration = TextDecoration.None)
         assertThat(paragraph.textPaint.isUnderlineText).isFalse()
     }
@@ -1421,9 +1427,12 @@
             ),
             width = 0.0f
         )
+        // Underline text is not applied on TextPaint initially. It is set as a span.
+        // Once drawn, this span gets applied on the TextPaint.
+        val canvas = Canvas(android.graphics.Canvas())
+        paragraph.paint(canvas, textDecoration = TextDecoration.Underline)
         assertThat(paragraph.textPaint.isUnderlineText).isTrue()
 
-        val canvas = Canvas(android.graphics.Canvas())
         paragraph.paint(canvas, textDecoration = null)
         assertThat(paragraph.textPaint.isUnderlineText).isFalse()
     }
@@ -1764,6 +1773,38 @@
         )
     }
 
+    @Test
+    fun drawText_withUnderlineStyle_equalToUnderlinePaint() = with(defaultDensity) {
+        val fontSize = 30.sp
+        val fontSizeInPx = fontSize.toPx()
+        val text = "レンズ(単焦点)"
+        val spanStyle = SpanStyle(textDecoration = TextDecoration.Underline)
+        val paragraph = simpleParagraph(
+            text = text,
+            style = TextStyle(fontSize = fontSize),
+            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+            width = fontSizeInPx * 20
+        )
+
+        val paragraph2 = simpleParagraph(
+            text = text,
+            style = TextStyle(
+                fontSize = fontSize,
+                textDecoration = TextDecoration.Underline
+            ),
+            width = fontSizeInPx * 20
+        )
+
+        val bitmapWithSpan = paragraph.bitmap()
+        // Our text rendering stack relies on the fact that given textstyle is also passed to draw
+        // functions of TextLayoutResult, MultiParagraph, Paragraph. If Underline is not specified
+        // here, it would be removed while drawing the MultiParagraph. We are simply mimicking
+        // what TextPainter does.
+        val bitmapNoSpan = paragraph2.bitmap(textDecoration = TextDecoration.Underline)
+
+        assertThat(bitmapWithSpan).isEqualToBitmap(bitmapNoSpan)
+    }
+
     private fun simpleParagraph(
         text: String = "",
         spanStyles: List<AnnotatedString.Range<SpanStyle>> = listOf(),
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidPargraphExt.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidPargraphExt.kt
index a76fc2b..0a1cbd0 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidPargraphExt.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidPargraphExt.kt
@@ -18,14 +18,17 @@
 
 import android.graphics.Bitmap
 import android.graphics.Canvas
+import androidx.compose.ui.text.style.TextDecoration
 import kotlin.math.ceil
 
-internal fun AndroidParagraph.bitmap(): Bitmap {
+internal fun AndroidParagraph.bitmap(
+    textDecoration: TextDecoration? = null
+): Bitmap {
     val bitmap = Bitmap.createBitmap(
         ceil(this.width).toInt(),
         ceil(this.height).toInt(),
         Bitmap.Config.ARGB_8888
     )
-    this.paint(androidx.compose.ui.graphics.Canvas(Canvas(bitmap)))
+    this.paint(androidx.compose.ui.graphics.Canvas(Canvas(bitmap)), textDecoration = textDecoration)
     return bitmap
 }
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
index 9bda6c1..fff7f9d 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
@@ -29,6 +29,7 @@
 import androidx.compose.ui.text.matchers.isZero
 import androidx.compose.ui.text.style.ResolvedTextDirection
 import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.style.TextDecoration
 import androidx.compose.ui.text.style.TextDirection
 import androidx.compose.ui.text.style.TextIndent
 import androidx.compose.ui.unit.Constraints
@@ -40,7 +41,6 @@
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
-import androidx.test.filters.Suppress
 import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
@@ -1153,6 +1153,39 @@
     }
 
     @Test
+    fun drawText_withUnderlineStyle_equalToUnderlinePaint() = with(defaultDensity) {
+        val fontSize = 30.sp
+        val fontSizeInPx = fontSize.toPx()
+        val multiParagraph = simpleMultiParagraph(
+            text = buildAnnotatedString {
+                withStyle(SpanStyle(textDecoration = TextDecoration.Underline)) {
+                    append("レンズ(単焦点)")
+                }
+            },
+            style = TextStyle(fontSize = fontSize),
+            width = fontSizeInPx * 20
+        )
+
+        val multiParagraph2 = simpleMultiParagraph(
+            text = AnnotatedString("レンズ(単焦点)"),
+            style = TextStyle(
+                fontSize = fontSize,
+                textDecoration = TextDecoration.Underline
+            ),
+            width = fontSizeInPx * 20
+        )
+
+        val bitmapWithSpan = multiParagraph.bitmap()
+        // Our text rendering stack relies on the fact that given textstyle is also passed to draw
+        // functions of TextLayoutResult, MultiParagraph, Paragraph. If Underline is not specified
+        // here, it would be removed while drawing the MultiParagraph. We are simply mimicking
+        // what TextPainter does.
+        val bitmapNoSpan = multiParagraph2.bitmap(textDecoration = TextDecoration.Underline)
+
+        assertThat(bitmapWithSpan).isEqualToBitmap(bitmapNoSpan)
+    }
+
+    @Test
     fun textIndent_onFirstLine() {
         with(defaultDensity) {
             val text = createAnnotatedString("aaa", "\u05D0\u05D0\u05D0")
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextLayoutCacheTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextLayoutCacheTest.kt
index 43cbe84..f025c2f 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextLayoutCacheTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextLayoutCacheTest.kt
@@ -28,7 +28,6 @@
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.sp
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -318,7 +317,7 @@
             softWrap = softWrap,
             maxLines = maxLines,
             placeholders = placeholders,
-            size = IntSize(constraints.maxWidth, constraints.maxHeight),
+            constraints = constraints
         )
     }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextMeasurerTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextMeasurerTest.kt
index db5ab99..f98d0dd 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextMeasurerTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextMeasurerTest.kt
@@ -28,7 +28,6 @@
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
@@ -331,7 +330,7 @@
             softWrap = softWrap,
             maxLines = maxLines,
             placeholders = placeholders,
-            size = IntSize(constraints.maxWidth, constraints.maxHeight),
+            constraints = constraints,
         )
     }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextPainterTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextPainterTest.kt
index d86c792..3cc0962 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextPainterTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextPainterTest.kt
@@ -31,6 +31,7 @@
 import androidx.compose.ui.text.font.toFontFamily
 import androidx.compose.ui.text.matchers.assertThat
 import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
@@ -64,7 +65,7 @@
         val textLayoutResult = measurer.measure(
             text = longText,
             style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 20.sp),
-            size = IntSize(400, 400)
+            constraints = Constraints(maxWidth = 400, maxHeight = 400)
         )
 
         val bitmap = draw {
@@ -75,7 +76,7 @@
                 measurer,
                 text = longText,
                 style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 20.sp),
-                size = IntSize(400, 400)
+                maxSize = IntSize(400, 400)
             )
         }
 
@@ -95,7 +96,7 @@
                     fontFamily = fontFamilyMeasureFont,
                     fontSize = 20.sp
                 ),
-                size = IntSize(400, 400)
+                maxSize = IntSize(400, 400)
             )
         }
         val bitmap2 = draw {
@@ -107,7 +108,7 @@
                     fontFamily = fontFamilyMeasureFont,
                     fontSize = 20.sp
                 ),
-                size = IntSize(400, 400)
+                maxSize = IntSize(400, 400)
             )
         }
 
@@ -123,7 +124,7 @@
                 textMeasurer = measurer,
                 text = longText,
                 style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 20.sp),
-                size = IntSize(400, 400)
+                maxSize = IntSize(400, 400)
             )
         }
         val bitmap2 = draw {
@@ -131,7 +132,7 @@
                 textMeasurer = measurer,
                 text = longText,
                 style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 24.sp),
-                size = IntSize(400, 400)
+                maxSize = IntSize(400, 400)
             )
         }
 
@@ -148,7 +149,7 @@
                 fontFamily = fontFamilyMeasureFont,
                 fontSize = 20.sp
             ),
-            size = IntSize(400, 400)
+            constraints = Constraints.fixed(400, 400)
         )
 
         val textLayoutResultBlue = measurer.measure(
@@ -158,7 +159,7 @@
                 fontFamily = fontFamilyMeasureFont,
                 fontSize = 20.sp
             ),
-            size = IntSize(400, 400)
+            constraints = Constraints.fixed(400, 400)
         )
 
         val bitmap = draw {
@@ -181,7 +182,7 @@
                 fontFamily = fontFamilyMeasureFont,
                 fontSize = 20.sp
             ),
-            size = IntSize(400, 400)
+            constraints = Constraints.fixed(400, 400)
         )
 
         val textLayoutResultHalfOpaque = measurer.measure(
@@ -191,7 +192,7 @@
                 fontFamily = fontFamilyMeasureFont,
                 fontSize = 20.sp
             ),
-            size = IntSize(400, 400)
+            constraints = Constraints.fixed(400, 400)
         )
 
         val bitmap = draw {
@@ -216,7 +217,7 @@
                 fontFamily = fontFamilyMeasureFont,
                 fontSize = 20.sp
             ),
-            size = IntSize(400, 400)
+            constraints = Constraints.fixed(400, 400)
         )
 
         val textLayoutResultGY = measurer.measure(
@@ -226,7 +227,7 @@
                 fontFamily = fontFamilyMeasureFont,
                 fontSize = 20.sp
             ),
-            size = IntSize(400, 400)
+            constraints = Constraints.fixed(400, 400)
         )
 
         val bitmap = draw {
@@ -251,7 +252,7 @@
                 fontFamily = fontFamilyMeasureFont,
                 fontSize = 20.sp
             ),
-            size = IntSize(400, 400)
+            constraints = Constraints.fixed(400, 400)
         )
 
         val textLayoutResultHalfOpaque = measurer.measure(
@@ -262,7 +263,7 @@
                 fontFamily = fontFamilyMeasureFont,
                 fontSize = 20.sp
             ),
-            size = IntSize(400, 400)
+            constraints = Constraints.fixed(400, 400)
         )
 
         val bitmap = draw {
@@ -285,7 +286,7 @@
                 fontFamily = fontFamilyMeasureFont,
                 fontSize = 20.sp
             ),
-            size = IntSize(200, 4000)
+            constraints = Constraints.fixed(200, 4000)
         )
 
         val bitmap = draw(200f, 4000f) {
@@ -312,7 +313,7 @@
                 fontSize = 20.sp
             ),
             density = Density(4f),
-            size = IntSize(1000, 1000)
+            constraints = Constraints.fixed(1000, 1000)
         )
 
         val bitmap = draw {
@@ -342,7 +343,7 @@
             ),
             softWrap = false,
             overflow = TextOverflow.Clip,
-            size = IntSize(200, 200)
+            constraints = Constraints.fixed(200, 200)
         )
 
         val bitmap = draw(400f, 200f) {
@@ -371,7 +372,7 @@
                 ),
                 softWrap = false,
                 overflow = TextOverflow.Ellipsis,
-                size = IntSize(200, height)
+                constraints = Constraints.fixed(200, height)
             )
 
             val bitmap = draw(200f, 200f) {
@@ -402,7 +403,7 @@
             ),
             softWrap = false,
             overflow = TextOverflow.Clip,
-            size = IntSize(400, 200)
+            constraints = Constraints.fixed(400, 200)
         )
 
         val textLayoutResultNoClip = measurer.measure(
@@ -413,7 +414,7 @@
             ),
             softWrap = false,
             overflow = TextOverflow.Visible,
-            size = IntSize(200, 200)
+            constraints = Constraints.fixed(200, 200)
         )
 
         val bitmap = draw(400f, 200f) {
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextTestExtensions.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextTestExtensions.kt
index 96e796e..5e8c989 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextTestExtensions.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextTestExtensions.kt
@@ -30,6 +30,7 @@
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.text.font.AndroidFontResolveInterceptor
 import androidx.compose.ui.text.font.PlatformResolveInterceptor
+import androidx.compose.ui.text.style.TextDecoration
 import kotlin.math.ceil
 import kotlin.math.roundToInt
 
@@ -68,7 +69,8 @@
 @OptIn(ExperimentalTextApi::class)
 fun MultiParagraph.bitmap(
     brush: Brush? = null,
-    alpha: Float = Float.NaN
+    alpha: Float = Float.NaN,
+    textDecoration: TextDecoration? = null
 ): Bitmap {
     val width = paragraphInfoList.maxByOrNull { it.paragraph.width }?.paragraph?.width ?: 0f
     val bitmap = Bitmap.createBitmap(
@@ -77,9 +79,17 @@
         Bitmap.Config.ARGB_8888
     )
     if (brush != null) {
-        this.paint(androidx.compose.ui.graphics.Canvas(Canvas(bitmap)), brush, alpha)
+        this.paint(
+            canvas = androidx.compose.ui.graphics.Canvas(Canvas(bitmap)),
+            brush = brush,
+            alpha = alpha,
+            decoration = textDecoration
+        )
     } else {
-        this.paint(androidx.compose.ui.graphics.Canvas(Canvas(bitmap)))
+        this.paint(
+            canvas = androidx.compose.ui.graphics.Canvas(Canvas(bitmap)),
+            decoration = textDecoration
+        )
     }
     return bitmap
 }
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/ApplySpanStyleTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/ApplySpanStyleTest.kt
new file mode 100644
index 0000000..70b82b1
--- /dev/null
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/ApplySpanStyleTest.kt
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.ui.text.platform
+
+import android.graphics.Typeface
+import androidx.compose.ui.text.SpanStyle
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontStyle
+import androidx.compose.ui.text.font.FontSynthesis
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.platform.extensions.applySpanStyle
+import androidx.compose.ui.text.style.TextDecoration
+import androidx.compose.ui.unit.Density
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class ApplySpanStyleTest {
+
+    private val context = InstrumentationRegistry.getInstrumentation().targetContext!!
+    private val density = Density(context)
+    private val resolveTypeface: (FontFamily?, FontWeight, FontStyle, FontSynthesis) -> Typeface =
+        { _, _, _, _ ->
+            Typeface.DEFAULT
+        }
+
+    @Test
+    fun textDecorationUnderline_shouldBeLeftAsSpan() {
+        val textDecoration = TextDecoration.Underline
+        val spanStyle = SpanStyle(textDecoration = textDecoration)
+        val tp = AndroidTextPaint(0, density.density)
+        tp.isUnderlineText = false
+
+        val notApplied = tp.applySpanStyle(spanStyle, resolveTypeface, density)
+
+        assertThat(tp.isUnderlineText).isEqualTo(false)
+        assertThat(notApplied.textDecoration).isEqualTo(textDecoration)
+    }
+
+    @Test
+    fun textDecorationLineThrough_shouldBeLeftAsSpan() {
+        val textDecoration = TextDecoration.LineThrough
+        val spanStyle = SpanStyle(textDecoration = textDecoration)
+        val tp = AndroidTextPaint(0, density.density)
+        tp.isStrikeThruText = false
+
+        val notApplied = tp.applySpanStyle(spanStyle, resolveTypeface, density)
+
+        assertThat(tp.isStrikeThruText).isEqualTo(false)
+        assertThat(notApplied.textDecoration).isEqualTo(textDecoration)
+    }
+
+    @Test
+    fun textDecorationNone_shouldNotBeLeftAsSpan() {
+        val textDecoration = TextDecoration.None
+        val spanStyle = SpanStyle(textDecoration = textDecoration)
+        val tp = AndroidTextPaint(0, density.density)
+        tp.isUnderlineText = false
+        tp.isStrikeThruText = false
+
+        val notApplied = tp.applySpanStyle(spanStyle, resolveTypeface, density)
+
+        assertThat(tp.isUnderlineText).isEqualTo(false)
+        assertThat(tp.isStrikeThruText).isEqualTo(false)
+        assertThat(notApplied.textDecoration).isNull()
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/TextPaintExtensions.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/TextPaintExtensions.android.kt
index 4552cea..12141cd 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/TextPaintExtensions.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/TextPaintExtensions.android.kt
@@ -30,11 +30,19 @@
 import androidx.compose.ui.text.intl.LocaleList
 import androidx.compose.ui.text.platform.AndroidTextPaint
 import androidx.compose.ui.text.style.BaselineShift
+import androidx.compose.ui.text.style.TextDecoration
 import androidx.compose.ui.text.style.TextGeometricTransform
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.TextUnit
 import androidx.compose.ui.unit.TextUnitType
 
+/**
+ * Applies given SpanStyle to this AndroidTextPaint.
+ *
+ * Although most attributes in SpanStyle can be applied to TextPaint, some are only applicable as
+ * regular platform spans such as background, baselineShift. This function also returns a new
+ * SpanStyle that consists of attributes that were not applied to the TextPaint.
+ */
 @OptIn(ExperimentalTextApi::class)
 internal fun AndroidTextPaint.applySpanStyle(
     style: SpanStyle,
@@ -98,7 +106,7 @@
     // Paragraph.paint will receive a proper Size after layout is completed.
     setBrush(style.brush, Size.Unspecified, style.alpha)
     setShadow(style.shadow)
-    setTextDecoration(style.textDecoration)
+    // Skip textDecoration (b/199939617). TextDecoration should be applied as a span.
 
     // letterSpacing with unit Sp needs to be handled by span.
     // baselineShift and bgColor is reset in the Android Layout constructor,
@@ -120,6 +128,9 @@
             null
         } else {
             style.baselineShift
+        },
+        textDecoration = style.textDecoration.takeIf {
+            style.textDecoration != TextDecoration.None
         }
     )
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt
index 9bee135..a9c1504 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt
@@ -31,7 +31,7 @@
 import androidx.compose.ui.text.intl.LocaleList
 import androidx.compose.ui.text.style.BaselineShift
 import androidx.compose.ui.text.style.TextDecoration
-import androidx.compose.ui.text.style.TextDrawStyle
+import androidx.compose.ui.text.style.TextForegroundStyle
 import androidx.compose.ui.text.style.TextGeometricTransform
 import androidx.compose.ui.text.style.lerp
 import androidx.compose.ui.unit.TextUnit
@@ -82,7 +82,7 @@
 @Immutable
 class SpanStyle internal constructor(
     // The fill to draw text, a unified representation of Color and Brush.
-    internal val textDrawStyle: TextDrawStyle,
+    internal val textForegroundStyle: TextForegroundStyle,
     val fontSize: TextUnit = TextUnit.Unspecified,
     val fontWeight: FontWeight? = null,
     val fontStyle: FontStyle? = null,
@@ -147,7 +147,7 @@
         textDecoration: TextDecoration? = null,
         shadow: Shadow? = null
     ) : this(
-        textDrawStyle = TextDrawStyle.from(color),
+        textForegroundStyle = TextForegroundStyle.from(color),
         fontSize = fontSize,
         fontWeight = fontWeight,
         fontStyle = fontStyle,
@@ -214,7 +214,7 @@
         shadow: Shadow? = null,
         platformStyle: PlatformSpanStyle? = null
     ) : this(
-        textDrawStyle = TextDrawStyle.from(color),
+        textForegroundStyle = TextForegroundStyle.from(color),
         fontSize = fontSize,
         fontWeight = fontWeight,
         fontStyle = fontStyle,
@@ -287,7 +287,7 @@
         shadow: Shadow? = null,
         platformStyle: PlatformSpanStyle? = null
     ) : this(
-        textDrawStyle = TextDrawStyle.from(brush, alpha),
+        textForegroundStyle = TextForegroundStyle.from(brush, alpha),
         fontSize = fontSize,
         fontWeight = fontWeight,
         fontStyle = fontStyle,
@@ -307,7 +307,7 @@
     /**
      * Color to draw text.
      */
-    val color: Color get() = this.textDrawStyle.color
+    val color: Color get() = this.textForegroundStyle.color
 
     /**
      * Brush to draw text. If not null, overrides [color].
@@ -315,7 +315,7 @@
     @ExperimentalTextApi
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @get:ExperimentalTextApi
-    val brush: Brush? get() = this.textDrawStyle.brush
+    val brush: Brush? get() = this.textForegroundStyle.brush
 
     /**
      * Opacity of text. This value is either provided along side Brush, or via alpha channel in
@@ -324,7 +324,7 @@
     @ExperimentalTextApi
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @get:ExperimentalTextApi
-    val alpha: Float get() = this.textDrawStyle.alpha
+    val alpha: Float get() = this.textForegroundStyle.alpha
 
     /**
      * Returns a new span style that is a combination of this style and the given [other] style.
@@ -340,7 +340,7 @@
         if (other == null) return this
 
         return SpanStyle(
-            textDrawStyle = textDrawStyle.merge(other.textDrawStyle),
+            textForegroundStyle = textForegroundStyle.merge(other.textForegroundStyle),
             fontFamily = other.fontFamily ?: this.fontFamily,
             fontSize = if (!other.fontSize.isUnspecified) other.fontSize else this.fontSize,
             fontWeight = other.fontWeight ?: this.fontWeight,
@@ -391,7 +391,11 @@
         shadow: Shadow? = this.shadow
     ): SpanStyle {
         return SpanStyle(
-            textDrawStyle = if (color == this.color) textDrawStyle else TextDrawStyle.from(color),
+            textForegroundStyle = if (color == this.color) {
+                textForegroundStyle
+            } else {
+                TextForegroundStyle.from(color)
+            },
             fontSize = fontSize,
             fontWeight = fontWeight,
             fontStyle = fontStyle,
@@ -427,7 +431,11 @@
         platformStyle: PlatformSpanStyle? = this.platformStyle
     ): SpanStyle {
         return SpanStyle(
-            textDrawStyle = if (color == this.color) textDrawStyle else TextDrawStyle.from(color),
+            textForegroundStyle = if (color == this.color) {
+                textForegroundStyle
+            } else {
+                TextForegroundStyle.from(color)
+            },
             fontSize = fontSize,
             fontWeight = fontWeight,
             fontStyle = fontStyle,
@@ -465,7 +473,7 @@
         platformStyle: PlatformSpanStyle? = this.platformStyle
     ): SpanStyle {
         return SpanStyle(
-            textDrawStyle = TextDrawStyle.from(brush, alpha),
+            textForegroundStyle = TextForegroundStyle.from(brush, alpha),
             fontSize = fontSize,
             fontWeight = fontWeight,
             fontStyle = fontStyle,
@@ -508,7 +516,7 @@
     }
 
     private fun hasSameNonLayoutAttributes(other: SpanStyle): Boolean {
-        if (textDrawStyle != other.textDrawStyle) return false
+        if (textForegroundStyle != other.textForegroundStyle) return false
         if (textDecoration != other.textDecoration) return false
         if (shadow != other.shadow) return false
         return true
@@ -606,7 +614,7 @@
  */
 fun lerp(start: SpanStyle, stop: SpanStyle, fraction: Float): SpanStyle {
     return SpanStyle(
-        textDrawStyle = lerp(start.textDrawStyle, stop.textDrawStyle, fraction),
+        textForegroundStyle = lerp(start.textForegroundStyle, stop.textForegroundStyle, fraction),
         fontFamily = lerpDiscrete(
             start.fontFamily,
             stop.fontFamily,
@@ -680,7 +688,9 @@
 }
 
 internal fun resolveSpanStyleDefaults(style: SpanStyle) = SpanStyle(
-    textDrawStyle = style.textDrawStyle.takeOrElse { TextDrawStyle.from(DefaultColor) },
+    textForegroundStyle = style.textForegroundStyle.takeOrElse {
+        TextForegroundStyle.from(DefaultColor)
+    },
     fontSize = if (style.fontSize.isUnspecified) DefaultFontSize else style.fontSize,
     fontWeight = style.fontWeight ?: FontWeight.Normal,
     fontStyle = style.fontStyle ?: FontStyle.Normal,
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurer.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurer.kt
index 1ee046a..873d665 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurer.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurer.kt
@@ -43,6 +43,9 @@
 /**
  * TextMeasurer is responsible for measuring a text in its entirety so that it's ready to be drawn.
  *
+ * A TextMeasurer instance should be created via `androidx.compose.ui.rememberTextMeasurer` in a
+ * Composable context to use fallback values from default composition locals.
+ *
  * Text layout is a computationally expensive task. Therefore, this class holds an internal LRU
  * Cache of layout input and output pairs to optimize the repeated measure calls that use the same
  * input parameters.
@@ -94,12 +97,14 @@
      * This function supports laying out text that consists of multiple paragraphs, includes
      * placeholders, wraps around soft line breaks, and might overflow outside the specified size.
      *
-     * Most parameters for text affect the final text layout. One pixel change in [size] can
-     * displace a word to another line which would cause a chain reaction that completely changes
-     * how text is rendered. On the other hand, some attributes only play a role when drawing the
-     * created text layout. For example text layout can be created completely in black color but we
-     * can apply [TextStyle.color] later in draw phase. This also means that animating text color
-     * shouldn't invalidate text layout.
+     * Most parameters for text affect the final text layout. One pixel change in [constraints]
+     * boundaries can displace a word to another line which would cause a chain reaction that
+     * completely changes how text is rendered.
+     *
+     * On the other hand, some attributes only play a role when drawing the created text layout.
+     * For example text layout can be created completely in black color but we can apply
+     * [TextStyle.color] later in draw phase. This also means that animating text color shouldn't
+     * invalidate text layout.
      *
      * Thus, [textLayoutCache] helps in the process of converting a set of text layout inputs to
      * a text layout while ignoring non-layout-affecting attributes. Iterative calls that use the
@@ -118,9 +123,10 @@
      * skipped during layout and replaced with [Placeholder]. It's required that the range of each
      * [Placeholder] doesn't cross paragraph boundary, otherwise [IllegalArgumentException] is
      * thrown.
-     * @param size how wide and tall the text is allowed to be. [IntSize.width]
-     * will define the width of the text. [IntSize.height] helps defining the
-     * number of lines that fit if [softWrap] is enabled and [overflow] is [TextOverflow.Ellipsis].
+     * @param constraints how wide and tall the text is allowed to be. [Constraints.maxWidth]
+     * will define the width of the MultiParagraph. [Constraints.maxHeight] helps defining the
+     * number of lines that fit with ellipsis is true. [Constraints.minWidth] defines the minimum
+     * width the resulting [TextLayoutResult.size] will report. [Constraints.minHeight] is no-op.
      * @param layoutDirection layout direction of the measurement environment. If not specified,
      * defaults to the value that was given during initialization of this [TextMeasurer].
      * @param density density of the measurement environment. If not specified, defaults to
@@ -137,13 +143,12 @@
         softWrap: Boolean = true,
         maxLines: Int = Int.MAX_VALUE,
         placeholders: List<AnnotatedString.Range<Placeholder>> = emptyList(),
-        size: IntSize = IntSize(Int.MAX_VALUE, Int.MAX_VALUE),
+        constraints: Constraints = Constraints(),
         layoutDirection: LayoutDirection = this.fallbackLayoutDirection,
         density: Density = this.fallbackDensity,
         fontFamilyResolver: FontFamily.Resolver = this.fallbackFontFamilyResolver,
         skipCache: Boolean = false
     ): TextLayoutResult {
-        val constraints = Constraints(maxWidth = size.width, maxHeight = size.height)
         val requestedTextLayoutInput = TextLayoutInput(
             text,
             style,
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt
index 1793326..b2ba6b9 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt
@@ -31,6 +31,7 @@
 import androidx.compose.ui.text.style.TextDecoration
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.text.style.modulate
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntSize
 import kotlin.math.ceil
 import kotlin.math.roundToInt
@@ -108,7 +109,7 @@
  * skipped during layout and replaced with [Placeholder]. It's required that the range of each
  * [Placeholder] doesn't cross paragraph boundary, otherwise [IllegalArgumentException] is
  * thrown.
- * @param size how wide and tall the text is allowed to be. [IntSize.width] will define the width
+ * @param maxSize how wide and tall the text is allowed to be. [IntSize.width] will define the width
  * of the text. [IntSize.height] helps defining the number of lines that fit if [softWrap] is
  * enabled and [overflow] is [TextOverflow.Ellipsis]. Otherwise, [IntSize.height] either defines
  * where the text is clipped ([TextOverflow.Clip]) or becomes no-op.
@@ -125,9 +126,9 @@
     softWrap: Boolean = true,
     maxLines: Int = Int.MAX_VALUE,
     placeholders: List<AnnotatedString.Range<Placeholder>> = emptyList(),
-    size: IntSize = IntSize(
-        width = ceil(this.size.width).roundToInt(),
-        height = ceil(this.size.height).roundToInt()
+    maxSize: IntSize = IntSize(
+        width = ceil(this.size.width - topLeft.x).roundToInt(),
+        height = ceil(this.size.height - topLeft.y).roundToInt()
     )
 ) {
     val textLayoutResult = textMeasurer.measure(
@@ -137,7 +138,7 @@
         softWrap = softWrap,
         maxLines = maxLines,
         placeholders = placeholders,
-        size = size,
+        constraints = Constraints(maxWidth = maxSize.width, maxHeight = maxSize.height),
         layoutDirection = layoutDirection,
         density = this
     )
@@ -172,7 +173,7 @@
  * @param maxLines An optional maximum number of lines for the text to span, wrapping if
  * necessary. If the text exceeds the given number of lines, it will be truncated according to
  * [overflow] and [softWrap]. If it is not null, then it must be greater than zero.
- * @param size how wide and tall the text is allowed to be. [IntSize.width] will define the width
+ * @param maxSize how wide and tall the text is allowed to be. [IntSize.width] will define the width
  * of the text. [IntSize.height] helps defining the number of lines that fit if [softWrap] is
  * enabled and [overflow] is [TextOverflow.Ellipsis]. Otherwise, [IntSize.height] either defines
  * where the text is clipped ([TextOverflow.Clip]) or becomes no-op.
@@ -188,9 +189,9 @@
     overflow: TextOverflow = TextOverflow.Clip,
     softWrap: Boolean = true,
     maxLines: Int = Int.MAX_VALUE,
-    size: IntSize = IntSize(
-        width = ceil(this.size.width).roundToInt(),
-        height = ceil(this.size.height).roundToInt()
+    maxSize: IntSize = IntSize(
+        width = ceil(this.size.width - topLeft.x).roundToInt(),
+        height = ceil(this.size.height - topLeft.y).roundToInt()
     )
 ) {
     val textLayoutResult = textMeasurer.measure(
@@ -199,7 +200,7 @@
         overflow = overflow,
         softWrap = softWrap,
         maxLines = maxLines,
-        size = size,
+        constraints = Constraints(maxWidth = maxSize.width, maxHeight = maxSize.height),
         layoutDirection = layoutDirection,
         density = this
     )
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt
index 3a53674..2f759cc 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt
@@ -31,7 +31,7 @@
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.text.style.TextDecoration
 import androidx.compose.ui.text.style.TextDirection
-import androidx.compose.ui.text.style.TextDrawStyle
+import androidx.compose.ui.text.style.TextForegroundStyle
 import androidx.compose.ui.text.style.TextGeometricTransform
 import androidx.compose.ui.text.style.TextIndent
 import androidx.compose.ui.unit.LayoutDirection
@@ -410,10 +410,10 @@
     ): TextStyle {
         return TextStyle(
             spanStyle = SpanStyle(
-                textDrawStyle = if (color == this.spanStyle.color) {
-                    spanStyle.textDrawStyle
+                textForegroundStyle = if (color == this.spanStyle.color) {
+                    spanStyle.textForegroundStyle
                 } else {
-                    TextDrawStyle.from(color)
+                    TextForegroundStyle.from(color)
                 },
                 fontSize = fontSize,
                 fontWeight = fontWeight,
@@ -466,10 +466,10 @@
     ): TextStyle {
         return TextStyle(
             spanStyle = SpanStyle(
-                textDrawStyle = if (color == this.spanStyle.color) {
-                    spanStyle.textDrawStyle
+                textForegroundStyle = if (color == this.spanStyle.color) {
+                    spanStyle.textForegroundStyle
                 } else {
-                    TextDrawStyle.from(color)
+                    TextForegroundStyle.from(color)
                 },
                 fontSize = fontSize,
                 fontWeight = fontWeight,
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDrawStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextForegroundStyle.kt
similarity index 77%
rename from compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDrawStyle.kt
rename to compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextForegroundStyle.kt
index d45086e..517236f 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDrawStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextForegroundStyle.kt
@@ -13,6 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+@file:JvmName("TextDrawStyleKt")
 
 package androidx.compose.ui.text.style
 
@@ -35,17 +36,17 @@
  * - Both [color] can be [Color.Unspecified] and [brush] null, indicating that nothing is specified.
  * - [SolidColor] brushes are stored as regular [Color].
  */
-internal interface TextDrawStyle {
+internal interface TextForegroundStyle {
     val color: Color
 
     val brush: Brush?
 
     val alpha: Float
 
-    fun merge(other: TextDrawStyle): TextDrawStyle {
-        // This control prevents Color or Unspecified TextDrawStyle to override an existing Brush.
-        // It is a temporary measure to prevent Material Text composables to remove given Brush
-        // from a TextStyle.
+    fun merge(other: TextForegroundStyle): TextForegroundStyle {
+        // This control prevents Color or Unspecified TextForegroundStyle to override an existing
+        // Brush. It is a temporary measure to prevent Material Text composables to remove given
+        // Brush from a TextStyle.
         // TODO(b/230787077): Just return other.takeOrElse { this } when Brush is stable.
         return when {
             other is BrushStyle && this is BrushStyle ->
@@ -56,11 +57,11 @@
         }
     }
 
-    fun takeOrElse(other: () -> TextDrawStyle): TextDrawStyle {
+    fun takeOrElse(other: () -> TextForegroundStyle): TextForegroundStyle {
         return if (this != Unspecified) this else other()
     }
 
-    object Unspecified : TextDrawStyle {
+    object Unspecified : TextForegroundStyle {
         override val color: Color
             get() = Color.Unspecified
 
@@ -72,11 +73,11 @@
     }
 
     companion object {
-        fun from(color: Color): TextDrawStyle {
+        fun from(color: Color): TextForegroundStyle {
             return if (color.isSpecified) ColorStyle(color) else Unspecified
         }
 
-        fun from(brush: Brush?, alpha: Float): TextDrawStyle {
+        fun from(brush: Brush?, alpha: Float): TextForegroundStyle {
             return when (brush) {
                 null -> Unspecified
                 is SolidColor -> from(brush.value.modulate(alpha))
@@ -88,10 +89,10 @@
 
 private data class ColorStyle(
     val value: Color
-) : TextDrawStyle {
+) : TextForegroundStyle {
     init {
         require(value.isSpecified) {
-            "ColorStyle value must be specified, use TextDrawStyle.Unspecified instead."
+            "ColorStyle value must be specified, use TextForegroundStyle.Unspecified instead."
         }
     }
 
@@ -108,7 +109,7 @@
 private data class BrushStyle(
     val value: ShaderBrush,
     override val alpha: Float
-) : TextDrawStyle {
+) : TextForegroundStyle {
     override val color: Color
         get() = Color.Unspecified
 
@@ -117,14 +118,18 @@
 }
 
 /**
- * If both TextDrawStyles do not represent a Brush, lerp the color values. Otherwise, lerp
+ * If both TextForegroundStyles do not represent a Brush, lerp the color values. Otherwise, lerp
  * start to end discretely.
  */
-internal fun lerp(start: TextDrawStyle, stop: TextDrawStyle, fraction: Float): TextDrawStyle {
+internal fun lerp(
+    start: TextForegroundStyle,
+    stop: TextForegroundStyle,
+    fraction: Float
+): TextForegroundStyle {
     return if ((start !is BrushStyle && stop !is BrushStyle)) {
-        TextDrawStyle.from(lerpColor(start.color, stop.color, fraction))
+        TextForegroundStyle.from(lerpColor(start.color, stop.color, fraction))
     } else if (start is BrushStyle && stop is BrushStyle) {
-        TextDrawStyle.from(
+        TextForegroundStyle.from(
             lerpDiscrete(start.brush, stop.brush, fraction),
             lerp(start.alpha, stop.alpha, fraction)
         )
diff --git a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/TextSpanParagraphStyleTest.kt b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/TextSpanParagraphStyleTest.kt
index 32c238d..1cf59fc 100644
--- a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/TextSpanParagraphStyleTest.kt
+++ b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/TextSpanParagraphStyleTest.kt
@@ -34,7 +34,7 @@
     @Test
     fun spanStyle_constructor_is_covered_by_TextStyle() {
         val spanStyleParameters = constructorParams(SpanStyle::class).toMutableSet().filter {
-            it.name != "platformStyle" && it.name != "textDrawStyle"
+            it.name != "platformStyle" && it.name != "textForegroundStyle"
         }
         val textStyleParameters = mutableSetOf<Parameter>()
 
@@ -55,7 +55,7 @@
     @Test
     fun spanStyle_properties_is_covered_by_TextStyle() {
         val spanStyleProperties = memberProperties(SpanStyle::class).filter {
-            it.name != "platformStyle" && it.name != "textDrawStyle"
+            it.name != "platformStyle" && it.name != "textForegroundStyle"
         }
         val textStyleProperties = memberProperties(TextStyle::class).filter {
             it.name != "platformStyle"
@@ -88,7 +88,7 @@
     @Test
     fun textStyle_covered_by_ParagraphStyle_and_SpanStyle() {
         val spanStyleParameters = allConstructorParams(SpanStyle::class).filter {
-            it.name != "platformStyle" && it.name != "textDrawStyle"
+            it.name != "platformStyle" && it.name != "textForegroundStyle"
         }
         val paragraphStyleParameters = allConstructorParams(ParagraphStyle::class).filter {
             it.name != "platformStyle"
@@ -109,7 +109,7 @@
     @Test
     fun testStyle_properties_is_covered_by_ParagraphStyle_and_SpanStyle() {
         val spanStyleProperties = memberProperties(SpanStyle::class).filter {
-            it.name != "platformStyle" && it.name != "textDrawStyle"
+            it.name != "platformStyle" && it.name != "textForegroundStyle"
         }
         val paragraphStyleProperties = memberProperties(ParagraphStyle::class).filter {
             it.name != "platformStyle"
diff --git a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/style/TextDrawStyleTest.kt b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/style/TextForegroundStyleTest.kt
similarity index 66%
rename from compose/ui/ui-text/src/test/java/androidx/compose/ui/text/style/TextDrawStyleTest.kt
rename to compose/ui/ui-text/src/test/java/androidx/compose/ui/text/style/TextForegroundStyleTest.kt
index 0988648..f9be743 100644
--- a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/style/TextDrawStyleTest.kt
+++ b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/style/TextForegroundStyleTest.kt
@@ -28,49 +28,49 @@
 import org.junit.runners.JUnit4
 
 @RunWith(JUnit4::class)
-class TextDrawStyleTest {
+class TextForegroundStyleTest {
 
     private val defaultBrush = Brush.linearGradient(listOf(Color.Red, Color.Blue))
     private val TOLERANCE = 1f / 256f
 
     @Test
     fun `color is not equal to unspecified`() {
-        val color = TextDrawStyle.from(Color.Red)
-        assertThat(color == TextDrawStyle.Unspecified).isFalse()
+        val color = TextForegroundStyle.from(Color.Red)
+        assertThat(color == TextForegroundStyle.Unspecified).isFalse()
     }
 
     @Test
     fun `brush is not equal to color`() {
-        val color = TextDrawStyle.from(Color.Red)
-        val brush = TextDrawStyle.from(defaultBrush, 1f)
+        val color = TextForegroundStyle.from(Color.Red)
+        val brush = TextForegroundStyle.from(defaultBrush, 1f)
         assertThat(color == brush).isFalse()
     }
 
     @Test
     fun `different colors are not equal`() {
-        val color = TextDrawStyle.from(Color.Red)
-        val otherColor = TextDrawStyle.from(Color.Blue)
+        val color = TextForegroundStyle.from(Color.Red)
+        val otherColor = TextForegroundStyle.from(Color.Blue)
         assertThat(color == otherColor).isFalse()
     }
 
     @Test
     fun `same colors should be equal`() {
-        val color = TextDrawStyle.from(Color.Red)
-        val otherColor = TextDrawStyle.from(Color.Red)
+        val color = TextForegroundStyle.from(Color.Red)
+        val otherColor = TextForegroundStyle.from(Color.Red)
         assertThat(color == otherColor).isTrue()
     }
 
     @Test
-    fun `unspecified color initiates an Unspecified TextDrawStyle`() {
-        val unspecified = TextDrawStyle.from(Color.Unspecified)
-        assertThat(unspecified).isEqualTo(TextDrawStyle.Unspecified)
+    fun `unspecified color initiates an Unspecified TextForegroundStyle`() {
+        val unspecified = TextForegroundStyle.from(Color.Unspecified)
+        assertThat(unspecified).isEqualTo(TextForegroundStyle.Unspecified)
         assertThat(unspecified.color).isEqualTo(Color.Unspecified)
         assertThat(unspecified.brush).isNull()
     }
 
     @Test
     fun `specified color initiates only color`() {
-        val specified = TextDrawStyle.from(Color.Red)
+        val specified = TextForegroundStyle.from(Color.Red)
         assertThat(specified.color).isEqualTo(Color.Red)
         assertThat(specified.brush).isNull()
         assertThat(specified.alpha).isEqualTo(1f)
@@ -78,7 +78,7 @@
 
     @Test
     fun `specified color returns its alpha`() {
-        val specified = TextDrawStyle.from(Color.Red.copy(alpha = 0.5f))
+        val specified = TextForegroundStyle.from(Color.Red.copy(alpha = 0.5f))
         assertThat(specified.color).isEqualTo(Color.Red.copy(alpha = 0.5f))
         assertThat(specified.brush).isNull()
         assertThat(specified.alpha).isWithin(TOLERANCE).of(0.5f)
@@ -86,21 +86,21 @@
 
     @Test
     fun `SolidColor is converted to color`() {
-        val specified = TextDrawStyle.from(SolidColor(Color.Red), 1f)
+        val specified = TextForegroundStyle.from(SolidColor(Color.Red), 1f)
         assertThat(specified.color).isEqualTo(Color.Red)
         assertThat(specified.brush).isNull()
     }
 
     @Test
     fun `SolidColor with alpha is modulated`() {
-        val specified = TextDrawStyle.from(SolidColor(Color.Red.copy(alpha = 0.8f)), 0.6f)
+        val specified = TextForegroundStyle.from(SolidColor(Color.Red.copy(alpha = 0.8f)), 0.6f)
         assertThat(specified.color).isEqualTo(Color.Red.copy(alpha = 0.48f))
         assertThat(specified.brush).isNull()
     }
 
     @Test
     fun `ShaderBrush initiates a brush`() {
-        val specified = TextDrawStyle.from(defaultBrush, 0.8f)
+        val specified = TextForegroundStyle.from(defaultBrush, 0.8f)
         assertThat(specified.color).isEqualTo(Color.Unspecified)
         assertThat(specified.brush).isEqualTo(defaultBrush)
         assertThat(specified.alpha).isWithin(TOLERANCE).of(0.8f)
@@ -108,13 +108,13 @@
 
     @Test
     fun `merging unspecified with anything returns anything`() {
-        val current = TextDrawStyle.Unspecified
+        val current = TextForegroundStyle.Unspecified
 
-        val other = TextDrawStyle.from(Color.Red)
+        val other = TextForegroundStyle.from(Color.Red)
         assertThat(current.merge(other).color).isEqualTo(Color.Red)
         assertThat(current.merge(other).brush).isNull()
 
-        val other2 = TextDrawStyle.from(defaultBrush, 1f)
+        val other2 = TextForegroundStyle.from(defaultBrush, 1f)
         assertThat(current.merge(other2).color).isEqualTo(Color.Unspecified)
         assertThat(current.merge(other2).brush).isEqualTo(defaultBrush)
     }
@@ -122,54 +122,56 @@
     // TODO(b/230787077): Update when Brush is stable.
     @Test
     fun `merging brush with color returns brush`() {
-        val current = TextDrawStyle.from(defaultBrush, 1f)
+        val current = TextForegroundStyle.from(defaultBrush, 1f)
 
-        val other = TextDrawStyle.from(Color.Red)
+        val other = TextForegroundStyle.from(Color.Red)
         assertThat(current.merge(other).color).isEqualTo(Color.Unspecified)
         assertThat(current.merge(other).brush).isEqualTo(defaultBrush)
     }
 
     @Test
     fun `merging color with brush returns brush`() {
-        val current = TextDrawStyle.from(Color.Red)
+        val current = TextForegroundStyle.from(Color.Red)
 
-        val other = TextDrawStyle.from(defaultBrush, 1f)
+        val other = TextForegroundStyle.from(defaultBrush, 1f)
         assertThat(current.merge(other).brush).isEqualTo(defaultBrush)
     }
 
     @Test
     fun `merging color with color returns color`() {
-        val current = TextDrawStyle.from(Color.Blue.copy(alpha = 0.7f))
+        val current = TextForegroundStyle.from(Color.Blue.copy(alpha = 0.7f))
 
-        val other = TextDrawStyle.from(Color.Red.copy(alpha = 0.5f))
+        val other = TextForegroundStyle.from(Color.Red.copy(alpha = 0.5f))
         assertThat(current.merge(other).color).isEqualTo(Color.Red.copy(alpha = 0.5f))
         assertThat(current.merge(other).alpha).isWithin(TOLERANCE).of(0.5f)
     }
 
     @Test
     fun `merging brush with brush returns brush`() {
-        val current = TextDrawStyle.from(defaultBrush, 0.7f)
+        val current = TextForegroundStyle.from(defaultBrush, 0.7f)
 
         val newBrush = Brush.linearGradient(listOf(Color.White, Color.Black))
-        val other = TextDrawStyle.from(newBrush, Float.NaN)
-        assertThat(current.merge(other).brush).isEqualTo(TextDrawStyle.from(newBrush, 0.7f).brush)
+        val other = TextForegroundStyle.from(newBrush, Float.NaN)
+        assertThat(current.merge(other).brush).isEqualTo(
+            TextForegroundStyle.from(newBrush, 0.7f).brush
+        )
         assertThat(current.merge(other).alpha).isWithin(TOLERANCE).of(0.7f)
     }
 
     @Test
     fun `lerps colors if both ends are not brush`() {
-        val start = TextDrawStyle.Unspecified
-        val stop = TextDrawStyle.from(Color.Red)
+        val start = TextForegroundStyle.Unspecified
+        val stop = TextForegroundStyle.from(Color.Red)
 
         assertThat(lerp(start, stop, fraction = 0.4f)).isEqualTo(
-            TextDrawStyle.from(lerp(Color.Unspecified, Color.Red, 0.4f))
+            TextForegroundStyle.from(lerp(Color.Unspecified, Color.Red, 0.4f))
         )
     }
 
     @Test
     fun `lerps discrete if one end is brush and the other end is color`() {
-        val start = TextDrawStyle.from(defaultBrush, 1f)
-        val stop = TextDrawStyle.from(Color.Red)
+        val start = TextForegroundStyle.from(defaultBrush, 1f)
+        val stop = TextForegroundStyle.from(Color.Red)
 
         assertThat(lerp(start, stop, fraction = 0.4f)).isEqualTo(
             lerpDiscrete(start, stop, 0.4f)
@@ -178,12 +180,12 @@
 
     @Test
     fun `lerps alpha if both ends are brush`() {
-        val start = TextDrawStyle.from(defaultBrush, 0.4f)
+        val start = TextForegroundStyle.from(defaultBrush, 0.4f)
         val newBrush = Brush.linearGradient(listOf(Color.White, Color.Black))
-        val stop = TextDrawStyle.from(newBrush, 0.7f)
+        val stop = TextForegroundStyle.from(newBrush, 0.7f)
 
         assertThat(lerp(start, stop, fraction = 0.6f)).isEqualTo(
-            TextDrawStyle.from(
+            TextForegroundStyle.from(
                 lerpDiscrete(defaultBrush, newBrush, 0.6f),
                 lerp(0.4f, 0.7f, 0.6f)
             )
diff --git a/compose/ui/ui/api/1.3.0-beta02.txt b/compose/ui/ui/api/1.3.0-beta02.txt
index 6014385..4e271a5 100644
--- a/compose/ui/ui/api/1.3.0-beta02.txt
+++ b/compose/ui/ui/api/1.3.0-beta02.txt
@@ -1851,9 +1851,6 @@
     property public abstract Object? parentData;
   }
 
-  public final class IntrinsicMeasurableKt {
-  }
-
   public interface IntrinsicMeasureScope extends androidx.compose.ui.unit.Density {
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
     property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
@@ -1973,9 +1970,6 @@
     method public default androidx.compose.ui.layout.MeasureResult layout(int width, int height, optional java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Placeable.PlacementScope,kotlin.Unit> placementBlock);
   }
 
-  public final class MeasureScopeKt {
-  }
-
   public interface Measured {
     method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
     method public int getMeasuredHeight();
@@ -1996,6 +1990,9 @@
     property public final androidx.compose.ui.Modifier modifier;
   }
 
+  public final class MultiContentMeasurePolicyKt {
+  }
+
   @kotlin.jvm.JvmDefaultWithCompatibility public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
     method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
   }
@@ -2223,6 +2220,9 @@
   public final class LayoutNodeLayoutDelegateKt {
   }
 
+  public final class MeasureScopeWithLayoutNodeKt {
+  }
+
   public final class ModifierNodeElementKt {
   }
 
diff --git a/compose/ui/ui/api/current.ignore b/compose/ui/ui/api/current.ignore
index d5a2e81..d3f9c1b 100644
--- a/compose/ui/ui/api/current.ignore
+++ b/compose/ui/ui/api/current.ignore
@@ -1,4 +1,10 @@
 // Baseline format: 1.0
+RemovedClass: androidx.compose.ui.layout.IntrinsicMeasurableKt:
+    Removed class androidx.compose.ui.layout.IntrinsicMeasurableKt
+RemovedClass: androidx.compose.ui.layout.MeasureScopeKt:
+    Removed class androidx.compose.ui.layout.MeasureScopeKt
+
+
 RemovedMethod: androidx.compose.ui.focus.FocusDirection.Companion#getIn():
     Removed method androidx.compose.ui.focus.FocusDirection.Companion.getIn()
 RemovedMethod: androidx.compose.ui.focus.FocusDirection.Companion#getOut():
diff --git a/compose/ui/ui/api/current.txt b/compose/ui/ui/api/current.txt
index 6014385..4e271a5 100644
--- a/compose/ui/ui/api/current.txt
+++ b/compose/ui/ui/api/current.txt
@@ -1851,9 +1851,6 @@
     property public abstract Object? parentData;
   }
 
-  public final class IntrinsicMeasurableKt {
-  }
-
   public interface IntrinsicMeasureScope extends androidx.compose.ui.unit.Density {
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
     property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
@@ -1973,9 +1970,6 @@
     method public default androidx.compose.ui.layout.MeasureResult layout(int width, int height, optional java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Placeable.PlacementScope,kotlin.Unit> placementBlock);
   }
 
-  public final class MeasureScopeKt {
-  }
-
   public interface Measured {
     method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
     method public int getMeasuredHeight();
@@ -1996,6 +1990,9 @@
     property public final androidx.compose.ui.Modifier modifier;
   }
 
+  public final class MultiContentMeasurePolicyKt {
+  }
+
   @kotlin.jvm.JvmDefaultWithCompatibility public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
     method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
   }
@@ -2223,6 +2220,9 @@
   public final class LayoutNodeLayoutDelegateKt {
   }
 
+  public final class MeasureScopeWithLayoutNodeKt {
+  }
+
   public final class ModifierNodeElementKt {
   }
 
diff --git a/compose/ui/ui/api/public_plus_experimental_1.3.0-beta02.txt b/compose/ui/ui/api/public_plus_experimental_1.3.0-beta02.txt
index a9d5767..5140da3 100644
--- a/compose/ui/ui/api/public_plus_experimental_1.3.0-beta02.txt
+++ b/compose/ui/ui/api/public_plus_experimental_1.3.0-beta02.txt
@@ -451,6 +451,8 @@
     method public boolean getCanFocus();
     method public default androidx.compose.ui.focus.FocusRequester getDown();
     method public default androidx.compose.ui.focus.FocusRequester getEnd();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> getEnter();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> getExit();
     method public default androidx.compose.ui.focus.FocusRequester getLeft();
     method public default androidx.compose.ui.focus.FocusRequester getNext();
     method public default androidx.compose.ui.focus.FocusRequester getPrevious();
@@ -460,6 +462,8 @@
     method public void setCanFocus(boolean);
     method public default void setDown(androidx.compose.ui.focus.FocusRequester);
     method public default void setEnd(androidx.compose.ui.focus.FocusRequester);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public default void setEnter(kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester>);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public default void setExit(kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester>);
     method public default void setLeft(androidx.compose.ui.focus.FocusRequester);
     method public default void setNext(androidx.compose.ui.focus.FocusRequester);
     method public default void setPrevious(androidx.compose.ui.focus.FocusRequester);
@@ -469,6 +473,8 @@
     property public abstract boolean canFocus;
     property public default androidx.compose.ui.focus.FocusRequester down;
     property public default androidx.compose.ui.focus.FocusRequester end;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> enter;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> exit;
     property public default androidx.compose.ui.focus.FocusRequester left;
     property public default androidx.compose.ui.focus.FocusRequester next;
     property public default androidx.compose.ui.focus.FocusRequester previous;
@@ -2018,9 +2024,6 @@
     property public abstract Object? parentData;
   }
 
-  public final class IntrinsicMeasurableKt {
-  }
-
   public interface IntrinsicMeasureScope extends androidx.compose.ui.unit.Density {
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
     property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
@@ -2093,6 +2096,7 @@
   public final class LayoutKt {
     method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
     method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.ExperimentalComposeUiApi @androidx.compose.ui.UiComposable public static inline void Layout(java.util.List<? extends kotlin.jvm.functions.Function0<kotlin.Unit>> contents, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MultiContentMeasurePolicy measurePolicy);
     method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void MultiMeasureLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
   }
 
@@ -2150,9 +2154,6 @@
     method public default androidx.compose.ui.layout.MeasureResult layout(int width, int height, optional java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Placeable.PlacementScope,kotlin.Unit> placementBlock);
   }
 
-  public final class MeasureScopeKt {
-  }
-
   public interface Measured {
     method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
     method public int getMeasuredHeight();
@@ -2173,6 +2174,17 @@
     property public final androidx.compose.ui.Modifier modifier;
   }
 
+  @androidx.compose.runtime.Stable @androidx.compose.ui.ExperimentalComposeUiApi public fun interface MultiContentMeasurePolicy {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int width);
+    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.Measurable>> measurables, long constraints);
+    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int width);
+    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int height);
+  }
+
+  public final class MultiContentMeasurePolicyKt {
+  }
+
   @kotlin.jvm.JvmDefaultWithCompatibility public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
     method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
   }
@@ -2475,6 +2487,9 @@
   public final class LayoutNodeLayoutDelegateKt {
   }
 
+  public final class MeasureScopeWithLayoutNodeKt {
+  }
+
   @androidx.compose.ui.ExperimentalComposeUiApi public abstract class ModifierNodeElement<N extends androidx.compose.ui.Modifier.Node> implements androidx.compose.ui.Modifier.Element {
     ctor public ModifierNodeElement(optional Object? params);
     method public abstract N create();
diff --git a/compose/ui/ui/api/public_plus_experimental_current.txt b/compose/ui/ui/api/public_plus_experimental_current.txt
index a9d5767..5140da3 100644
--- a/compose/ui/ui/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui/api/public_plus_experimental_current.txt
@@ -451,6 +451,8 @@
     method public boolean getCanFocus();
     method public default androidx.compose.ui.focus.FocusRequester getDown();
     method public default androidx.compose.ui.focus.FocusRequester getEnd();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> getEnter();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> getExit();
     method public default androidx.compose.ui.focus.FocusRequester getLeft();
     method public default androidx.compose.ui.focus.FocusRequester getNext();
     method public default androidx.compose.ui.focus.FocusRequester getPrevious();
@@ -460,6 +462,8 @@
     method public void setCanFocus(boolean);
     method public default void setDown(androidx.compose.ui.focus.FocusRequester);
     method public default void setEnd(androidx.compose.ui.focus.FocusRequester);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public default void setEnter(kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester>);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public default void setExit(kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester>);
     method public default void setLeft(androidx.compose.ui.focus.FocusRequester);
     method public default void setNext(androidx.compose.ui.focus.FocusRequester);
     method public default void setPrevious(androidx.compose.ui.focus.FocusRequester);
@@ -469,6 +473,8 @@
     property public abstract boolean canFocus;
     property public default androidx.compose.ui.focus.FocusRequester down;
     property public default androidx.compose.ui.focus.FocusRequester end;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> enter;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> exit;
     property public default androidx.compose.ui.focus.FocusRequester left;
     property public default androidx.compose.ui.focus.FocusRequester next;
     property public default androidx.compose.ui.focus.FocusRequester previous;
@@ -2018,9 +2024,6 @@
     property public abstract Object? parentData;
   }
 
-  public final class IntrinsicMeasurableKt {
-  }
-
   public interface IntrinsicMeasureScope extends androidx.compose.ui.unit.Density {
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
     property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
@@ -2093,6 +2096,7 @@
   public final class LayoutKt {
     method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
     method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.ExperimentalComposeUiApi @androidx.compose.ui.UiComposable public static inline void Layout(java.util.List<? extends kotlin.jvm.functions.Function0<kotlin.Unit>> contents, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MultiContentMeasurePolicy measurePolicy);
     method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void MultiMeasureLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
   }
 
@@ -2150,9 +2154,6 @@
     method public default androidx.compose.ui.layout.MeasureResult layout(int width, int height, optional java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Placeable.PlacementScope,kotlin.Unit> placementBlock);
   }
 
-  public final class MeasureScopeKt {
-  }
-
   public interface Measured {
     method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
     method public int getMeasuredHeight();
@@ -2173,6 +2174,17 @@
     property public final androidx.compose.ui.Modifier modifier;
   }
 
+  @androidx.compose.runtime.Stable @androidx.compose.ui.ExperimentalComposeUiApi public fun interface MultiContentMeasurePolicy {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int width);
+    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.Measurable>> measurables, long constraints);
+    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int width);
+    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int height);
+  }
+
+  public final class MultiContentMeasurePolicyKt {
+  }
+
   @kotlin.jvm.JvmDefaultWithCompatibility public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
     method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
   }
@@ -2475,6 +2487,9 @@
   public final class LayoutNodeLayoutDelegateKt {
   }
 
+  public final class MeasureScopeWithLayoutNodeKt {
+  }
+
   @androidx.compose.ui.ExperimentalComposeUiApi public abstract class ModifierNodeElement<N extends androidx.compose.ui.Modifier.Node> implements androidx.compose.ui.Modifier.Element {
     ctor public ModifierNodeElement(optional Object? params);
     method public abstract N create();
diff --git a/compose/ui/ui/api/restricted_1.3.0-beta02.txt b/compose/ui/ui/api/restricted_1.3.0-beta02.txt
index d724325..8fdcef9 100644
--- a/compose/ui/ui/api/restricted_1.3.0-beta02.txt
+++ b/compose/ui/ui/api/restricted_1.3.0-beta02.txt
@@ -1851,9 +1851,6 @@
     property public abstract Object? parentData;
   }
 
-  public final class IntrinsicMeasurableKt {
-  }
-
   public interface IntrinsicMeasureScope extends androidx.compose.ui.unit.Density {
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
     property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
@@ -1927,6 +1924,7 @@
     method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
     method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
     method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void MultiMeasureLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @kotlin.PublishedApi internal static kotlin.jvm.functions.Function0<kotlin.Unit> combineAsVirtualLayouts(java.util.List<? extends kotlin.jvm.functions.Function0<kotlin.Unit>> contents);
     method @kotlin.PublishedApi internal static kotlin.jvm.functions.Function1<androidx.compose.runtime.SkippableUpdater<androidx.compose.ui.node.ComposeUiNode>,kotlin.Unit> materializerOf(androidx.compose.ui.Modifier modifier);
   }
 
@@ -1974,9 +1972,6 @@
     method public default androidx.compose.ui.layout.MeasureResult layout(int width, int height, optional java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Placeable.PlacementScope,kotlin.Unit> placementBlock);
   }
 
-  public final class MeasureScopeKt {
-  }
-
   public interface Measured {
     method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
     method public int getMeasuredHeight();
@@ -1997,6 +1992,10 @@
     property public final androidx.compose.ui.Modifier modifier;
   }
 
+  public final class MultiContentMeasurePolicyKt {
+    method @kotlin.PublishedApi internal static androidx.compose.ui.layout.MeasurePolicy createMeasurePolicy(androidx.compose.ui.layout.MultiContentMeasurePolicy measurePolicy);
+  }
+
   @kotlin.jvm.JvmDefaultWithCompatibility public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
     method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
   }
@@ -2226,12 +2225,14 @@
     method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.layout.MeasurePolicy,kotlin.Unit> getSetMeasurePolicy();
     method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.Modifier,kotlin.Unit> getSetModifier();
     method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.platform.ViewConfiguration,kotlin.Unit> getSetViewConfiguration();
+    method public kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> getVirtualConstructor();
     property public final kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> Constructor;
     property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.Density,kotlin.Unit> SetDensity;
     property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> SetLayoutDirection;
     property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.layout.MeasurePolicy,kotlin.Unit> SetMeasurePolicy;
     property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.Modifier,kotlin.Unit> SetModifier;
     property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.platform.ViewConfiguration,kotlin.Unit> SetViewConfiguration;
+    property public final kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> VirtualConstructor;
   }
 
   public final class DelegatableNodeKt {
@@ -2258,6 +2259,9 @@
   public final class LayoutNodeLayoutDelegateKt {
   }
 
+  public final class MeasureScopeWithLayoutNodeKt {
+  }
+
   public final class ModifierNodeElementKt {
   }
 
diff --git a/compose/ui/ui/api/restricted_current.ignore b/compose/ui/ui/api/restricted_current.ignore
index d5a2e81..d3f9c1b 100644
--- a/compose/ui/ui/api/restricted_current.ignore
+++ b/compose/ui/ui/api/restricted_current.ignore
@@ -1,4 +1,10 @@
 // Baseline format: 1.0
+RemovedClass: androidx.compose.ui.layout.IntrinsicMeasurableKt:
+    Removed class androidx.compose.ui.layout.IntrinsicMeasurableKt
+RemovedClass: androidx.compose.ui.layout.MeasureScopeKt:
+    Removed class androidx.compose.ui.layout.MeasureScopeKt
+
+
 RemovedMethod: androidx.compose.ui.focus.FocusDirection.Companion#getIn():
     Removed method androidx.compose.ui.focus.FocusDirection.Companion.getIn()
 RemovedMethod: androidx.compose.ui.focus.FocusDirection.Companion#getOut():
diff --git a/compose/ui/ui/api/restricted_current.txt b/compose/ui/ui/api/restricted_current.txt
index d724325..8fdcef9 100644
--- a/compose/ui/ui/api/restricted_current.txt
+++ b/compose/ui/ui/api/restricted_current.txt
@@ -1851,9 +1851,6 @@
     property public abstract Object? parentData;
   }
 
-  public final class IntrinsicMeasurableKt {
-  }
-
   public interface IntrinsicMeasureScope extends androidx.compose.ui.unit.Density {
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
     property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
@@ -1927,6 +1924,7 @@
     method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
     method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
     method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void MultiMeasureLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @kotlin.PublishedApi internal static kotlin.jvm.functions.Function0<kotlin.Unit> combineAsVirtualLayouts(java.util.List<? extends kotlin.jvm.functions.Function0<kotlin.Unit>> contents);
     method @kotlin.PublishedApi internal static kotlin.jvm.functions.Function1<androidx.compose.runtime.SkippableUpdater<androidx.compose.ui.node.ComposeUiNode>,kotlin.Unit> materializerOf(androidx.compose.ui.Modifier modifier);
   }
 
@@ -1974,9 +1972,6 @@
     method public default androidx.compose.ui.layout.MeasureResult layout(int width, int height, optional java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Placeable.PlacementScope,kotlin.Unit> placementBlock);
   }
 
-  public final class MeasureScopeKt {
-  }
-
   public interface Measured {
     method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
     method public int getMeasuredHeight();
@@ -1997,6 +1992,10 @@
     property public final androidx.compose.ui.Modifier modifier;
   }
 
+  public final class MultiContentMeasurePolicyKt {
+    method @kotlin.PublishedApi internal static androidx.compose.ui.layout.MeasurePolicy createMeasurePolicy(androidx.compose.ui.layout.MultiContentMeasurePolicy measurePolicy);
+  }
+
   @kotlin.jvm.JvmDefaultWithCompatibility public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
     method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
   }
@@ -2226,12 +2225,14 @@
     method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.layout.MeasurePolicy,kotlin.Unit> getSetMeasurePolicy();
     method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.Modifier,kotlin.Unit> getSetModifier();
     method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.platform.ViewConfiguration,kotlin.Unit> getSetViewConfiguration();
+    method public kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> getVirtualConstructor();
     property public final kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> Constructor;
     property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.Density,kotlin.Unit> SetDensity;
     property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> SetLayoutDirection;
     property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.layout.MeasurePolicy,kotlin.Unit> SetMeasurePolicy;
     property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.Modifier,kotlin.Unit> SetModifier;
     property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.platform.ViewConfiguration,kotlin.Unit> SetViewConfiguration;
+    property public final kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> VirtualConstructor;
   }
 
   public final class DelegatableNodeKt {
@@ -2258,6 +2259,9 @@
   public final class LayoutNodeLayoutDelegateKt {
   }
 
+  public final class MeasureScopeWithLayoutNodeKt {
+  }
+
   public final class ModifierNodeElementKt {
   }
 
diff --git a/compose/ui/ui/build.gradle b/compose/ui/ui/build.gradle
index e6e683d..5d5d9f2 100644
--- a/compose/ui/ui/build.gradle
+++ b/compose/ui/ui/build.gradle
@@ -261,7 +261,6 @@
 tasks.withType(KotlinCompile).configureEach {
     kotlinOptions {
         freeCompilerArgs += [
-            "-opt-in=kotlin.Experimental",
             "-Xjvm-default=all"
         ]
     }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/FocusSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/FocusSamples.kt
index f6a22bb..57e97eb 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/FocusSamples.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/FocusSamples.kt
@@ -250,3 +250,36 @@
         Box(Modifier.focusTarget())
     }
 }
+
+@ExperimentalComposeUiApi
+@Sampled
+@Composable
+fun CustomFocusEnterSample() {
+    // If the row is focused, performing a moveFocus(Enter) will move focus to item2.
+    val item2 = remember { FocusRequester() }
+    Row(Modifier.focusProperties { enter = { item2 } }.focusable()) {
+        Box(Modifier.focusable())
+        Box(Modifier.focusRequester(item2).focusable())
+        Box(Modifier.focusable())
+    }
+}
+
+@ExperimentalComposeUiApi
+@Sampled
+@Composable
+fun CustomFocusExitSample() {
+    // If one of the boxes in Row1 is focused, performing a moveFocus(Exit)
+    // will move focus to the specified next item instead of moving focus to row1.
+    val nextItem = remember { FocusRequester() }
+    Column {
+        Row(Modifier.focusProperties { exit = { nextItem } }.focusable()) {
+            Box(Modifier.focusable())
+            Box(Modifier.focusable())
+            Box(Modifier.focusable())
+        }
+        Row(Modifier.focusable()) {
+            Box(Modifier.focusable())
+            Box(Modifier.focusRequester(nextItem).focusable())
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayoutSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayoutSample.kt
index ef27741..090367e 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayoutSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayoutSample.kt
@@ -21,6 +21,7 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.runtime.Composable
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
@@ -203,3 +204,36 @@
         Box(Modifier.fillMaxSize().background(Color.DarkGray))
     }
 }
+
+@OptIn(ExperimentalComposeUiApi::class)
+@Sampled
+@Composable
+fun LayoutWithMultipleContentsUsage(
+    content1: @Composable () -> Unit,
+    content2: @Composable () -> Unit,
+) {
+    // We can provide pass a list of two composable lambdas in order to be able to treat
+    // measureables from each lambda differently.
+    Layout(listOf(content1, content2)) { (content1Measurables, content2Measurables), constraints ->
+        val content1Placeables = content1Measurables.map { it.measure(constraints) }
+        val content2Placeables = content2Measurables.map { it.measure(constraints) }
+        layout(constraints.maxWidth, constraints.maxHeight) {
+            var currentX = 0
+            var currentY = 0
+            var currentMaxHeight = 0
+            // we place placeables from content1 as a first line
+            content1Placeables.forEach {
+                it.place(currentX, currentY)
+                currentX += it.width
+                currentMaxHeight = maxOf(currentMaxHeight, it.height)
+            }
+            currentX = 0
+            currentY = currentMaxHeight
+            // and placeables from content2 composable as a second line
+            content2Placeables.forEach {
+                it.place(currentX, currentY)
+                currentX += it.width
+            }
+        }
+    }
+}
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/CustomFocusTraversalTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/CustomFocusTraversalTest.kt
index db0cd95..c3f7bcc 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/CustomFocusTraversalTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/CustomFocusTraversalTest.kt
@@ -29,6 +29,7 @@
 import androidx.compose.ui.input.key.Key.Companion.DirectionDown
 import androidx.compose.ui.input.key.Key.Companion.DirectionLeft
 import androidx.compose.ui.input.key.Key.Companion.DirectionRight
+import androidx.compose.ui.input.key.Key.Companion.Enter
 import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.input.key.nativeKeyCode
 import androidx.compose.ui.platform.LocalFocusManager
@@ -475,6 +476,131 @@
     }
 
     @Test
+    fun focusProperties_enter() {
+        // Arrange.
+        var item1Focused = false
+        var item2Focused = false
+        var item3Focused = false
+        val (parent, item2) = FocusRequester.createRefs()
+        var directionThatTriggeredEnter: FocusDirection? = null
+        lateinit var focusManager: FocusManager
+        rule.setFocusableContent {
+            focusManager = LocalFocusManager.current
+            Row(
+                Modifier
+                    .focusRequester(parent)
+                    .focusProperties {
+                        enter = {
+                            directionThatTriggeredEnter = it
+                            item2
+                        }
+                    }
+                    .focusTarget()
+            ) {
+                Box(
+                    Modifier
+                        .onFocusChanged { item1Focused = it.isFocused }
+                        .focusTarget()
+                )
+                Box(
+                    Modifier
+                        .focusRequester(item2)
+                        .onFocusChanged { item2Focused = it.isFocused }
+                        .focusTarget()
+                )
+                Box(
+                    Modifier
+                        .onFocusChanged { item3Focused = it.isFocused }
+                        .focusTarget()
+                )
+            }
+        }
+        rule.runOnIdle { parent.requestFocus() }
+
+        // Act.
+        if (moveFocusProgrammatically) {
+            rule.runOnIdle {
+                focusManager.moveFocus(FocusDirection.Enter)
+            }
+        } else {
+            val nativeKeyEvent = AndroidKeyEvent(KeyDown, Enter.nativeKeyCode)
+            rule.onRoot().performKeyPress(KeyEvent(nativeKeyEvent))
+        }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(directionThatTriggeredEnter).isEqualTo(FocusDirection.Enter)
+            assertThat(item1Focused).isFalse()
+            assertThat(item2Focused).isTrue()
+            assertThat(item3Focused).isFalse()
+        }
+    }
+
+    @Test
+    fun focusProperties_exit() {
+        // Arrange.
+        var parentFocused = false
+        var item1Focused = false
+        var item2Focused = false
+        var item3Focused = false
+        val (item1, item3) = FocusRequester.createRefs()
+        var directionThatTriggeredEnter: FocusDirection? = null
+        lateinit var focusManager: FocusManager
+        rule.setFocusableContent {
+            focusManager = LocalFocusManager.current
+            Row(
+                Modifier
+                    .onFocusChanged { parentFocused = it.isFocused }
+                    .focusTarget()
+            ) {
+                Box(
+                    Modifier
+                        .focusRequester(item1)
+                        .onFocusChanged { item1Focused = it.isFocused }
+                        .focusProperties {
+                            enter = {
+                                directionThatTriggeredEnter = it
+                                item3
+                            }
+                        }
+                        .focusTarget()
+                )
+                Box(
+                    Modifier
+                        .onFocusChanged { item2Focused = it.isFocused }
+                        .focusTarget()
+                )
+                Box(
+                    Modifier
+                        .focusRequester(item3)
+                        .onFocusChanged { item3Focused = it.isFocused }
+                        .focusTarget()
+                )
+            }
+        }
+        rule.runOnIdle { item1.requestFocus() }
+
+        // Act.
+        if (moveFocusProgrammatically) {
+            rule.runOnIdle {
+                focusManager.moveFocus(FocusDirection.Enter)
+            }
+        } else {
+            val nativeKeyEvent = AndroidKeyEvent(KeyDown, Enter.nativeKeyCode)
+            rule.onRoot().performKeyPress(KeyEvent(nativeKeyEvent))
+        }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(directionThatTriggeredEnter).isEqualTo(FocusDirection.Enter)
+            assertThat(parentFocused).isFalse()
+            assertThat(item1Focused).isFalse()
+            assertThat(item2Focused).isFalse()
+            assertThat(item3Focused).isTrue()
+        }
+    }
+
+    @Test
     fun focusProperties_outermostParentWins() {
         // Arrange.
         var item1Focused = false
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusTestUtils.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusTestUtils.kt
index b899b37..cfb4a81 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusTestUtils.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusTestUtils.kt
@@ -56,11 +56,12 @@
     height: Int,
     focusRequester: FocusRequester? = null,
     deactivated: Boolean = false,
+    modifier: Modifier = Modifier,
     content: @Composable () -> Unit = {}
 ) {
     Layout(
         content = content,
-        modifier = Modifier
+        modifier = modifier
             .offset { IntOffset(x, y) }
             .focusRequester(focusRequester ?: remember { FocusRequester() })
             .onFocusChanged { isFocused.value = it.isFocused }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalEnterTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalEnterTest.kt
index 554dee3..dbe4f1f 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalEnterTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalEnterTest.kt
@@ -20,6 +20,7 @@
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusDirection.Companion.Enter
 import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.test.junit4.ComposeContentTestRule
@@ -197,6 +198,81 @@
         }
     }
 
+    /**
+     *      _________________________
+     *     |  focusedItem           |
+     *     |   ___________________  |
+     *     |  |  child           |  |
+     *     |  |   _____________  |  |
+     *     |  |  | grandchild |  |  |
+     *     |  |  |____________|  |  |
+     *     |  |__________________|  |
+     *     |________________________|
+     */
+    @Test
+    fun moveFocusEnter_deactivatedChild_withCustomEnter_canCancelFocus() {
+        // Arrange.
+        val (child, grandchild) = List(2) { mutableStateOf(false) }
+        rule.setContentForTest {
+            FocusableBox(focusedItem, 0, 0, 30, 30, initialFocus) {
+                val customEnter = Modifier.focusProperties { enter = { FocusRequester.Cancel } }
+                FocusableBox(child, 10, 10, 10, 10, deactivated = true, modifier = customEnter) {
+                    FocusableBox(grandchild, 10, 10, 10, 10)
+                }
+            }
+        }
+
+        // Act.
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(Enter) }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(movedFocusSuccessfully).isFalse()
+            assertThat(focusedItem.value).isTrue()
+            assertThat(child.value).isFalse()
+            assertThat(grandchild.value).isFalse()
+        }
+    }
+
+    /**
+     *      __________________________________________
+     *     |  focusedItem                            |
+     *     |   ____________________________________  |
+     *     |  |  child                            |  |
+     *     |  |   ______________   ______________ |  |
+     *     |  |  | grandchild1 |  | grandchild2 | |  |
+     *     |  |  |_____________|  |_____________| |  |
+     *     |  |___________________________________|  |
+     *     |_________________________________________|
+     */
+    @Test
+    fun moveFocusEnter_deactivatedChild_withCustomEnter_canRedirectFocusEnter() {
+        // Arrange.
+        val (child, grandchild1, grandchild2) = List(3) { mutableStateOf(false) }
+        val grandchild2Requester = FocusRequester()
+        rule.setContentForTest {
+            FocusableBox(focusedItem, 0, 0, 30, 30, initialFocus) {
+                val customEnter = Modifier.focusProperties { enter = { grandchild2Requester } }
+                FocusableBox(child, 10, 10, 10, 10, deactivated = true, modifier = customEnter) {
+                    FocusableBox(grandchild1, 10, 10, 10, 10)
+                    FocusableBox(grandchild2, 10, 10, 10, 10, grandchild2Requester)
+                }
+            }
+        }
+
+        // Act.
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(Enter) }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(movedFocusSuccessfully).isTrue()
+            assertThat(focusedItem.value).isFalse()
+            assertThat(child.value).isFalse()
+            assertThat(grandchild1.value).isFalse()
+            assertThat(grandchild2.value).isTrue()
+        }
+    }
+
     // TODO(b/176847718): After RTL support is added, add a similar test where the topRight child
     //  is focused.
     /**
@@ -279,6 +355,48 @@
         }
     }
 
+    /**
+     *      _______________________________________
+     *     |  focusedItem                         |
+     *     |   _________   _________   _________  |
+     *     |  | child1 |  | child2 |  | child3 |  |
+     *     |  |________|  |________|  |________|  |
+     *     |   _________   _________   _________  |
+     *     |  | child4 |  | child5 |  | child6 |  |
+     *     |  |________|  |________|  |________|  |
+     *     |______________________________________|
+     */
+    @Test
+    fun moveFocusEnter_customChildIsFocused() {
+        // Arrange.
+        val children = List(6) { mutableStateOf(false) }
+        val child3 = FocusRequester()
+        val customFocusEnter = Modifier.focusProperties { enter = { child3 } }
+        rule.setContentForTest {
+            FocusableBox(focusedItem, 0, 0, 70, 50, initialFocus, modifier = customFocusEnter) {
+                FocusableBox(children[0], 10, 10, 10, 10)
+                FocusableBox(children[1], 30, 10, 10, 10)
+                FocusableBox(children[2], 50, 10, 10, 10)
+                FocusableBox(children[3], 10, 30, 10, 10, child3)
+                FocusableBox(children[4], 30, 30, 10, 10)
+                FocusableBox(children[5], 50, 30, 10, 10)
+            }
+        }
+
+        // Act.
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(Enter) }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(movedFocusSuccessfully).isTrue()
+            assertThat(focusedItem.value).isFalse()
+            assertThat(children.values).isExactly(
+                false, false, false,
+                true, false, false
+            )
+        }
+    }
+
     private fun ComposeContentTestRule.setContentForTest(composable: @Composable () -> Unit) {
         setContent {
             focusManager = LocalFocusManager.current
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalExitTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalExitTest.kt
index ebb471a..701dd79 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalExitTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalExitTest.kt
@@ -19,6 +19,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusDirection.Companion.Down
 import androidx.compose.ui.focus.FocusDirection.Companion.Exit
 import androidx.compose.ui.focus.FocusDirection.Companion.Left
@@ -207,6 +208,80 @@
      *     |_________________________|
      */
     @Test
+    fun moveFocusExit_deactivatedParentCanCancelExit() {
+        // Arrange.
+        val (parent, grandparent) = List(2) { mutableStateOf(false) }
+        rule.setContentForTest {
+            FocusableBox(grandparent, 0, 0, 50, 50) {
+                val customExit = Modifier.focusProperties { exit = { FocusRequester.Cancel } }
+                FocusableBox(parent, 10, 10, 30, 30, deactivated = true) {
+                    FocusableBox(focusedItem, 10, 10, 10, 10, initialFocus, modifier = customExit)
+                }
+            }
+        }
+
+        // Act.
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(Exit) }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(movedFocusSuccessfully).isFalse()
+            assertThat(focusedItem.value).isTrue()
+            assertThat(parent.value).isFalse()
+            assertThat(grandparent.value).isFalse()
+        }
+    }
+
+    /**
+     *      __________________________      __________
+     *     |  grandparent            |     |  other  |
+     *     |   ____________________  |     |_________|
+     *     |  |  parent           |  |
+     *     |  |   ______________  |  |
+     *     |  |  | focusedItem |  |  |
+     *     |  |  |_____________|  |  |
+     *     |  |___________________|  |
+     *     |_________________________|
+     */
+    @Test
+    fun moveFocusExit_deactivatedParentCanRedirectExit() {
+        // Arrange.
+        val (parent, grandparent, other) = List(3) { mutableStateOf(false) }
+        val otherItem = FocusRequester()
+        rule.setContentForTest {
+            FocusableBox(grandparent, 0, 0, 50, 50) {
+                val customExit = Modifier.focusProperties { exit = { otherItem } }
+                FocusableBox(parent, 10, 10, 30, 30, deactivated = true) {
+                    FocusableBox(focusedItem, 10, 10, 10, 10, initialFocus, modifier = customExit) }
+                }
+                FocusableBox(other, x = 0, y = 60, width = 10, height = 10, otherItem)
+        }
+
+        // Act.
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(Exit) }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(movedFocusSuccessfully).isTrue()
+            assertThat(focusedItem.value).isFalse()
+            assertThat(parent.value).isFalse()
+            assertThat(grandparent.value).isFalse()
+            assertThat(other.value).isTrue()
+        }
+    }
+
+    /**
+     *      __________________________
+     *     |  grandparent            |
+     *     |   ____________________  |
+     *     |  |  parent           |  |
+     *     |  |   ______________  |  |
+     *     |  |  | focusedItem |  |  |
+     *     |  |  |_____________|  |  |
+     *     |  |___________________|  |
+     *     |_________________________|
+     */
+    @Test
     fun moveFocusExit_doesNotChangeIfAllParentsAreDeactivated() {
         // Arrange.
         val (parent, grandparent) = List(2) { mutableStateOf(false) }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt
index 89fc0bb..bfccce6 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt
@@ -23,6 +23,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusDirection.Companion.Down
 import androidx.compose.ui.focus.FocusDirection.Companion.Left
 import androidx.compose.ui.focus.FocusDirection.Companion.Right
@@ -228,7 +229,7 @@
     deactivated: Boolean = false,
     content: @Composable () -> Unit = {}
 ) {
-    FocusableBox(isFocused, 0, 0, 10, 10, focusRequester, deactivated, content)
+    FocusableBox(isFocused, 0, 0, 10, 10, focusRequester, deactivated, Modifier, content)
 }
 
 private val MutableList<MutableState<Boolean>>.values get() = this.map { it.value }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTest.kt
index e519805..5786317 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTest.kt
@@ -23,6 +23,7 @@
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusDirection.Companion.Down
 import androidx.compose.ui.focus.FocusDirection.Companion.Left
 import androidx.compose.ui.focus.FocusDirection.Companion.Right
@@ -424,7 +425,7 @@
     deactivated: Boolean = false,
     content: @Composable () -> Unit = {}
 ) {
-    FocusableBox(isFocused, x, y, width, height, focusRequester, deactivated, content)
+    FocusableBox(isFocused, x, y, width, height, focusRequester, deactivated, Modifier, content)
 }
 
 private val MutableList<MutableState<Boolean>>.values get() = this.map { it.value }
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/MultiContentLayoutTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/MultiContentLayoutTest.kt
new file mode 100644
index 0000000..3fc14dc
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/MultiContentLayoutTest.kt
@@ -0,0 +1,421 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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 androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.AndroidOwnerExtraAssertionsRule
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.TestActivity
+import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@OptIn(ExperimentalComposeUiApi::class)
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class MultiContentLayoutTest {
+
+    @get:Rule
+    val rule = createAndroidComposeRule<TestActivity>()
+
+    @get:Rule
+    val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
+
+    var size: Dp = Dp.Unspecified
+
+    @Before
+    fun before() {
+        size = with(rule.density) { 10.toDp() }
+    }
+
+    @Test
+    fun haveOneSlotWithOneItem() {
+        rule.setContent {
+            val first = @Composable {
+                Item(0)
+            }
+            Layout(
+                contents = listOf(first),
+                modifier = Modifier.size(100.dp)
+            ) { (firstSlot), constraints ->
+                assertThat(firstSlot.size).isEqualTo(1)
+                layoutAsRow(constraints, firstSlot)
+            }
+        }
+
+        assertItemsLaidOutAsRow(0..0)
+    }
+
+    @Test
+    fun haveOneSlotWithNoItems() {
+        rule.setContent {
+            val first = @Composable {}
+            Layout(
+                contents = listOf(first),
+                modifier = Modifier.size(100.dp)
+            ) { (firstSlot), constraints ->
+                assertThat(firstSlot.size).isEqualTo(0)
+                layoutAsRow(constraints, firstSlot)
+            }
+        }
+    }
+
+    @Test
+    fun haveOneSlotWithTwoItems() {
+        rule.setContent {
+            val first = @Composable {
+                Item(0)
+                Item(1)
+            }
+            Layout(
+                contents = listOf(first),
+                modifier = Modifier.size(100.dp)
+            ) { (firstSlot), constraints ->
+                assertThat(firstSlot.size).isEqualTo(2)
+                layoutAsRow(constraints, firstSlot)
+            }
+        }
+
+        assertItemsLaidOutAsRow(0..1)
+    }
+
+    @Test
+    fun haveTwoSlotsWithOneItem() {
+        rule.setContent {
+            val first = @Composable {
+                Item(0)
+            }
+            val second = @Composable {
+                Item(1)
+            }
+            Layout(
+                contents = listOf(first, second),
+                modifier = Modifier.size(100.dp)
+            ) { (firstSlot, secondSlot), constraints ->
+                assertThat(firstSlot.size).isEqualTo(1)
+                assertThat(secondSlot.size).isEqualTo(1)
+                layoutAsRow(constraints, firstSlot + secondSlot)
+            }
+        }
+
+        assertItemsLaidOutAsRow(0..1)
+    }
+
+    @Test
+    fun haveTwoSlotsWithNoItemsInOne() {
+        rule.setContent {
+            val first = @Composable {
+                Item(0)
+            }
+            val second = @Composable {}
+            Layout(
+                contents = listOf(first, second),
+                modifier = Modifier.size(100.dp)
+            ) { (firstSlot, secondSlot), constraints ->
+                assertThat(firstSlot.size).isEqualTo(1)
+                assertThat(secondSlot.size).isEqualTo(0)
+                layoutAsRow(constraints, firstSlot + secondSlot)
+            }
+        }
+
+        assertItemsLaidOutAsRow(0..0)
+    }
+
+    @Test
+    fun haveTwoSlotsWithDifferentNumberOfItems() {
+        rule.setContent {
+            val first = @Composable {
+                Item(0)
+                Item(1)
+            }
+            val second = @Composable {
+                Item(2)
+            }
+            Layout(
+                contents = listOf(first, second),
+                modifier = Modifier.size(100.dp)
+            ) { (firstSlot, secondSlot), constraints ->
+                assertThat(firstSlot.size).isEqualTo(2)
+                assertThat(secondSlot.size).isEqualTo(1)
+                layoutAsRow(constraints, firstSlot + secondSlot)
+            }
+        }
+
+        assertItemsLaidOutAsRow(0..2)
+    }
+
+    @Test
+    fun haveFiveSlots() {
+        rule.setContent {
+            val first = @Composable {
+                Item(0)
+            }
+            val second = @Composable {
+                Item(1)
+            }
+            val third = @Composable {
+                Item(2)
+                Item(3)
+            }
+            val fourth = @Composable {}
+            val fifth = @Composable {
+                Item(4)
+            }
+            Layout(
+                contents = listOf(first, second, third, fourth, fifth),
+                modifier = Modifier.size(100.dp)
+            ) { (firstSlot, secondSlot, thirdSlot, fourthSlot, fifthSlot), constraints ->
+                assertThat(firstSlot.size).isEqualTo(1)
+                assertThat(secondSlot.size).isEqualTo(1)
+                assertThat(thirdSlot.size).isEqualTo(2)
+                assertThat(fourthSlot.size).isEqualTo(0)
+                assertThat(fifthSlot.size).isEqualTo(1)
+                layoutAsRow(
+                    constraints,
+                    firstSlot + secondSlot + thirdSlot + fourthSlot + fifthSlot
+                )
+            }
+        }
+
+        assertItemsLaidOutAsRow(0..4)
+    }
+
+    @Test
+    fun updatingItemCount() {
+        var itemCount by mutableStateOf(1)
+        rule.setContent {
+            val first = @Composable {
+                repeat(itemCount) {
+                    Item(it)
+                }
+            }
+            Layout(
+                contents = listOf(first),
+                modifier = Modifier.size(100.dp)
+            ) { (firstSlot), constraints ->
+                layoutAsRow(constraints, firstSlot)
+            }
+        }
+
+        assertItemsLaidOutAsRow(0..0)
+
+        rule.runOnIdle {
+            itemCount = 3
+        }
+
+        assertItemsLaidOutAsRow(0..2)
+    }
+
+    @Test
+    fun updatingSlotCount() {
+        var slotCount by mutableStateOf(1)
+        rule.setContent {
+            val contents = buildList<@Composable () -> Unit> {
+                repeat(slotCount) {
+                    add {
+                        Item(it)
+                    }
+                }
+            }
+            Layout(
+                contents = contents,
+                modifier = Modifier.size(100.dp)
+            ) { slots, constraints ->
+                assertThat(slots.size).isEqualTo(contents.size)
+                layoutAsRow(constraints, slots.flatten())
+            }
+        }
+
+        assertItemsLaidOutAsRow(0..0)
+
+        rule.runOnIdle {
+            slotCount = 3
+        }
+
+        assertItemsLaidOutAsRow(0..2)
+    }
+
+    @Test
+    fun defaultIntrinsics() {
+        rule.setContent {
+            Layout({
+                val first = @Composable {
+                    BoxWithIntrinsics(1, 2, 100, 200)
+                    BoxWithIntrinsics(4, 3, 300, 400)
+                }
+                val second = @Composable {
+                    BoxWithIntrinsics(10, 11, 12, 13)
+                }
+                Layout(
+                    contents = listOf(first, second)
+                ) { (_, secondSlot), constraints ->
+                    val placeable = secondSlot.first().measure(constraints)
+                    layout(placeable.width, placeable.height) {
+                        placeable.place(0, 0)
+                    }
+                }
+            }) { measurables, _ ->
+                val box = measurables[0]
+                assertThat(box.minIntrinsicWidth(1000)).isEqualTo(10)
+                assertThat(box.minIntrinsicHeight(1000)).isEqualTo(11)
+                assertThat(box.maxIntrinsicWidth(1000)).isEqualTo(12)
+                assertThat(box.maxIntrinsicHeight(1000)).isEqualTo(13)
+                layout(10, 10) { }
+            }
+        }
+    }
+
+    @Test
+    fun customIntrinsics() {
+        rule.setContent {
+            Layout({
+                val first = @Composable {
+                    BoxWithIntrinsics(1, 2, 100, 200)
+                    BoxWithIntrinsics(4, 3, 300, 400)
+                }
+                val second = @Composable {
+                    BoxWithIntrinsics(10, 11, 12, 13)
+                }
+                Layout(
+                    contents = listOf(first, second),
+                    measurePolicy = object : MultiContentMeasurePolicy {
+                        override fun MeasureScope.measure(
+                            measurables: List<List<Measurable>>,
+                            constraints: Constraints
+                        ) = throw IllegalStateException("shouldn't be called")
+
+                        override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                            measurables: List<List<IntrinsicMeasurable>>,
+                            height: Int
+                        ): Int = measurables[1].first().minIntrinsicWidth(height)
+
+                        override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                            measurables: List<List<IntrinsicMeasurable>>,
+                            width: Int
+                        ): Int = measurables[1].first().minIntrinsicHeight(width)
+
+                        override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                            measurables: List<List<IntrinsicMeasurable>>,
+                            height: Int
+                        ): Int = measurables[1].first().maxIntrinsicWidth(height)
+
+                        override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                            measurables: List<List<IntrinsicMeasurable>>,
+                            width: Int
+                        ): Int = measurables[1].first().maxIntrinsicHeight(width)
+                    }
+                )
+            }) { measurables, _ ->
+                val box = measurables[0]
+                assertThat(box.minIntrinsicWidth(1000)).isEqualTo(10)
+                assertThat(box.minIntrinsicHeight(1000)).isEqualTo(11)
+                assertThat(box.maxIntrinsicWidth(1000)).isEqualTo(12)
+                assertThat(box.maxIntrinsicHeight(1000)).isEqualTo(13)
+                layout(10, 10) { }
+            }
+        }
+    }
+
+    private fun assertItemsLaidOutAsRow(intRange: IntRange) {
+        var currentX = 0.dp
+        intRange.forEach {
+            rule.onNodeWithTag("$it")
+                .assertLeftPositionInRootIsEqualTo(currentX)
+                .assertTopPositionInRootIsEqualTo(0.dp)
+            currentX += size
+        }
+
+        rule.onNodeWithTag("${intRange.first - 1}")
+            .assertDoesNotExist()
+        rule.onNodeWithTag("${intRange.last + 1}")
+            .assertDoesNotExist()
+    }
+
+    @Composable
+    fun Item(id: Int) {
+        Box(
+            Modifier
+                .size(size)
+                .testTag("$id"))
+    }
+}
+
+private fun MeasureScope.layoutAsRow(
+    constraints: Constraints,
+    list: List<Measurable>
+): MeasureResult {
+    val childConstraints =
+        Constraints(maxWidth = constraints.maxWidth, maxHeight = constraints.maxHeight)
+    return layout(constraints.maxWidth, constraints.maxHeight) {
+        var currentX = 0
+        list.forEach {
+            val placeable = it.measure(childConstraints)
+            placeable.place(currentX, 0)
+            currentX += placeable.width
+        }
+    }
+}
+
+@Composable
+private fun BoxWithIntrinsics(minWidth: Int, minHeight: Int, maxWidth: Int, maxHeight: Int) {
+    Layout(measurePolicy = object : MeasurePolicy {
+        override fun MeasureScope.measure(
+            measurables: List<Measurable>,
+            constraints: Constraints
+        ): MeasureResult {
+            TODO("Not yet implemented")
+        }
+
+        override fun IntrinsicMeasureScope.minIntrinsicWidth(
+            measurables: List<IntrinsicMeasurable>,
+            height: Int
+        ) = minWidth
+
+        override fun IntrinsicMeasureScope.minIntrinsicHeight(
+            measurables: List<IntrinsicMeasurable>,
+            width: Int
+        ) = minHeight
+
+        override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+            measurables: List<IntrinsicMeasurable>,
+            height: Int
+        ) = maxWidth
+
+        override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+            measurables: List<IntrinsicMeasurable>,
+            width: Int
+        ) = maxHeight
+    })
+}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOrderModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOrderModifier.kt
index 757323d..f011da1 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOrderModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOrderModifier.kt
@@ -18,10 +18,18 @@
 
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusDirection.Companion.Down
 import androidx.compose.ui.focus.FocusDirection.Companion.Enter
 import androidx.compose.ui.focus.FocusDirection.Companion.Exit
+import androidx.compose.ui.focus.FocusDirection.Companion.Left
+import androidx.compose.ui.focus.FocusDirection.Companion.Next
+import androidx.compose.ui.focus.FocusDirection.Companion.Previous
+import androidx.compose.ui.focus.FocusDirection.Companion.Right
+import androidx.compose.ui.focus.FocusDirection.Companion.Up
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.internal.JvmDefaultWithCompatibility
+import androidx.compose.ui.unit.LayoutDirection.Ltr
+import androidx.compose.ui.unit.LayoutDirection.Rtl
 
 /**
  * A [modifier][Modifier.Element] that can be used to set a custom focus traversal order.
@@ -199,23 +207,27 @@
  * Search up the component tree for any parent/parents that have specified a custom focus order.
  * Allowing parents higher up the hierarchy to overwrite the focus order specified by their
  * children.
+ *
+ * @param focusDirection the focus direction passed to [FocusManager.moveFocus] that triggered this
+ * focus search.
+ * @param layoutDirection the current system [LayoutDirection].
  */
 internal fun FocusModifier.customFocusSearch(
     focusDirection: FocusDirection,
     layoutDirection: LayoutDirection
 ): FocusRequester {
     return when (focusDirection) {
-        FocusDirection.Next -> focusProperties.next
-        FocusDirection.Previous -> focusProperties.previous
-        FocusDirection.Up -> focusProperties.up
-        FocusDirection.Down -> focusProperties.down
-        FocusDirection.Left -> when (layoutDirection) {
-            LayoutDirection.Ltr -> focusProperties.start
-            LayoutDirection.Rtl -> focusProperties.end
+        Next -> focusProperties.next
+        Previous -> focusProperties.previous
+        Up -> focusProperties.up
+        Down -> focusProperties.down
+        Left -> when (layoutDirection) {
+            Ltr -> focusProperties.start
+            Rtl -> focusProperties.end
         }.takeUnless { it == FocusRequester.Default } ?: focusProperties.left
-        FocusDirection.Right -> when (layoutDirection) {
-            LayoutDirection.Ltr -> focusProperties.end
-            LayoutDirection.Rtl -> focusProperties.start
+        Right -> when (layoutDirection) {
+            Ltr -> focusProperties.end
+            Rtl -> focusProperties.start
         }.takeUnless { it == FocusRequester.Default } ?: focusProperties.right
         // TODO(b/183746982): add focus order API for "In" and "Out".
         //  Developers can to specify a custom "In" to specify which child should be visited when
@@ -223,9 +235,15 @@
         //  Developers can specify a custom "Out" to specify which composable should take focus
         //  when the user presses the back button.
         @OptIn(ExperimentalComposeUiApi::class)
-        Enter -> FocusRequester.Default
+        Enter -> {
+            @OptIn(ExperimentalComposeUiApi::class)
+            focusProperties.enter(focusDirection)
+        }
         @OptIn(ExperimentalComposeUiApi::class)
-        Exit -> FocusRequester.Default
+        Exit -> {
+            @OptIn(ExperimentalComposeUiApi::class)
+            focusProperties.exit(focusDirection)
+        }
         else -> error("invalid FocusDirection")
     }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusProperties.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusProperties.kt
index baa4e97..54178d3 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusProperties.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusProperties.kt
@@ -20,6 +20,7 @@
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.modifier.ModifierLocalConsumer
 import androidx.compose.ui.modifier.ModifierLocalProvider
@@ -37,46 +38,6 @@
 internal val ModifierLocalFocusProperties =
     modifierLocalOf<FocusPropertiesModifier?> { null }
 
-internal object DefaultFocusProperties : FocusProperties {
-    override var canFocus: Boolean
-        get() = true
-        set(_) = noSet()
-
-    override var next: FocusRequester
-        get() = FocusRequester.Default
-        set(_) = noSet()
-
-    override var previous: FocusRequester
-        get() = FocusRequester.Default
-        set(_) = noSet()
-
-    override var up: FocusRequester
-        get() = FocusRequester.Default
-        set(_) = noSet()
-
-    override var down: FocusRequester
-        get() = FocusRequester.Default
-        set(_) = noSet()
-
-    override var left: FocusRequester
-        get() = FocusRequester.Default
-        set(_) = noSet()
-
-    override var right: FocusRequester
-        get() = FocusRequester.Default
-        set(_) = noSet()
-
-    override var start: FocusRequester
-        get() = FocusRequester.Default
-        set(_) = noSet()
-
-    override var end: FocusRequester
-        get() = FocusRequester.Default
-        set(_) = noSet()
-
-    private fun noSet(): Nothing = error("Attempting to change DefaultFocusProperties")
-}
-
 /**
  * Properties that are applied to [focusTarget]s that can read the [ModifierLocalFocusProperties]
  * Modifier Local.
@@ -164,6 +125,51 @@
     var end: FocusRequester
         get() = FocusRequester.Default
         set(_) {}
+
+    /**
+     * A custom item to be used when the user requests focus to move focus in
+     * ([FocusDirection.Enter]). An automatic [Enter][FocusDirection.Enter]"
+     * can be triggered when we move focus to a focus group that is not itself focusable. In this
+     * case, users can use the  the focus direction that triggered the move in to determine the
+     * next item to be focused on.
+     *
+     * When you set the [enter] property, provide a lambda that takes the FocusDirection that
+     * triggered the enter as an input, and provides a [FocusRequester] as an output. You can
+     * return a custom destination by providing a [FocusRequester] attached to that destination,
+     * a [Cancel][FocusRequester.Cancel] to cancel the focus enter or
+     * [Default][FocusRequester.Default] to use the default focus enter behavior.
+     *
+     * @sample androidx.compose.ui.samples.CustomFocusEnterSample
+     */
+    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
+    @get:ExperimentalComposeUiApi
+    @set:ExperimentalComposeUiApi
+    @ExperimentalComposeUiApi
+    var enter: (FocusDirection) -> FocusRequester
+        get() = { FocusRequester.Default }
+        set(_) {}
+
+    /**
+     * A custom item to be used when the user requests focus to move out ([FocusDirection.Exit]).
+     * An automatic [Exit][FocusDirection.Exit] can be triggered when we move focus outside the edge
+     * of a parent. In this case, users can use the  the focus direction that triggered the move out
+     * to determine the next focus destination.
+     *
+     * When you set the [exit] property, provide a lambda that takes the FocusDirection that
+     * triggered the exit as an input, and provides a [FocusRequester] as an output. You can
+     * return a custom destination by providing a [FocusRequester] attached to that destination,
+     * a [Cancel][FocusRequester.Cancel] to cancel the focus exit or
+     * [Default][FocusRequester.Default] to use the default focus exit behavior.
+     *
+     * @sample androidx.compose.ui.samples.CustomFocusExitSample
+     */
+    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
+    @get:ExperimentalComposeUiApi
+    @set:ExperimentalComposeUiApi
+    @ExperimentalComposeUiApi
+    var exit: (FocusDirection) -> FocusRequester
+        get() = { FocusRequester.Default }
+        set(_) {}
 }
 
 /**
@@ -229,6 +235,10 @@
     override var right: FocusRequester = FocusRequester.Default
     override var start: FocusRequester = FocusRequester.Default
     override var end: FocusRequester = FocusRequester.Default
+    @OptIn(ExperimentalComposeUiApi::class)
+    override var enter: (FocusDirection) -> FocusRequester = { FocusRequester.Default }
+    @OptIn(ExperimentalComposeUiApi::class)
+    override var exit: (FocusDirection) -> FocusRequester = { FocusRequester.Default }
 }
 
 internal fun FocusProperties.clear() {
@@ -241,6 +251,10 @@
     right = FocusRequester.Default
     start = FocusRequester.Default
     end = FocusRequester.Default
+    @OptIn(ExperimentalComposeUiApi::class)
+    enter = { FocusRequester.Default }
+    @OptIn(ExperimentalComposeUiApi::class)
+    exit = { FocusRequester.Default }
 }
 
 internal fun FocusModifier.refreshFocusProperties() {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt
index 4fc85a2..4e8d3db 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt
@@ -27,6 +27,8 @@
 import androidx.compose.ui.focus.FocusDirection.Companion.Previous
 import androidx.compose.ui.focus.FocusDirection.Companion.Right
 import androidx.compose.ui.focus.FocusDirection.Companion.Up
+import androidx.compose.ui.focus.FocusRequester.Companion.Cancel
+import androidx.compose.ui.focus.FocusRequester.Companion.Default
 import androidx.compose.ui.focus.FocusStateImpl.Active
 import androidx.compose.ui.focus.FocusStateImpl.ActiveParent
 import androidx.compose.ui.focus.FocusStateImpl.Captured
@@ -220,7 +222,8 @@
 } ?: Rect.Zero
 /**
  * Returns all [FocusModifier] children that are not [FocusStateImpl.isDeactivated]. Any
- * child that is deactivated will add activated children instead.
+ * child that is deactivated will add activated children instead, unless the deactivated
+ * node has a custom Enter specified.
  */
 internal fun FocusModifier.activatedChildren(): MutableVector<FocusModifier> {
     if (!children.any { it.focusState.isDeactivated }) {
@@ -231,7 +234,16 @@
         if (!child.focusState.isDeactivated) {
             activated += child
         } else {
-            activated.addAll(child.activatedChildren())
+            // When we encounter a deactivated child, we add all its children,
+            // unless a custom Enter is specified.
+            @OptIn(ExperimentalComposeUiApi::class)
+            when (val customEnter = child.focusProperties.enter(Enter)) {
+                Cancel -> return mutableVectorOf()
+                Default -> activated.addAll(child.activatedChildren())
+                else -> customEnter.focusRequesterModifierLocals.forEach {
+                    it.findFocusNode()?.let { activated.add(it) }
+                }
+            }
         }
     }
     return activated
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt
index 20d6fb2..f90c773 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt
@@ -17,10 +17,14 @@
 package androidx.compose.ui.focus
 
 import androidx.compose.runtime.collection.MutableVector
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.focus.FocusDirection.Companion.Down
+import androidx.compose.ui.focus.FocusDirection.Companion.Exit
 import androidx.compose.ui.focus.FocusDirection.Companion.Left
 import androidx.compose.ui.focus.FocusDirection.Companion.Right
 import androidx.compose.ui.focus.FocusDirection.Companion.Up
+import androidx.compose.ui.focus.FocusRequester.Companion.Cancel
+import androidx.compose.ui.focus.FocusRequester.Companion.Default
 import androidx.compose.ui.focus.FocusStateImpl.Active
 import androidx.compose.ui.focus.FocusStateImpl.ActiveParent
 import androidx.compose.ui.focus.FocusStateImpl.Captured
@@ -56,11 +60,37 @@
             // children and search among the siblings of the focused item by calling
             // "searchChildren" on this node.
             when (focusedChild.focusState) {
-                // If the focusedChild is an intermediate parent, we continue searching among its
-                // children. If we don't find a match, we search among the siblings of the parent.
-                ActiveParent, DeactivatedParent ->
-                  return focusedChild.twoDimensionalFocusSearch(direction, onFound) ||
-                      generateAndSearchChildren(focusedChild.activeNode(), direction, onFound)
+
+                ActiveParent, DeactivatedParent -> {
+                    // If the focusedChild is an intermediate parent,
+                    // we continue searching among its children.
+                    if (focusedChild.twoDimensionalFocusSearch(direction, onFound)) return true
+
+                    @OptIn(ExperimentalComposeUiApi::class)
+                    if (direction == Exit) {
+                        when (val exit = focusedChild.focusProperties.exit(direction)) {
+                            Cancel -> return false
+                            Default -> {
+                                // If we don't have a custom destination,
+                                // we search among the siblings of the parent.
+                                val activeNode = focusedChild.activeNode()
+                                return generateAndSearchChildren(activeNode, direction, onFound)
+                            }
+                            else -> {
+                                var success = false
+                                exit.focusRequesterModifierLocals.forEach {
+                                    it.findFocusNode()?.let {
+                                        success = onFound.invoke(it) || success
+                                    }
+                                }
+                                return success
+                            }
+                        }
+                    }
+
+                    // If we don't find a match, we search among the siblings of the parent.
+                    return generateAndSearchChildren(focusedChild.activeNode(), direction, onFound)
+                }
                 // Search for the next eligible sibling.
                 Active, Captured ->
                     return generateAndSearchChildren(focusedChild, direction, onFound)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/IntrinsicMeasurable.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/IntrinsicMeasurable.kt
index 015a321..a8269da 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/IntrinsicMeasurable.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/IntrinsicMeasurable.kt
@@ -50,12 +50,3 @@
      */
     fun maxIntrinsicHeight(width: Int): Int
 }
-
-/**
- * A function for performing intrinsic measurement.
- */
-@Deprecated(
-    "IntrinsicMeasureBlock was deprecated. See MeasurePolicy and the new Layout overloads."
-)
-internal typealias IntrinsicMeasureBlock =
-    IntrinsicMeasureScope.(List<IntrinsicMeasurable>, Int) -> Int
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Layout.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Layout.kt
index 8732489..2c7edff 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Layout.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Layout.kt
@@ -23,23 +23,23 @@
 import androidx.compose.runtime.ReusableComposeNode
 import androidx.compose.runtime.SkippableUpdater
 import androidx.compose.runtime.currentComposer
+import androidx.compose.runtime.remember
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.UiComposable
 import androidx.compose.ui.graphics.GraphicsLayerScope
 import androidx.compose.ui.materialize
 import androidx.compose.ui.node.ComposeUiNode
 import androidx.compose.ui.node.LayoutNode
-import androidx.compose.ui.node.MeasureBlocks
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.LocalViewConfiguration
-import androidx.compose.ui.platform.simpleIdentityToString
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.util.fastForEach
 
 /**
  * [Layout] is the main core component for layout. It can be used to measure and position
@@ -134,88 +134,55 @@
     )
 }
 
-@Suppress("ComposableLambdaParameterPosition")
-@Composable
+/**
+ * [Layout] is the main core component for layout for "leaf" nodes. It can be used to measure and
+ * position zero children.
+ *
+ * This overload accepts a list of multiple composable content lambdas, which allows to threat
+ * measurables put into different content lambdas differently - measure policy will provide
+ * a list of lists of Measurables, not just a single list. Such list has the same size
+ * as the list of contents passed into [Layout] and contains the list of measurables
+ * of the corresponding content lambda in the same order.
+ *
+ * Note that layouts emitted as part of all [contents] lambdas will be added as a direct children
+ * for this [Layout]. This means that if you set a custom z index on some children, the drawing
+ * order will be calculated as if they were all provided as part of one lambda.
+ *
+ * Example usage:
+ * @sample androidx.compose.ui.samples.LayoutWithMultipleContentsUsage
+ *
+ * @param contents The list of children composable contents to be laid out.
+ * @param modifier Modifiers to be applied to the layout.
+ * @param measurePolicy The policy defining the measurement and positioning of the layout.
+ *
+ * @see Layout for a simpler use case when you have only one content lambda.
+ */
+@ExperimentalComposeUiApi
+@Suppress("ComposableLambdaParameterPosition", "NOTHING_TO_INLINE")
 @UiComposable
-@Deprecated(
-    "This composable was deprecated. Please use the alternative Layout overloads instead."
-)
-internal fun Layout(
-    content: @Composable @UiComposable () -> Unit,
-    minIntrinsicWidthMeasureBlock: IntrinsicMeasureBlock,
-    minIntrinsicHeightMeasureBlock: IntrinsicMeasureBlock,
-    maxIntrinsicWidthMeasureBlock: IntrinsicMeasureBlock,
-    maxIntrinsicHeightMeasureBlock: IntrinsicMeasureBlock,
+@Composable
+inline fun Layout(
+    contents: List<@Composable @UiComposable () -> Unit>,
     modifier: Modifier = Modifier,
-    measureBlock: MeasureBlock
+    measurePolicy: MultiContentMeasurePolicy
 ) {
-    val measurePolicy = object : MeasurePolicy {
-        override fun MeasureScope.measure(
-            measurables: List<Measurable>,
-            constraints: Constraints
-        ) = measureBlock(this, measurables, constraints)
-
-        override fun IntrinsicMeasureScope.minIntrinsicWidth(
-            measurables: List<IntrinsicMeasurable>,
-            height: Int
-        ) = minIntrinsicWidthMeasureBlock(this, measurables, height)
-
-        override fun IntrinsicMeasureScope.minIntrinsicHeight(
-            measurables: List<IntrinsicMeasurable>,
-            width: Int
-        ) = minIntrinsicHeightMeasureBlock(this, measurables, width)
-
-        override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-            measurables: List<IntrinsicMeasurable>,
-            height: Int
-        ) = maxIntrinsicWidthMeasureBlock(this, measurables, height)
-
-        override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-            measurables: List<IntrinsicMeasurable>,
-            width: Int
-        ) = maxIntrinsicHeightMeasureBlock(this, measurables, width)
-    }
-
-    Layout(content, modifier, measurePolicy)
+    Layout(
+        content = combineAsVirtualLayouts(contents),
+        modifier = modifier,
+        measurePolicy = remember(measurePolicy) { createMeasurePolicy(measurePolicy) }
+    )
 }
 
-@Deprecated(
-    "MeasureBlocks was deprecated. Please use MeasurePolicy and the Layout overloads using " +
-        "it instead."
-)
-internal fun measureBlocksOf(
-    minIntrinsicWidthMeasureBlock: IntrinsicMeasureBlock,
-    minIntrinsicHeightMeasureBlock: IntrinsicMeasureBlock,
-    maxIntrinsicWidthMeasureBlock: IntrinsicMeasureBlock,
-    maxIntrinsicHeightMeasureBlock: IntrinsicMeasureBlock,
-    measureBlock: MeasureBlock
-): MeasureBlocks {
-    return object : MeasureBlocks {
-        override fun measure(
-            measureScope: MeasureScope,
-            measurables: List<Measurable>,
-            constraints: Constraints
-        ) = measureScope.measureBlock(measurables, constraints)
-        override fun minIntrinsicWidth(
-            intrinsicMeasureScope: IntrinsicMeasureScope,
-            measurables: List<IntrinsicMeasurable>,
-            h: Int
-        ) = intrinsicMeasureScope.minIntrinsicWidthMeasureBlock(measurables, h)
-        override fun minIntrinsicHeight(
-            intrinsicMeasureScope: IntrinsicMeasureScope,
-            measurables: List<IntrinsicMeasurable>,
-            w: Int
-        ) = intrinsicMeasureScope.minIntrinsicHeightMeasureBlock(measurables, w)
-        override fun maxIntrinsicWidth(
-            intrinsicMeasureScope: IntrinsicMeasureScope,
-            measurables: List<IntrinsicMeasurable>,
-            h: Int
-        ) = intrinsicMeasureScope.maxIntrinsicWidthMeasureBlock(measurables, h)
-        override fun maxIntrinsicHeight(
-            intrinsicMeasureScope: IntrinsicMeasureScope,
-            measurables: List<IntrinsicMeasurable>,
-            w: Int
-        ) = intrinsicMeasureScope.maxIntrinsicHeightMeasureBlock(measurables, w)
+@PublishedApi
+internal fun combineAsVirtualLayouts(
+    contents: List<@Composable @UiComposable () -> Unit>
+): @Composable @UiComposable () -> Unit = {
+    contents.fastForEach { content ->
+        ReusableComposeNode<ComposeUiNode, Applier<Any>>(
+            factory = ComposeUiNode.VirtualConstructor,
+            update = {},
+            content = content
+        )
     }
 }
 
@@ -348,142 +315,3 @@
     density: Density,
     override val layoutDirection: LayoutDirection
 ) : MeasureScope, Density by density
-
-/**
- * Default [MeasureBlocks] object implementation, providing intrinsic measurements
- * that use the measure block replacing the measure calls with intrinsic measurement calls.
- */
-@Deprecated("MeasuringIntrinsicsMeasureBlocks was deprecated. Please use MeasurePolicy instead.")
-internal fun MeasuringIntrinsicsMeasureBlocks(measureBlock: MeasureBlock) =
-    object : MeasureBlocks {
-        override fun measure(
-            measureScope: MeasureScope,
-            measurables: List<Measurable>,
-            constraints: Constraints
-        ) = measureScope.measureBlock(measurables, constraints)
-        override fun minIntrinsicWidth(
-            intrinsicMeasureScope: IntrinsicMeasureScope,
-            measurables: List<IntrinsicMeasurable>,
-            h: Int
-        ) = intrinsicMeasureScope.MeasuringMinIntrinsicWidth(
-            measureBlock,
-            measurables,
-            h,
-            intrinsicMeasureScope.layoutDirection
-        )
-        override fun minIntrinsicHeight(
-            intrinsicMeasureScope: IntrinsicMeasureScope,
-            measurables: List<IntrinsicMeasurable>,
-            w: Int
-        ) = intrinsicMeasureScope.MeasuringMinIntrinsicHeight(
-            measureBlock,
-            measurables,
-            w,
-            intrinsicMeasureScope.layoutDirection
-        )
-        override fun maxIntrinsicWidth(
-            intrinsicMeasureScope: IntrinsicMeasureScope,
-            measurables: List<IntrinsicMeasurable>,
-            h: Int
-        ) = intrinsicMeasureScope.MeasuringMaxIntrinsicWidth(
-            measureBlock,
-            measurables,
-            h,
-            intrinsicMeasureScope.layoutDirection
-        )
-        override fun maxIntrinsicHeight(
-            intrinsicMeasureScope: IntrinsicMeasureScope,
-            measurables: List<IntrinsicMeasurable>,
-            w: Int
-        ) = intrinsicMeasureScope.MeasuringMaxIntrinsicHeight(
-            measureBlock,
-            measurables,
-            w,
-            intrinsicMeasureScope.layoutDirection
-        )
-
-        override fun toString(): String {
-            // this calls simpleIdentityToString on measureBlock because it is typically a lambda,
-            // which has a useless toString that doesn't hint at the source location
-            return simpleIdentityToString(
-                this,
-                "MeasuringIntrinsicsMeasureBlocks"
-            ) + "{ measureBlock=${simpleIdentityToString(measureBlock, null)} }"
-        }
-    }
-
-/**
- * Default implementation for the min intrinsic width of a layout. This works by running the
- * measure block with measure calls replaced with intrinsic measurement calls.
- */
-private fun Density.MeasuringMinIntrinsicWidth(
-    measureBlock: MeasureScope.(List<Measurable>, Constraints) -> MeasureResult,
-    measurables: List<IntrinsicMeasurable>,
-    h: Int,
-    layoutDirection: LayoutDirection
-): Int {
-    val mapped = measurables.fastMap {
-        DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Min, IntrinsicWidthHeight.Width)
-    }
-    val constraints = Constraints(maxHeight = h)
-    val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
-    val layoutResult = layoutReceiver.measureBlock(mapped, constraints)
-    return layoutResult.width
-}
-
-/**
- * Default implementation for the min intrinsic width of a layout. This works by running the
- * measure block with measure calls replaced with intrinsic measurement calls.
- */
-private fun Density.MeasuringMinIntrinsicHeight(
-    measureBlock: MeasureScope.(List<Measurable>, Constraints) -> MeasureResult,
-    measurables: List<IntrinsicMeasurable>,
-    w: Int,
-    layoutDirection: LayoutDirection
-): Int {
-    val mapped = measurables.fastMap {
-        DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Min, IntrinsicWidthHeight.Height)
-    }
-    val constraints = Constraints(maxWidth = w)
-    val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
-    val layoutResult = layoutReceiver.measureBlock(mapped, constraints)
-    return layoutResult.height
-}
-
-/**
- * Default implementation for the max intrinsic width of a layout. This works by running the
- * measure block with measure calls replaced with intrinsic measurement calls.
- */
-private fun Density.MeasuringMaxIntrinsicWidth(
-    measureBlock: MeasureScope.(List<Measurable>, Constraints) -> MeasureResult,
-    measurables: List<IntrinsicMeasurable>,
-    h: Int,
-    layoutDirection: LayoutDirection
-): Int {
-    val mapped = measurables.fastMap {
-        DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Max, IntrinsicWidthHeight.Width)
-    }
-    val constraints = Constraints(maxHeight = h)
-    val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
-    val layoutResult = layoutReceiver.measureBlock(mapped, constraints)
-    return layoutResult.width
-}
-
-/**
- * Default implementation for the max intrinsic height of a layout. This works by running the
- * measure block with measure calls replaced with intrinsic measurement calls.
- */
-private fun Density.MeasuringMaxIntrinsicHeight(
-    measureBlock: MeasureScope.(List<Measurable>, Constraints) -> MeasureResult,
-    measurables: List<IntrinsicMeasurable>,
-    w: Int,
-    layoutDirection: LayoutDirection
-): Int {
-    val mapped = measurables.fastMap {
-        DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Max, IntrinsicWidthHeight.Height)
-    }
-    val constraints = Constraints(maxWidth = w)
-    val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
-    val layoutResult = layoutReceiver.measureBlock(mapped, constraints)
-    return layoutResult.height
-}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasurePolicy.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasurePolicy.kt
index 4a60ebb..64dcbe3 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasurePolicy.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasurePolicy.kt
@@ -20,6 +20,8 @@
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.util.fastMap
 import androidx.compose.ui.internal.JvmDefaultWithCompatibility
+import androidx.compose.ui.layout.RootMeasurePolicy.measure
+import androidx.compose.ui.layout.RootMeasurePolicy.minIntrinsicWidth
 
 /**
  * Defines the measure and layout behavior of a [Layout]. [Layout] and [MeasurePolicy] are the way
@@ -31,13 +33,13 @@
  * Intrinsic measurement methods define the intrinsic size of the layout. These can be queried
  * by the layout's parent in order to obtain, in specific cases, more information about
  * the size of the layout in the absence of specific constraints:
- * - [minIntrinsicWidthMeasureBlock] defines the minimum width this layout can take, given
+ * - [minIntrinsicWidth] defines the minimum width this layout can take, given
  *   a specific height, such that the content of the layout will be painted correctly
- * - [minIntrinsicHeightMeasureBlock] defines the minimum height this layout can take, given
+ * - [minIntrinsicHeight] defines the minimum height this layout can take, given
  *   a specific width, such that the content of the layout will be painted correctly
- * - [maxIntrinsicWidthMeasureBlock] defines the minimum width such that increasing it further
+ * - [maxIntrinsicWidth] defines the minimum width such that increasing it further
  *   will not decrease the minimum intrinsic height
- * - [maxIntrinsicHeightMeasureBlock] defines the minimum height such that increasing it further
+ * - [maxIntrinsicHeight] defines the minimum height such that increasing it further
  *   will not decrease the minimum intrinsic width
  * Most layout scenarios do not require querying intrinsic measurements. Therefore, when writing
  * a custom layout, it is common to only define the actual measurement, as most of the times
@@ -108,8 +110,8 @@
 
     /**
      * The function used to calculate [IntrinsicMeasurable.minIntrinsicHeight]. It represents
-     * defines the minimum height this layout can take, given  a specific width, such
-     * that the content of the layout will be painted correctly.
+     * the minimum height this layout can take, given a specific width, such that the content
+     * of the layout will be painted correctly.
      */
     fun IntrinsicMeasureScope.minIntrinsicHeight(
         measurables: List<IntrinsicMeasurable>,
@@ -157,4 +159,4 @@
         val layoutResult = layoutReceiver.measure(mapped, constraints)
         return layoutResult.height
     }
-}
\ No newline at end of file
+}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasureScope.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasureScope.kt
index 74188cd..eaef98e1d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasureScope.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasureScope.kt
@@ -17,7 +17,6 @@
 package androidx.compose.ui.layout
 
 import androidx.compose.ui.node.LookaheadCapablePlaceable
-import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.internal.JvmDefaultWithCompatibility
 
 /**
@@ -59,9 +58,3 @@
         }
     }
 }
-
-/**
- * A function for performing layout measurement.
- */
-@Deprecated("MeasureBlock was deprecated. See MeasurePolicy and the new Layout overloads.")
-internal typealias MeasureBlock = MeasureScope.(List<Measurable>, Constraints) -> MeasureResult
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MultiContentMeasurePolicy.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MultiContentMeasurePolicy.kt
new file mode 100644
index 0000000..4233971
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MultiContentMeasurePolicy.kt
@@ -0,0 +1,232 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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 androidx.compose.runtime.Stable
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.node.getChildrenOfVirtualChildren
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.util.fastMap
+
+/**
+ * Defines the measure and layout behavior of a [Layout] overload which accepts a list of multiple
+ * composable content lambdas.
+ *
+ * This interface is identical to [MeasurePolicy], but provides you with a list of lists of
+ * [Measurable]s which allows to threat children put into different content lambdas differently.
+ * Such list has the same size as the list of contents passed into [Layout] and contains the list
+ * of [Measurable]s of the corresponding content lambda in the same order.
+ *
+ * Intrinsic measurement methods define the intrinsic size of the layout. These can be queried
+ * by the layout's parent in order to obtain, in specific cases, more information about
+ * the size of the layout in the absence of specific constraints:
+ * - [minIntrinsicWidth] defines the minimum width this layout can take, given
+ *   a specific height, such that the content of the layout will be painted correctly
+ * - [minIntrinsicHeight] defines the minimum height this layout can take, given
+ *   a specific width, such that the content of the layout will be painted correctly
+ * - [maxIntrinsicWidth] defines the minimum width such that increasing it further
+ *   will not decrease the minimum intrinsic height
+ * - [maxIntrinsicHeight] defines the minimum height such that increasing it further
+ *   will not decrease the minimum intrinsic width
+ * Most layout scenarios do not require querying intrinsic measurements. Therefore, when writing
+ * a custom layout, it is common to only define the actual measurement, as most of the times
+ * the intrinsic measurements of the layout will not be queried. Moreover, intrinsic measurement
+ * methods have default implementations that make a best effort attempt to calculate the intrinsic
+ * measurements by reusing the [measure] method. Note this will not be correct for all layouts,
+ * but can be a convenient approximation.
+ * Intrinsic measurements can be useful when the layout system enforcement of no more than one
+ * measurement per child is limiting. Layouts that use them are the `preferredWidth(IntrinsicSize)`
+ * and `preferredHeight(IntrinsicSize)` modifiers. See their samples for when they can be useful.
+ *
+ * @see Layout
+ * @see MeasurePolicy
+ */
+@Stable
+@ExperimentalComposeUiApi
+fun interface MultiContentMeasurePolicy {
+    /**
+     * The function that defines the measurement and layout. Each [Measurable] in the [measurables]
+     * lists corresponds to a layout child of the layout, and children can be measured using the
+     * [Measurable.measure] method. This method takes the [Constraints] which the child should
+     * respect; different children can be measured with different constraints.
+     * Measuring a child returns a [Placeable], which reveals the size chosen by the child as a
+     * result of its own measurement. According to the children sizes, the parent defines the
+     * position of the children, by [placing][Placeable.PlacementScope.place] the [Placeable]s in
+     * the [MeasureResult.placeChildren] of the returned [MeasureResult]. Therefore the parent needs
+     * to measure its children with appropriate [Constraints], such that whatever valid sizes
+     * children choose, they can be laid out correctly according to the parent's layout algorithm.
+     * This is because there is no measurement negotiation between the parent and children:
+     * once a child chooses its size, the parent needs to handle it correctly.
+     *
+     * It is identical to [MeasurePolicy.measure], but provides you with a list of lists of
+     * [Measurable]s which allows to threat children put into different content lambdas
+     * differently. Such list has the same size as the list of contents passed into [Layout] and
+     * contains the list of [Measurable]s of the corresponding content lambda in the same order.
+     *
+     * Note that a child is allowed to choose a size that does not satisfy its constraints. However,
+     * when this happens, the placeable's [width][Placeable.width] and [height][Placeable.height]
+     * will not represent the real size of the child, but rather the size coerced in the
+     * child's constraints. Therefore, it is common for parents to assume in their layout
+     * algorithm that its children will always respect the constraints. When this
+     * does not happen in reality, the position assigned to the child will be
+     * automatically offset to be centered on the space assigned by the parent under
+     * the assumption that constraints were respected. Rarely, when a parent really needs to know
+     * the true size of the child, they can read this from the placeable's
+     * [Placeable.measuredWidth] and [Placeable.measuredHeight].
+     *
+     * [MeasureResult] objects are usually created using the [MeasureScope.layout]
+     * factory, which takes the calculated size of this layout, its alignment lines, and a block
+     * defining the positioning of the children layouts.
+     */
+    fun MeasureScope.measure(
+        measurables: List<List<Measurable>>,
+        constraints: Constraints
+    ): MeasureResult
+
+    /**
+     * The function used to calculate [IntrinsicMeasurable.minIntrinsicWidth]. It represents
+     * the minimum width this layout can take, given a specific height, such that the content
+     * of the layout can be painted correctly.
+     *
+     * It is identical to [MeasurePolicy.minIntrinsicWidth], but provides you with a list of
+     * lists of [Measurable]s which allows to threat children put into different content lambdas
+     * differently. Such list has the same size as the list of contents passed into [Layout] and
+     * contains the list of [Measurable]s of the corresponding content lambda in the same order.
+     */
+    fun IntrinsicMeasureScope.minIntrinsicWidth(
+        measurables: List<List<IntrinsicMeasurable>>,
+        height: Int
+    ): Int {
+        val mapped = measurables.fastMap { list ->
+            list.fastMap {
+                DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Min, IntrinsicWidthHeight.Width)
+            }
+        }
+        val constraints = Constraints(maxHeight = height)
+        val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
+        val layoutResult = layoutReceiver.measure(mapped, constraints)
+        return layoutResult.width
+    }
+
+    /**
+     * The function used to calculate [IntrinsicMeasurable.minIntrinsicHeight]. It represents
+     * the minimum height this layout can take, given a specific width, such that the content
+     * of the layout will be painted correctly.
+     *
+     * It is identical to [MeasurePolicy.minIntrinsicHeight], but provides you with a list of
+     * lists of [Measurable]s which allows to threat children put into different content lambdas
+     * differently. Such list has the same size as the list of contents passed into [Layout] and
+     * contains the list of [Measurable]s of the corresponding content lambda in the same order.
+     */
+    fun IntrinsicMeasureScope.minIntrinsicHeight(
+        measurables: List<List<IntrinsicMeasurable>>,
+        width: Int
+    ): Int {
+        val mapped = measurables.fastMap { list ->
+            list.fastMap {
+                DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Min, IntrinsicWidthHeight.Height)
+            }
+        }
+        val constraints = Constraints(maxWidth = width)
+        val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
+        val layoutResult = layoutReceiver.measure(mapped, constraints)
+        return layoutResult.height
+    }
+
+    /**
+     * The function used to calculate [IntrinsicMeasurable.maxIntrinsicWidth]. It represents the
+     * minimum width such that increasing it further will not decrease the minimum intrinsic height.
+     *
+     * It is identical to [MeasurePolicy.maxIntrinsicWidth], but provides you with a list of
+     * lists of [Measurable]s which allows to threat children put into different content lambdas
+     * differently. Such list has the same size as the list of contents passed into [Layout] and
+     * contains the list of [Measurable]s of the corresponding content lambda in the same order.
+     */
+    fun IntrinsicMeasureScope.maxIntrinsicWidth(
+        measurables: List<List<IntrinsicMeasurable>>,
+        height: Int
+    ): Int {
+        val mapped = measurables.fastMap { list ->
+            list.fastMap {
+                DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Max, IntrinsicWidthHeight.Width)
+            }
+        }
+        val constraints = Constraints(maxHeight = height)
+        val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
+        val layoutResult = layoutReceiver.measure(mapped, constraints)
+        return layoutResult.width
+    }
+
+    /**
+     * The function used to calculate [IntrinsicMeasurable.maxIntrinsicHeight]. It represents the
+     * minimum height such that increasing it further will not decrease the minimum intrinsic width.
+     *
+     * It is identical to [MeasurePolicy.maxIntrinsicHeight], but provides you with a list of
+     * lists of [Measurable]s which allows to threat children put into different content lambdas
+     * differently. Such list has the same size as the list of contents passed into [Layout] and
+     * contains the list of [Measurable]s of the corresponding content lambda in the same order.
+     */
+    fun IntrinsicMeasureScope.maxIntrinsicHeight(
+        measurables: List<List<IntrinsicMeasurable>>,
+        width: Int
+    ): Int {
+        val mapped = measurables.fastMap { list ->
+            list.fastMap {
+                DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Max, IntrinsicWidthHeight.Height)
+            }
+        }
+        val constraints = Constraints(maxWidth = width)
+        val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
+        val layoutResult = layoutReceiver.measure(mapped, constraints)
+        return layoutResult.height
+    }
+}
+
+@ExperimentalComposeUiApi
+@PublishedApi
+internal fun createMeasurePolicy(
+    // metalava thinks experimental MultiContentMeasurePolicy is hidden b/244423074
+    @Suppress("HiddenTypeParameter") measurePolicy: MultiContentMeasurePolicy
+): MeasurePolicy =
+    with(measurePolicy) {
+        object : MeasurePolicy {
+            override fun MeasureScope.measure(
+                measurables: List<Measurable>,
+                constraints: Constraints
+            ) = measure(getChildrenOfVirtualChildren(this), constraints)
+
+            override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                measurables: List<IntrinsicMeasurable>,
+                height: Int
+            ) = minIntrinsicWidth(getChildrenOfVirtualChildren(this), height)
+
+            override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                measurables: List<IntrinsicMeasurable>,
+                width: Int
+            ) = minIntrinsicHeight(getChildrenOfVirtualChildren(this), width)
+
+            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                measurables: List<IntrinsicMeasurable>,
+                height: Int
+            ) = maxIntrinsicWidth(getChildrenOfVirtualChildren(this), height)
+
+            override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                measurables: List<IntrinsicMeasurable>,
+                width: Int
+            ) = maxIntrinsicHeight(getChildrenOfVirtualChildren(this), width)
+        }
+    }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ComposeUiNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ComposeUiNode.kt
index f4f88ef..747c1df 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ComposeUiNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ComposeUiNode.kt
@@ -38,6 +38,7 @@
      */
     companion object {
         val Constructor: () -> ComposeUiNode = LayoutNode.Constructor
+        val VirtualConstructor: () -> ComposeUiNode = { LayoutNode(isVirtual = true) }
         val SetModifier: ComposeUiNode.(Modifier) -> Unit = { this.modifier = it }
         val SetDensity: ComposeUiNode.(Density) -> Unit = { this.density = it }
         val SetMeasurePolicy: ComposeUiNode.(MeasurePolicy) -> Unit =
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LookaheadDelegate.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LookaheadDelegate.kt
index 23c0d2c..a0b1a02 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LookaheadDelegate.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LookaheadDelegate.kt
@@ -24,7 +24,6 @@
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.Placeable
 import androidx.compose.ui.layout.LookaheadScope
-import androidx.compose.ui.layout.MeasureScope
 import androidx.compose.ui.layout.VerticalAlignmentLine
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntOffset
@@ -35,12 +34,12 @@
  * This is the base class for NodeCoordinator and LookaheadDelegate. The common
  * functionalities between the two are extracted here.
  */
-internal abstract class LookaheadCapablePlaceable : Placeable(), MeasureScope {
+internal abstract class LookaheadCapablePlaceable : Placeable(), MeasureScopeWithLayoutNode {
     abstract val position: IntOffset
     abstract val child: LookaheadCapablePlaceable?
     abstract val parent: LookaheadCapablePlaceable?
     abstract val hasMeasureResult: Boolean
-    abstract val layoutNode: LayoutNode
+    abstract override val layoutNode: LayoutNode
     abstract val coordinates: LayoutCoordinates
     final override fun get(alignmentLine: AlignmentLine): Int {
         if (!hasMeasureResult) return AlignmentLine.Unspecified
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureScopeWithLayoutNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureScopeWithLayoutNode.kt
new file mode 100644
index 0000000..a8abf18
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureScopeWithLayoutNode.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.ui.node
+
+import androidx.compose.ui.layout.IntrinsicMeasureScope
+import androidx.compose.ui.layout.Measurable
+import androidx.compose.ui.layout.MeasureScope
+import androidx.compose.ui.node.LayoutNode.LayoutState
+import androidx.compose.ui.util.fastMap
+
+internal interface MeasureScopeWithLayoutNode : MeasureScope {
+    val layoutNode: LayoutNode
+}
+
+internal fun getChildrenOfVirtualChildren(scope: IntrinsicMeasureScope): List<List<Measurable>> {
+    val layoutNode = (scope as MeasureScopeWithLayoutNode).layoutNode
+    val lookahead = layoutNode.isInLookaheadPass()
+    return layoutNode.foldedChildren.fastMap {
+        if (lookahead) it.childLookaheadMeasurables else it.childMeasurables
+    }
+}
+
+private fun LayoutNode.isInLookaheadPass(): Boolean {
+    return when (layoutState) {
+        LayoutState.LookaheadMeasuring, LayoutState.LookaheadLayingOut -> true
+        LayoutState.Measuring, LayoutState.LayingOut -> false
+        LayoutState.Idle -> {
+            // idle means intrinsics are being asked, we need to check the parent
+            requireNotNull(parent).isInLookaheadPass()
+        }
+    }
+}
diff --git a/concurrent/concurrent-futures-ktx/build.gradle b/concurrent/concurrent-futures-ktx/build.gradle
index 2d4b84f..a7da11d 100644
--- a/concurrent/concurrent-futures-ktx/build.gradle
+++ b/concurrent/concurrent-futures-ktx/build.gradle
@@ -39,10 +39,3 @@
     inceptionYear = "2019"
     description = "Kotlin Extensions for Androidx implementation of Guava's ListenableFuture"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/core/core-google-shortcuts/build.gradle b/core/core-google-shortcuts/build.gradle
index 751c880..b53699d 100644
--- a/core/core-google-shortcuts/build.gradle
+++ b/core/core-google-shortcuts/build.gradle
@@ -39,8 +39,6 @@
 
     implementation "com.google.android.gms:play-services-appindex:16.1.0"
     implementation("com.google.crypto.tink:tink-android:1.5.0")
-    implementation "androidx.appsearch:appsearch:1.1.0-alpha01"
-    implementation "androidx.appsearch:appsearch-builtin-types:1.1.0-alpha01"
 
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImplTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImplTest.java
index 3fa18b1..f9af80b 100644
--- a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImplTest.java
+++ b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImplTest.java
@@ -26,8 +26,6 @@
 import android.content.Context;
 import android.content.Intent;
 
-import androidx.appsearch.app.ShortcutAdapter;
-import androidx.appsearch.builtintypes.Timer;
 import androidx.core.content.pm.ShortcutInfoCompat;
 import androidx.core.google.shortcuts.builders.CapabilityBuilder;
 import androidx.core.google.shortcuts.builders.ParameterBuilder;
@@ -215,41 +213,6 @@
 
     @Test
     @SmallTest
-    public void onShortcutUpdated_entityShortcut_savesToAppIndex() throws Exception {
-        ArgumentCaptor<Indexable> indexableCaptor = ArgumentCaptor.forClass(Indexable.class);
-
-        Timer timer = new Timer.Builder(ShortcutAdapter.DEFAULT_NAMESPACE, "timer_id")
-                .setCreationTimestampMillis(1000)
-                .build();
-        ShortcutInfoCompat timerShortcut =
-                ShortcutAdapter.createShortcutBuilderFromDocument(mContext, timer)
-                        .build();
-
-        mShortcutInfoChangeListener.onShortcutUpdated(Collections.singletonList(timerShortcut));
-
-        verify(mFirebaseAppIndex, only()).update(indexableCaptor.capture());
-        List<Indexable> allValues = indexableCaptor.getAllValues();
-
-        Indexable expected = new Indexable.Builder("Timer")
-                .setMetadata(new Indexable.Metadata.Builder().setScore(0))
-                .setUrl(ShortcutUtils.getIndexableUrl(mContext, "timer_id"))
-                .put("_namespace", ShortcutAdapter.DEFAULT_NAMESPACE)
-                .put("_ttlMillis", 0)
-                .put("_creationTimestampMillis", 1000)
-                .put("id", "timer_id")
-                .put("length", 0)
-                .put("name", ShortcutAdapter.DEFAULT_NAMESPACE)
-                .put("remainingTime", 0)
-                .put("timerStatus", "Unknown")
-                .put("vibrate", false)
-                .put("bootCount", 0)
-                .put("originalDurationMillis", 0)
-                .build();
-        assertThat(allValues).containsExactly(expected);
-    }
-
-    @Test
-    @SmallTest
     public void onShortcutAdded_savesToAppIndex() throws Exception {
         ArgumentCaptor<Indexable> indexableCaptor = ArgumentCaptor.forClass(Indexable.class);
 
@@ -371,57 +334,6 @@
         assertThat(allValues).containsExactly(expected);
     }
 
-    @Test
-    @SmallTest
-    public void onShortcutAdded_withCapabilityBindingEntity_reportEntityUsage() throws Exception {
-        ArgumentCaptor<Action> actionCaptor = ArgumentCaptor.forClass(Action.class);
-
-        Intent intent = Intent.parseUri("app://shortcut", 0);
-        ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(mContext, "publicIntent")
-                .setShortLabel("short label")
-                .setIntent(intent)
-                .addCapabilityBinding(
-                        "actions.intent.ORDER_MENU_ITEM",
-                        "menuItem.name",
-                        ImmutableList.of(
-                                createEntityUri("item1"),
-                                createEntityUri("item2"),
-                                "item3"))
-                .addCapabilityBinding(
-                        "actions.intent.ORDER_MENU_ITEM",
-                        "menuItem.inMenuSection.inMenu.forRestaurant.name",
-                        ImmutableList.of(
-                                createEntityUri("restaurant1"),
-                                createEntityUri("restaurant2"),
-                                "restaurant3"))
-                .build();
-
-        mShortcutInfoChangeListener.onShortcutAdded(ImmutableList.of(shortcut));
-
-        verify(mFirebaseUserActions, times(4)).end(actionCaptor.capture());
-
-        Action expectedAction1 = new Action.Builder(Action.Builder.VIEW_ACTION)
-                .setObject("", ShortcutUtils.getIndexableUrl(mContext, "item1"))
-                .build();
-        Action expectedAction2 = new Action.Builder(Action.Builder.VIEW_ACTION)
-                .setObject("", ShortcutUtils.getIndexableUrl(mContext, "item2"))
-                .build();
-        Action expectedAction3 = new Action.Builder(Action.Builder.VIEW_ACTION)
-                .setObject("", ShortcutUtils.getIndexableUrl(mContext, "restaurant1"))
-                .build();
-        Action expectedAction4 = new Action.Builder(Action.Builder.VIEW_ACTION)
-                .setObject("", ShortcutUtils.getIndexableUrl(mContext, "restaurant2"))
-                .build();
-
-
-        // Action has no equals comparator, so instead we compare their string forms.
-        assertThat(convertActionsToString(actionCaptor.getAllValues())).containsExactly(
-                expectedAction1.toString(),
-                expectedAction2.toString(),
-                expectedAction3.toString(),
-                expectedAction4.toString());
-    }
-
     private List<String> convertActionsToString(List<Action> actions) {
         List<String> actionStrings = new ArrayList<>();
         for (Action action : actions) {
@@ -429,8 +341,4 @@
         }
         return actionStrings;
     }
-
-    private String createEntityUri(String id) {
-        return "appsearch://__shortcut_adapter_db__/__shortcut_adapter_ns__/" + id;
-    }
 }
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AlarmConverterTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AlarmConverterTest.java
deleted file mode 100644
index 8c2575e..0000000
--- a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AlarmConverterTest.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.converters;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-
-import androidx.appsearch.app.GenericDocument;
-import androidx.appsearch.builtintypes.Alarm;
-import androidx.appsearch.builtintypes.AlarmInstance;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.google.android.gms.appindex.Indexable;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.Calendar;
-import java.util.TimeZone;
-
-@RunWith(AndroidJUnit4.class)
-public class AlarmConverterTest {
-    private final AlarmConverter mAlarmConverter = new AlarmConverter();
-    private final Context mContext = ApplicationProvider.getApplicationContext();
-
-    @Test
-    @SmallTest
-    public void testConvert_returnsIndexable() throws Exception {
-        TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
-
-        AlarmInstance previousInstance = new AlarmInstance.Builder(
-                "namespace", "instance1", "2020-01-01T00:00:00")
-                .setCreationTimestampMillis(1000)
-                .setStatus(AlarmInstance.STATUS_DISMISSED)
-                .build();
-        AlarmInstance nextInstance = new AlarmInstance.Builder(
-                "namespace", "instance2", "2020-01-02T00:00:00")
-                .setCreationTimestampMillis(1000)
-                .setStatus(AlarmInstance.STATUS_SCHEDULED)
-                .build();
-        Alarm alarm = new Alarm.Builder("namespace", "id")
-                .setCreationTimestampMillis(1000)
-                .setDocumentTtlMillis(2000)
-                .setDocumentScore(1)
-                .setName("alarm")
-                .setEnabled(true)
-                .setDaysOfWeek(Calendar.MONDAY, Calendar.TUESDAY)
-                .setHour(7)
-                .setMinute(30)
-                .setBlackoutPeriodStartDate("2020-02-01")
-                .setBlackoutPeriodEndDate("2020-03-01")
-                .setRingtone("clock://ringtone/1")
-                .setShouldVibrate(true)
-                .setPreviousInstance(previousInstance)
-                .setNextInstance(nextInstance)
-                .build();
-
-        Indexable result = mAlarmConverter.convertGenericDocument(mContext,
-                GenericDocument.fromDocumentClass(alarm)).build();
-        Indexable expectedInstance1 = new Indexable.Builder("AlarmInstance")
-                .setMetadata(new Indexable.Metadata.Builder().setScore(0))
-                .setId("instance1")
-                .setName("namespace")
-                .setUrl("intent:#Intent;action=androidx.core.content.pm.SHORTCUT_LISTENER;"
-                        + "component=androidx.core.google.shortcuts.test/androidx.core.google."
-                        + "shortcuts.TrampolineActivity;S.id=instance1;end")
-                .put(IndexableKeys.NAMESPACE, "namespace")
-                .put(IndexableKeys.TTL_MILLIS, 0)
-                .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS, 1000)
-                .put("scheduledTime", "2020-01-01T00:00:00+0000")
-                .put("alarmStatus", "Dismissed")
-                .put("snoozeLength", -1)
-                .build();
-        Indexable expectedInstance2 = new Indexable.Builder("AlarmInstance")
-                .setMetadata(new Indexable.Metadata.Builder().setScore(0))
-                .setId("instance2")
-                .setName("namespace")
-                .setUrl("intent:#Intent;action=androidx.core.content.pm.SHORTCUT_LISTENER;"
-                        + "component=androidx.core.google.shortcuts.test/androidx.core.google."
-                        + "shortcuts.TrampolineActivity;S.id=instance2;end")
-                .put(IndexableKeys.NAMESPACE, "namespace")
-                .put(IndexableKeys.TTL_MILLIS, 0)
-                .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS, 1000)
-                .put("scheduledTime", "2020-01-02T00:00:00+0000")
-                .put("alarmStatus", "Scheduled")
-                .put("snoozeLength", -1)
-                .build();
-        Indexable expectedResult = new Indexable.Builder("Alarm")
-                .setMetadata(new Indexable.Metadata.Builder().setScore(1))
-                .setId("id")
-                .setName("namespace")
-                .setUrl("intent:#Intent;action=androidx.core.content.pm.SHORTCUT_LISTENER;"
-                        + "component=androidx.core.google.shortcuts.test/androidx.core.google."
-                        + "shortcuts.TrampolineActivity;S.id=id;end")
-                .put(IndexableKeys.NAMESPACE, "namespace")
-                .put(IndexableKeys.TTL_MILLIS, 2000)
-                .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS, 1000)
-                .put("message", "alarm")
-                .put("hour", 7)
-                .put("minute", 30)
-                .put("ringtone", "clock://ringtone/1")
-                .put("vibrate", true)
-                .put("enabled", true)
-                .put("identifier", "id")
-                .put("blackoutPeriodStartDate", "2020-02-01")
-                .put("blackoutPeriodEndDate", "2020-03-01")
-                .put("dayOfWeek", "Monday", "Tuesday")
-                .put("alarmInstances", expectedInstance1, expectedInstance2)
-                .build();
-        assertThat(result).isEqualTo(expectedResult);
-    }
-
-    @Test
-    @SmallTest
-    public void testConvert_withoutOptionalFields_returnsIndexable() throws Exception {
-        Alarm alarm = new Alarm.Builder("namespace", "id")
-                // CurrentTime will be used if not set.
-                .setCreationTimestampMillis(1000)
-                .build();
-
-        Indexable result = mAlarmConverter.convertGenericDocument(mContext,
-                GenericDocument.fromDocumentClass(alarm)).build();
-        Indexable expectedResult = new Indexable.Builder("Alarm")
-                .setMetadata(new Indexable.Metadata.Builder().setScore(0))
-                .setId("id")
-                .setName("namespace")
-                .setUrl("intent:#Intent;action=androidx.core.content.pm.SHORTCUT_LISTENER;"
-                        + "component=androidx.core.google.shortcuts.test/androidx.core.google."
-                        + "shortcuts.TrampolineActivity;S.id=id;end")
-                .put(IndexableKeys.NAMESPACE, "namespace")
-                .put(IndexableKeys.TTL_MILLIS, 0)
-                .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS, 1000)
-                .put("hour", 0)
-                .put("minute", 0)
-                .put("vibrate", false)
-                .put("enabled", false)
-                .put("identifier", "id")
-                .build();
-        assertThat(result).isEqualTo(expectedResult);
-    }
-}
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AlarmInstanceConverterTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AlarmInstanceConverterTest.java
deleted file mode 100644
index 2d60607..0000000
--- a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AlarmInstanceConverterTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.converters;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-
-import androidx.appsearch.app.GenericDocument;
-import androidx.appsearch.builtintypes.AlarmInstance;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.google.android.gms.appindex.Indexable;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.TimeZone;
-
-@RunWith(AndroidJUnit4.class)
-public class AlarmInstanceConverterTest {
-    private final AlarmInstanceConverter mAlarmInstanceConverter = new AlarmInstanceConverter();
-    private final Context mContext = ApplicationProvider.getApplicationContext();
-
-    @Test
-    @SmallTest
-    public void testConvert_returnsIndexable() throws Exception {
-        TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
-
-        AlarmInstance alarmInstance = new AlarmInstance.Builder(
-                "namespace", "id", "2020-01-02T07:30:00")
-                .setCreationTimestampMillis(1000)
-                .setDocumentTtlMillis(2000)
-                .setDocumentScore(1)
-                .setStatus(AlarmInstance.STATUS_SCHEDULED)
-                .setSnoozeDurationMillis(3000)
-                .build();
-
-        Indexable result = mAlarmInstanceConverter.convertGenericDocument(mContext,
-                GenericDocument.fromDocumentClass(alarmInstance)).build();
-        Indexable expectedResult = new Indexable.Builder("AlarmInstance")
-                .setMetadata(new Indexable.Metadata.Builder().setScore(1))
-                .setId("id")
-                .setName("namespace")
-                .setUrl("intent:#Intent;action=androidx.core.content.pm.SHORTCUT_LISTENER;"
-                        + "component=androidx.core.google.shortcuts.test/androidx.core.google."
-                        + "shortcuts.TrampolineActivity;S.id=id;end")
-                .put(IndexableKeys.NAMESPACE, "namespace")
-                .put(IndexableKeys.TTL_MILLIS, 2000)
-                .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS, 1000)
-                .put("scheduledTime", "2020-01-02T07:30:00+0000")
-                .put("alarmStatus", "Scheduled")
-                .put("snoozeLength", 3000)
-                .build();
-        assertThat(result).isEqualTo(expectedResult);
-    }
-
-    @Test
-    @SmallTest
-    public void testConvert_differentTimeZone_returnsIndexableWithSameLocalTime() throws Exception {
-        AlarmInstance alarmInstance = new AlarmInstance.Builder(
-                "namespace", "id", "2020-01-02T07:30:00")
-                .setCreationTimestampMillis(1000)
-                .setStatus(AlarmInstance.STATUS_SCHEDULED)
-                .build();
-        Indexable.Builder expectedResultTemplate = new Indexable.Builder("AlarmInstance")
-                .setMetadata(new Indexable.Metadata.Builder().setScore(0))
-                .setId("id")
-                .setName("namespace")
-                .setUrl("intent:#Intent;action=androidx.core.content.pm.SHORTCUT_LISTENER;"
-                        + "component=androidx.core.google.shortcuts.test/androidx.core.google."
-                        + "shortcuts.TrampolineActivity;S.id=id;end")
-                .put(IndexableKeys.NAMESPACE, "namespace")
-                .put(IndexableKeys.TTL_MILLIS, 0)
-                .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS, 1000)
-                .put("alarmStatus", "Scheduled")
-                .put("snoozeLength", -1);
-
-        TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
-        Indexable gmtResult = mAlarmInstanceConverter.convertGenericDocument(mContext,
-                GenericDocument.fromDocumentClass(alarmInstance)).build();
-        assertThat(gmtResult).isEqualTo(expectedResultTemplate
-                .put("scheduledTime", "2020-01-02T07:30:00+0000").build());
-
-        TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
-        Indexable pstResult = mAlarmInstanceConverter.convertGenericDocument(mContext,
-                GenericDocument.fromDocumentClass(alarmInstance)).build();
-        assertThat(pstResult).isEqualTo(expectedResultTemplate
-                .put("scheduledTime", "2020-01-02T07:30:00-0800").build());
-    }
-
-    @Test
-    @SmallTest
-    public void testConvert_withoutOptionalFields_returnsIndexable() throws Exception {
-        TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
-
-        AlarmInstance alarmInstance = new AlarmInstance.Builder(
-                "namespace", "id", "2020-01-02T07:30:00")
-                // CurrentTime will be used if not set.
-                .setCreationTimestampMillis(1000)
-                .build();
-
-        Indexable result = mAlarmInstanceConverter.convertGenericDocument(mContext,
-                GenericDocument.fromDocumentClass(alarmInstance)).build();
-        Indexable expectedResult = new Indexable.Builder("AlarmInstance")
-                .setMetadata(new Indexable.Metadata.Builder().setScore(0))
-                .setId("id")
-                .setName("namespace")
-                .setUrl("intent:#Intent;action=androidx.core.content.pm.SHORTCUT_LISTENER;"
-                        + "component=androidx.core.google.shortcuts.test/androidx.core.google."
-                        + "shortcuts.TrampolineActivity;S.id=id;end")
-                .put(IndexableKeys.NAMESPACE, "namespace")
-                .put(IndexableKeys.TTL_MILLIS, 0)
-                .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS, 1000)
-                .put("alarmStatus", "Unknown")
-                .put("snoozeLength", -1)
-                .put("scheduledTime", "2020-01-02T07:30:00+0000")
-                .build();
-        assertThat(result).isEqualTo(expectedResult);
-    }
-}
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AppSearchDocumentConverterFactoryTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AppSearchDocumentConverterFactoryTest.java
deleted file mode 100644
index aa06da9..0000000
--- a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AppSearchDocumentConverterFactoryTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.converters;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class AppSearchDocumentConverterFactoryTest {
-    @Test
-    @SmallTest
-    public void testGetConverter_registeredConverter_returnsRegisteredConverter() {
-        AppSearchDocumentConverter converter = AppSearchDocumentConverterFactory
-                .getConverter("builtin:Timer");
-
-        assertThat(converter).isNotNull();
-        assertThat(converter).isInstanceOf(TimerConverter.class);
-    }
-
-    @Test
-    @SmallTest
-    public void testGetConverter_defaultConverter_returnsDefaultConverter() {
-        AppSearchDocumentConverter converter =
-                AppSearchDocumentConverterFactory.getConverter("NotRegisteredType");
-
-        assertThat(converter).isNotNull();
-        assertThat(converter).isInstanceOf(GenericDocumentConverter.class);
-    }
-}
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/GenericDocumentConverterTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/GenericDocumentConverterTest.java
deleted file mode 100644
index 50dcec2a..0000000
--- a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/GenericDocumentConverterTest.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.converters;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-
-import androidx.appsearch.app.GenericDocument;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.google.android.gms.appindex.Indexable;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class GenericDocumentConverterTest {
-    private final GenericDocumentConverter mConverter = new GenericDocumentConverter();
-    private final Context mContext = ApplicationProvider.getApplicationContext();
-
-    @Test
-    @SmallTest
-    public void testConvertGenericDocument_returnsIndexable() throws Exception {
-        GenericDocument childDocument1 = new GenericDocument.Builder<>(
-                "namespace1",
-                "child1",
-                "childSchema")
-                .setCreationTimestampMillis(1)
-                .build();
-        GenericDocument childDocument2 = new GenericDocument.Builder<>(
-                "namespace1",
-                "child2",
-                "childSchema")
-                .setCreationTimestampMillis(1)
-                .build();
-        GenericDocument genericDocument = new GenericDocument.Builder<>(
-                "namespace2",
-                "id1",
-                "schema")
-                .setScore(1)
-                .setTtlMillis(1000)
-                .setCreationTimestampMillis(1)
-                .setPropertyString("stringArrayProperty", "s1", "s2")
-                .setPropertyLong("longArrayProperty", 1L, 2L)
-                .setPropertyBoolean("booleanArrayProperty", true, false)
-                .setPropertyDocument("documentArrayProperty", childDocument1, childDocument2)
-                .setPropertyString("stringProperty", "s3")
-                .setPropertyLong("longProperty", 3L)
-                .setPropertyBoolean("booleanProperty", true)
-                .setPropertyDocument("documentProperty", childDocument1)
-                .setPropertyString("emptyProperty")
-                .build();
-
-        Indexable indexable = mConverter.convertGenericDocument(mContext, genericDocument).build();
-
-        Indexable expectedChild1 = new Indexable.Builder("childSchema")
-                .setMetadata(new Indexable.Metadata.Builder().setScore(0))
-                .setName("namespace1")
-                .setId("child1")
-                .setUrl("intent:#Intent;action=androidx.core.content.pm.SHORTCUT_LISTENER;"
-                        + "component=androidx.core.google.shortcuts.test/androidx.core.google."
-                        + "shortcuts.TrampolineActivity;S.id=child1;end")
-                .put(IndexableKeys.NAMESPACE, "namespace1")
-                .put(IndexableKeys.TTL_MILLIS, 0)
-                .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS, 1)
-                .build();
-        Indexable expectedChild2 = new Indexable.Builder("childSchema")
-                .setMetadata(new Indexable.Metadata.Builder().setScore(0))
-                .setName("namespace1")
-                .setId("child2")
-                .setUrl("intent:#Intent;action=androidx.core.content.pm.SHORTCUT_LISTENER;"
-                        + "component=androidx.core.google.shortcuts.test/androidx.core.google."
-                        + "shortcuts.TrampolineActivity;S.id=child2;end")
-                .put(IndexableKeys.NAMESPACE, "namespace1")
-                .put(IndexableKeys.TTL_MILLIS, 0)
-                .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS, 1)
-                .build();
-        Indexable expectedIndexable = new Indexable.Builder("schema")
-                .setMetadata(new Indexable.Metadata.Builder().setScore(1))
-                .setName("namespace2")
-                .setId("id1")
-                .setUrl("intent:#Intent;action=androidx.core.content.pm.SHORTCUT_LISTENER;"
-                        + "component=androidx.core.google.shortcuts.test/androidx.core.google."
-                        + "shortcuts.TrampolineActivity;S.id=id1;end")
-                .put(IndexableKeys.NAMESPACE, "namespace2")
-                .put(IndexableKeys.TTL_MILLIS, 1000)
-                .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS, 1)
-                .put("stringArrayProperty", "s1", "s2")
-                .put("longArrayProperty", 1L, 2L)
-                .put("booleanArrayProperty", true, false)
-                .put("stringProperty", "s3")
-                .put("longProperty", 3L)
-                .put("booleanProperty", true)
-                .put("documentArrayProperty", expectedChild1, expectedChild2)
-                .put("documentProperty", expectedChild1)
-                .build();
-
-        assertThat(indexable).isEqualTo(expectedIndexable);
-    }
-}
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/TimerConverterTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/TimerConverterTest.java
deleted file mode 100644
index f805be4..0000000
--- a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/TimerConverterTest.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.converters;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.provider.AlarmClock;
-
-import androidx.appsearch.app.GenericDocument;
-import androidx.appsearch.builtintypes.Timer;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.google.android.gms.appindex.Indexable;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.TimeZone;
-
-@RunWith(AndroidJUnit4.class)
-public class TimerConverterTest {
-    @Mock private TimeModel mTimeModelMock;
-    private TimerConverter mTimerConverter;
-    private final Context mContext = ApplicationProvider.getApplicationContext();
-
-    @Before
-    public void setup() {
-        MockitoAnnotations.initMocks(this);
-        mTimerConverter = new TimerConverter(mTimeModelMock);
-    }
-
-    @Test
-    @SmallTest
-    public void testConvert_returnsIndexable() throws Exception {
-        // Expire time is timezone sensitive. Force the default timezone to be GMT here.
-        TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
-
-        // mock 5 seconds passed since the timer startTime
-        when(mTimeModelMock.getSystemCurrentTimeMillis()).thenReturn(8000L);
-        when(mTimeModelMock.getSystemClockElapsedRealtime()).thenReturn(10000L);
-
-        Timer timer = new Timer.Builder("namespace", "id")
-                .setDocumentScore(10)
-                .setDocumentTtlMillis(60000)
-                .setCreationTimestampMillis(1)
-                .setName("my timer")
-                .setDurationMillis(1000)
-                .setRemainingDurationMillis(10000)
-                .setRingtone(AlarmClock.VALUE_RINGTONE_SILENT)
-                .setStatus(Timer.STATUS_STARTED)
-                .setShouldVibrate(true)
-                .setBaseTimeMillis(
-                        /*baseTimeMillis=*/3000,
-                        /*baseTimeMillisInElapsedRealtime=*/5000,
-                        /*bootCount=*/1)
-                .setOriginalDurationMillis(800)
-                .build();
-
-        Indexable result = mTimerConverter.convertGenericDocument(
-                mContext, GenericDocument.fromDocumentClass(timer))
-                .build();
-        Indexable expectedResult = new Indexable.Builder("Timer")
-                .setMetadata(new Indexable.Metadata.Builder().setScore(10))
-                .setId("id")
-                .setName("namespace")
-                .setUrl("intent:#Intent;action=androidx.core.content.pm.SHORTCUT_LISTENER;"
-                        + "component=androidx.core.google.shortcuts.test/androidx.core.google."
-                        + "shortcuts.TrampolineActivity;S.id=id;end")
-                .put(IndexableKeys.NAMESPACE, "namespace")
-                .put(IndexableKeys.TTL_MILLIS, 60000)
-                .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS, 1)
-                .put("message", "my timer")
-                .put("length", 1000)
-                .put("timerStatus", "Started")
-                // Calculation: 3000 + 10000 = 13000 = 13 seconds since epoch
-                .put("expireTime", "1970-01-01T00:00:13+0000")
-                // Calculation: 8000 - (10000 - 5000) + 10000 = 13000 = 13 seconds since epoch
-                .put("expireTimeCorrectedByStartTimeInElapsedRealtime",
-                        "1970-01-01T00:00:13+0000")
-                .put("remainingTime", 10000)
-                .put("ringtone", "silent")
-                .put("vibrate", true)
-                .put("bootCount", 1)
-                .put("originalDurationMillis", 800)
-                .build();
-        assertThat(result).isEqualTo(expectedResult);
-    }
-
-    @Test
-    @SmallTest
-    public void testConvert_differentSystemCurrentTime_returnsIndexable() throws Exception {
-        // Expire time is timezone sensitive. Force the default timezone to be GMT here.
-        TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
-
-        // 10 seconds has passed for System.CurrentTimeMillis
-        when(mTimeModelMock.getSystemCurrentTimeMillis()).thenReturn(13000L);
-        // 5 seconds has passed for SystemClock.elapsedRealtime
-        when(mTimeModelMock.getSystemClockElapsedRealtime()).thenReturn(10000L);
-
-        Timer timer = new Timer.Builder("namespace", "id")
-                .setDocumentScore(10)
-                .setDocumentTtlMillis(60000)
-                .setCreationTimestampMillis(1)
-                .setName("my timer")
-                .setDurationMillis(1000)
-                .setRemainingDurationMillis(10000)
-                .setRingtone(AlarmClock.VALUE_RINGTONE_SILENT)
-                .setStatus(Timer.STATUS_STARTED)
-                .setShouldVibrate(true)
-                .setBaseTimeMillis(
-                        /*baseTimeMillis=*/3000,
-                        /*baseTimeMillisInElapsedRealtime=*/5000,
-                        /*bootCount=*/1)
-                .setOriginalDurationMillis(800)
-                .build();
-
-        Indexable result = mTimerConverter.convertGenericDocument(
-                mContext, GenericDocument.fromDocumentClass(timer))
-                .build();
-        Indexable expectedResult = new Indexable.Builder("Timer")
-                .setMetadata(new Indexable.Metadata.Builder().setScore(10))
-                .setId("id")
-                .setName("namespace")
-                .setUrl("intent:#Intent;action=androidx.core.content.pm.SHORTCUT_LISTENER;"
-                        + "component=androidx.core.google.shortcuts.test/androidx.core.google."
-                        + "shortcuts.TrampolineActivity;S.id=id;end")
-                .put(IndexableKeys.NAMESPACE, "namespace")
-                .put(IndexableKeys.TTL_MILLIS, 60000)
-                .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS, 1)
-                .put("message", "my timer")
-                .put("length", 1000)
-                .put("timerStatus", "Started")
-                // Calculation: 3000 + 10000 = 13000 = 13 seconds since epoch
-                .put("expireTime", "1970-01-01T00:00:13+0000")
-                // Calculation: 13000 - (10000 - 5000) + 10000 = 18000 = 18 seconds since epoch
-                // This is the more correct expire time
-                .put("expireTimeCorrectedByStartTimeInElapsedRealtime",
-                        "1970-01-01T00:00:18+0000")
-                .put("remainingTime", 10000)
-                .put("ringtone", "silent")
-                .put("vibrate", true)
-                .put("bootCount", 1)
-                .put("originalDurationMillis", 800)
-                .build();
-        assertThat(result).isEqualTo(expectedResult);
-    }
-
-    @Test
-    @SmallTest
-    public void testConvert_withoutOptionalFields_returnsIndexable() throws Exception {
-        Timer timer = new Timer.Builder("namespace", "id")
-                // need to override to a value, otherwise it will use current time
-                .setCreationTimestampMillis(0)
-                .build();
-
-        Indexable result = mTimerConverter.convertGenericDocument(mContext,
-                GenericDocument.fromDocumentClass(timer))
-                .build();
-        Indexable expectedResult = new Indexable.Builder("Timer")
-                .setMetadata(new Indexable.Metadata.Builder().setScore(0))
-                .setId("id")
-                .setName("namespace")
-                .setUrl("intent:#Intent;action=androidx.core.content.pm.SHORTCUT_LISTENER;"
-                        + "component=androidx.core.google.shortcuts.test/androidx.core.google."
-                        + "shortcuts.TrampolineActivity;S.id=id;end")
-                .put(IndexableKeys.NAMESPACE, "namespace")
-                .put(IndexableKeys.TTL_MILLIS, 0)
-                .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS, 0)
-                .put("length", 0)
-                .put("timerStatus", "Unknown")
-                .put("remainingTime", 0)
-                .put("vibrate", false)
-                .put("bootCount", 0)
-                .put("originalDurationMillis", 0)
-                .build();
-        assertThat(result).isEqualTo(expectedResult);
-    }
-}
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/utils/ConverterUtilsTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/utils/ConverterUtilsTest.java
deleted file mode 100644
index 85a57e7..0000000
--- a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/utils/ConverterUtilsTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.utils;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-
-import androidx.appsearch.app.GenericDocument;
-import androidx.core.google.shortcuts.converters.IndexableKeys;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.google.android.gms.appindex.Indexable;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.TimeZone;
-
-@RunWith(AndroidJUnit4.class)
-public class ConverterUtilsTest {
-    private final Context mContext = ApplicationProvider.getApplicationContext();
-
-    @Test
-    @SmallTest
-    public void testBuildBaseIndexableFromGenericDocument_returnsIndexable() {
-        GenericDocument genericDocument = new GenericDocument.Builder<>(
-                "namespace", "id", "schema")
-                .setScore(1)
-                .setCreationTimestampMillis(1)
-                .build();
-
-        Indexable.Builder expectedIndexableBuilder = new Indexable.Builder("schema")
-                .setMetadata(new Indexable.Metadata.Builder().setScore(1))
-                .setId("id")
-                .setName("namespace")
-                .setUrl("intent:#Intent;action=androidx.core.content.pm.SHORTCUT_LISTENER;"
-                        + "component=androidx.core.google.shortcuts.test/androidx.core.google."
-                        + "shortcuts.TrampolineActivity;S.id=id;end")
-                .put(IndexableKeys.NAMESPACE, "namespace")
-                .put(IndexableKeys.TTL_MILLIS, 0)
-                .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS, 1);
-        assertThat(ConverterUtils.buildBaseIndexableFromGenericDocument(
-                mContext, "schema", genericDocument).build())
-                .isEqualTo(expectedIndexableBuilder.build());
-    }
-
-    @Test
-    @SmallTest
-    public void testConvertTimestampToISO8601Format_noTimezone_returnsFormatString() {
-        TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
-        // 01/01/2020 12:00:00 GMT
-        long timestamp = 1577836800000L;
-        String formatString = ConverterUtils.convertTimestampToISO8601Format(timestamp, null);
-        assertThat(formatString).isEqualTo("2020-01-01T00:00:00+0000");
-    }
-
-    @Test
-    @SmallTest
-    public void testConvertTimestampToISO8601Format_withTimezone_returnsFormatString() {
-        // 01/01/2020 12:00:00 GMT
-        long timestamp = 1577836800000L;
-        String formatString = ConverterUtils.convertTimestampToISO8601Format(
-                timestamp,
-                TimeZone.getTimeZone("America/Los_Angeles"));
-        assertThat(formatString).isEqualTo("2019-12-31T16:00:00-0800");
-    }
-}
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/utils/EntityUriUtilsTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/utils/EntityUriUtilsTest.java
deleted file mode 100644
index 8cb6651..0000000
--- a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/utils/EntityUriUtilsTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.utils;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class EntityUriUtilsTest {
-    @Test
-    @SmallTest
-    public void testGetEntityId_validUris_returnsId() {
-        String[] entityUriStrings = new String[] {
-                // normal uri
-                "appsearch://__shortcut_adapter_db__/__shortcut_adapter_ns__/id%201",
-                // uri with parameters
-                "appsearch://__shortcut_adapter_db__/__shortcut_adapter_ns__/id%201?schemaType"
-                        + "=Timer",
-        };
-
-        for (String entityUri : entityUriStrings) {
-            String id = EntityUriUtils.getEntityId(entityUri);
-            assertThat(id).isEqualTo("id 1");
-        }
-    }
-
-    @Test
-    @SmallTest
-    public void testGetEntityId_invalidUris_returnsNull() {
-        String[] entityUriStrings = new String[] {
-                // not a uri
-                "not_a_uri",
-                // wrong scheme
-                "some_scheme://__shortcut_adapter_db__/__shortcut_adapter_ns__/id%201",
-                // wrong authority
-                "appsearch://some_authority/__shortcut_adapter_ns__/id%201",
-                // wrong namespace
-                "appsearch://__shortcut_adapter_db__/some_namespace/id%201",
-                // extra path
-                "appsearch://__shortcut_adapter_db__/__shortcut_adapter_ns__/id%201/more_path",
-                // missing id
-                "appsearch://__shortcut_adapter_db__/__shortcut_adapter_ns__",
-                // missing namespace
-                "appsearch://__shortcut_adapter_db__/id%201",
-        };
-
-        for (String entityUri : entityUriStrings) {
-            String id = EntityUriUtils.getEntityId(entityUri);
-            assertThat(id).isNull();
-        }
-    }
-}
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImpl.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImpl.java
index 2067550..078fdd8 100644
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImpl.java
+++ b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImpl.java
@@ -29,16 +29,11 @@
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.VisibleForTesting;
-import androidx.appsearch.app.GenericDocument;
-import androidx.appsearch.app.ShortcutAdapter;
 import androidx.core.content.pm.ShortcutInfoChangeListener;
 import androidx.core.content.pm.ShortcutInfoCompat;
 import androidx.core.google.shortcuts.builders.CapabilityBuilder;
 import androidx.core.google.shortcuts.builders.ParameterBuilder;
 import androidx.core.google.shortcuts.builders.ShortcutBuilder;
-import androidx.core.google.shortcuts.converters.AppSearchDocumentConverter;
-import androidx.core.google.shortcuts.converters.AppSearchDocumentConverterFactory;
-import androidx.core.google.shortcuts.utils.EntityUriUtils;
 import androidx.core.google.shortcuts.utils.ShortcutUtils;
 import androidx.core.graphics.drawable.IconCompat;
 
@@ -93,34 +88,9 @@
     @Override
     public void onShortcutAdded(@NonNull List<ShortcutInfoCompat> shortcuts) {
         List<Indexable> indexables = new ArrayList<>();
-        // A shortcut can either be an entity shortcut, or capability-instance shortcuts. Entity
-        // shortcuts will be indexed under their respective schema type, and capability-instance
-        // shortcuts will be indexed in the general shortcut corpus.
         for (ShortcutInfoCompat shortcut : shortcuts) {
-            GenericDocument entity = null;
-            // ShortcutAdapter is only available for Lollipop and above.
-            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-                entity = ShortcutAdapter.extractDocument(shortcut);
-            }
-
-            if (entity == null) {
-                // API level < Lollipop, or Shortcut might be a capability-instance shortcut.
-                ShortcutBuilder shortcutBuilder = buildShortcutIndexable(shortcut);
-
-                // Capability-instance shortcuts may contain references to entity shortcuts. If
-                // that's the case, report usage for those entity shortcuts.
-                // TODO (b/207161241): use capability binding api directly from shortcut once it's
-                //  available.
-                maybeReportEntityUsage(shortcutBuilder);
-                indexables.add(shortcutBuilder.build());
-            } else {
-                // Shortcut is an entity shortcut.
-                AppSearchDocumentConverter converter =
-                        AppSearchDocumentConverterFactory.getConverter(entity.getSchemaType());
-                Indexable.Builder entityIndexableBuilder =
-                        converter.convertGenericDocument(mContext, entity);
-                indexables.add(entityIndexableBuilder.build());
-            }
+            ShortcutBuilder shortcutBuilder = buildShortcutIndexable(shortcut);
+            indexables.add(shortcutBuilder.build());
         }
         mFirebaseAppIndex.update(indexables.toArray(new Indexable[0]));
     }
@@ -173,37 +143,6 @@
         mFirebaseAppIndex.removeAll();
     }
 
-    /**
-     * If the shortcut has references to entity URIs, then report usage for those URIs.
-     */
-    private void maybeReportEntityUsage(@NonNull ShortcutBuilder shortcutBuilder) {
-        CapabilityBuilder[] capabilities = shortcutBuilder.getCapabilities();
-        if (capabilities == null) {
-            return;
-        }
-
-        for (CapabilityBuilder capability : capabilities) {
-            ParameterBuilder[] parameters = capability.getParameters();
-            if (parameters == null) {
-                continue;
-            }
-
-            for (ParameterBuilder parameter : parameters) {
-                String[] values = parameter.getValues();
-                if (values == null) {
-                    continue;
-                }
-                for (String value : values) {
-                    String entityId = EntityUriUtils.getEntityId(value);
-                    if (entityId != null) {
-                        mFirebaseUserActions.end(
-                                buildAction(ShortcutUtils.getIndexableUrl(mContext, entityId)));
-                    }
-                }
-            }
-        }
-    }
-
     @NonNull
     private Action buildAction(@NonNull String url) {
         return new Action.Builder(Action.Builder.VIEW_ACTION)
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AlarmConverter.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AlarmConverter.java
deleted file mode 100644
index e265f8b..0000000
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AlarmConverter.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.converters;
-
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-
-import android.content.Context;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-import androidx.appsearch.app.GenericDocument;
-import androidx.core.google.shortcuts.utils.ConverterUtils;
-import androidx.core.util.Preconditions;
-
-import com.google.android.gms.appindex.AppIndexInvalidArgumentException;
-import com.google.android.gms.appindex.Indexable;
-
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.List;
-
-/**
- * Convert for the {@link androidx.appsearch.builtintypes.Alarm} built-in type.
- *
- * @hide
- */
-@RestrictTo(LIBRARY)
-public class AlarmConverter implements AppSearchDocumentConverter {
-    private static final String TAG = "AlarmConverter";
-
-    // Keys from the AppSearch document
-    private static final String NAME_KEY = "name";
-    private static final String ENABLED_KEY = "enabled";
-    private static final String DAYS_OF_WEEK_KEY = "daysOfWeek";
-    private static final String HOUR_KEY = "hour";
-    private static final String MINUTE_KEY = "minute";
-    private static final String RINGTONE_KEY = "ringtone";
-    private static final String SHOULD_VIBRATE_KEY = "shouldVibrate";
-    private static final String BLACKOUT_PERIOD_START_DATE_KEY = "blackoutPeriodStartDate";
-    private static final String BLACKOUT_PERIOD_END_DATE_KEY = "blackoutPeriodEndDate";
-    private static final String PREVIOUS_INSTANCE_KEY = "previousInstance";
-    private static final String NEXT_INSTANCE_KEY = "nextInstance";
-
-    // Keys for Indexables
-    private static final String IDENTIFIER_KEY = "identifier";
-    private static final String VIBRATE_KEY = "vibrate";
-    private static final String MESSAGE_KEY = "message";
-    private static final String DAY_OF_WEEK_KEY = "dayOfWeek";
-    private static final String ALARM_INSTANCES_KEY = "alarmInstances";
-
-    // Enums for DayOfWeek
-    private static final String MONDAY = "Monday";
-    private static final String TUESDAY = "Tuesday";
-    private static final String WEDNESDAY = "Wednesday";
-    private static final String THURSDAY = "Thursday";
-    private static final String FRIDAY = "Friday";
-    private static final String SATURDAY = "Saturday";
-    private static final String SUNDAY = "Sunday";
-
-    private static final String ALARM_INDEXABLE_TYPE = "Alarm";
-
-    private final AlarmInstanceConverter mAlarmInstanceConverter;
-
-    public AlarmConverter() {
-        mAlarmInstanceConverter = new AlarmInstanceConverter();
-    }
-
-    @NonNull
-    @Override
-    public Indexable.Builder convertGenericDocument(@NonNull Context context,
-            @NonNull GenericDocument alarm) {
-        Preconditions.checkNotNull(context);
-        Preconditions.checkNotNull(alarm);
-
-        Indexable.Builder indexableBuilder =
-                ConverterUtils.buildBaseIndexableFromGenericDocument(context,
-                        ALARM_INDEXABLE_TYPE, alarm);
-
-        indexableBuilder
-                .put(MESSAGE_KEY, alarm.getPropertyString(NAME_KEY))
-                .put(HOUR_KEY, alarm.getPropertyLong(HOUR_KEY))
-                .put(MINUTE_KEY, alarm.getPropertyLong(MINUTE_KEY))
-                .put(RINGTONE_KEY, alarm.getPropertyString(RINGTONE_KEY))
-                .put(VIBRATE_KEY, alarm.getPropertyBoolean(SHOULD_VIBRATE_KEY))
-                .put(ENABLED_KEY, alarm.getPropertyBoolean(ENABLED_KEY))
-                .put(IDENTIFIER_KEY, alarm.getId())
-                .put(BLACKOUT_PERIOD_START_DATE_KEY,
-                        alarm.getPropertyString(BLACKOUT_PERIOD_START_DATE_KEY))
-                .put(BLACKOUT_PERIOD_END_DATE_KEY,
-                        alarm.getPropertyString(BLACKOUT_PERIOD_END_DATE_KEY));
-
-        long[] daysOfWeek = alarm.getPropertyLongArray(DAYS_OF_WEEK_KEY);
-        if (daysOfWeek != null) {
-            String[] daysOfWeekString = new String[daysOfWeek.length];
-            for (int i = 0; i < daysOfWeek.length; i++) {
-                int day = (int) daysOfWeek[i];
-                switch (day) {
-                    case Calendar.MONDAY:
-                        daysOfWeekString[i] = MONDAY;
-                        break;
-                    case Calendar.TUESDAY:
-                        daysOfWeekString[i] = TUESDAY;
-                        break;
-                    case Calendar.WEDNESDAY:
-                        daysOfWeekString[i] = WEDNESDAY;
-                        break;
-                    case Calendar.THURSDAY:
-                        daysOfWeekString[i] = THURSDAY;
-                        break;
-                    case Calendar.FRIDAY:
-                        daysOfWeekString[i] = FRIDAY;
-                        break;
-                    case Calendar.SATURDAY:
-                        daysOfWeekString[i] = SATURDAY;
-                        break;
-                    case Calendar.SUNDAY:
-                        daysOfWeekString[i] = SUNDAY;
-                        break;
-                    default:
-                        Log.w(TAG, "Invalid DaysOfWeek: " + day + ", ignoring.");
-                }
-            }
-            indexableBuilder.put(DAY_OF_WEEK_KEY, daysOfWeekString);
-        }
-
-        GenericDocument previousInstance = alarm.getPropertyDocument(PREVIOUS_INSTANCE_KEY);
-        GenericDocument nextInstance = alarm.getPropertyDocument(NEXT_INSTANCE_KEY);
-        List<Indexable> alarmInstances = new ArrayList<>();
-        if (previousInstance != null) {
-            alarmInstances.add(mAlarmInstanceConverter
-                    .convertGenericDocument(context, previousInstance).build());
-        }
-        if (nextInstance != null) {
-            alarmInstances.add(mAlarmInstanceConverter
-                    .convertGenericDocument(context, nextInstance).build());
-        }
-        if (!alarmInstances.isEmpty()) {
-            try {
-                indexableBuilder.put(ALARM_INSTANCES_KEY, alarmInstances.toArray(new Indexable[0]));
-            } catch (AppIndexInvalidArgumentException e) {
-                Log.e(TAG, "Failed to add AlarmInstances to Alarm.", e);
-            }
-        }
-
-        return indexableBuilder;
-    }
-}
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AlarmInstanceConverter.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AlarmInstanceConverter.java
deleted file mode 100644
index bbeab4c..0000000
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AlarmInstanceConverter.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.converters;
-
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-
-import android.content.Context;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-import androidx.appsearch.app.GenericDocument;
-import androidx.appsearch.builtintypes.AlarmInstance;
-import androidx.core.google.shortcuts.utils.ConverterUtils;
-import androidx.core.util.Preconditions;
-
-import com.google.android.gms.appindex.Indexable;
-
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-
-/**
- * Convert for the {@link AlarmInstance} built-in type.
- *
- * @hide
- */
-@RestrictTo(LIBRARY)
-public class AlarmInstanceConverter implements AppSearchDocumentConverter{
-    private static final String TAG = "AlarmInstanceConverter";
-
-    // Keys from the AppSearch document
-    private static final String STATUS_KEY = "status";
-    private static final String SNOOZE_DURATION_MILLIS_KEY = "snoozeDurationMillis";
-
-    // Keys for Indexables
-    private static final String SCHEDULED_TIME_KEY = "scheduledTime";
-    private static final String ALARM_STATUS_KEY = "alarmStatus";
-    private static final String SNOOZE_LENGTH_KEY = "snoozeLength";
-
-    // Enums for AlarmStatus
-    private static final String SCHEDULED = "Scheduled";
-    private static final String FIRED = "Fired";
-    private static final String DISMISSED = "Dismissed";
-    private static final String SNOOZED = "Snoozed";
-    private static final String MISSED = "Missed";
-    private static final String UNKNOWN = "Unknown";
-
-    private static final String ALARM_INSTANCE_INDEXABLE_TYPE = "AlarmInstance";
-    private static final String SCHEDULED_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
-
-    @NonNull
-    @Override
-    public Indexable.Builder convertGenericDocument(@NonNull Context context,
-            @NonNull GenericDocument alarmInstance) {
-        Preconditions.checkNotNull(context);
-        Preconditions.checkNotNull(alarmInstance);
-
-        Indexable.Builder indexableBuilder =
-                ConverterUtils.buildBaseIndexableFromGenericDocument(context,
-                        ALARM_INSTANCE_INDEXABLE_TYPE, alarmInstance);
-
-        // Convert the scheduled time into a timezone dependent format
-        String scheduledTimeString = alarmInstance.getPropertyString(SCHEDULED_TIME_KEY);
-        if (scheduledTimeString != null) {
-            DateFormat format = new SimpleDateFormat(SCHEDULED_TIME_FORMAT, Locale.US);
-            try {
-                Date scheduledTime = format.parse(scheduledTimeString);
-                indexableBuilder.put(SCHEDULED_TIME_KEY,
-                        ConverterUtils.convertTimestampToISO8601Format(scheduledTime.getTime(),
-                                null));
-            } catch (ParseException e) {
-                Log.w(TAG, "Failed to parse scheduledTime: " + scheduledTimeString);
-            }
-        }
-
-        int status = (int) alarmInstance.getPropertyLong(STATUS_KEY);
-        switch (status) {
-            case AlarmInstance.STATUS_SCHEDULED:
-                indexableBuilder.put(ALARM_STATUS_KEY, SCHEDULED);
-                break;
-            case AlarmInstance.STATUS_FIRING:
-                indexableBuilder.put(ALARM_STATUS_KEY, FIRED);
-                break;
-            case AlarmInstance.STATUS_DISMISSED:
-                indexableBuilder.put(ALARM_STATUS_KEY, DISMISSED);
-                break;
-            case AlarmInstance.STATUS_SNOOZED:
-                indexableBuilder.put(ALARM_STATUS_KEY, SNOOZED);
-                break;
-            case AlarmInstance.STATUS_MISSED:
-                indexableBuilder.put(ALARM_STATUS_KEY, MISSED);
-                break;
-            case AlarmInstance.STATUS_UNKNOWN:
-                indexableBuilder.put(ALARM_STATUS_KEY, UNKNOWN);
-                break;
-            default:
-                indexableBuilder.put(ALARM_STATUS_KEY, UNKNOWN);
-                Log.w(TAG, "Invalid alarm instance status: " + status + ", defaulting to "
-                        + "AlarmInstance.STATUS_UNKNOWN");
-        }
-
-        indexableBuilder.put(SNOOZE_LENGTH_KEY,
-                alarmInstance.getPropertyLong(SNOOZE_DURATION_MILLIS_KEY));
-
-        return indexableBuilder;
-    }
-}
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AppSearchDocumentConverter.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AppSearchDocumentConverter.java
deleted file mode 100644
index b63851e..0000000
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AppSearchDocumentConverter.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.converters;
-
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-
-import android.content.Context;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-import androidx.appsearch.app.GenericDocument;
-
-import com.google.android.gms.appindex.Indexable;
-
-/**
- * Interface for a converter that will convert an AppSearch Document into {@link Indexable}.
- *
- * @hide
- */
-@RestrictTo(LIBRARY)
-public interface AppSearchDocumentConverter {
-    /** Converts a @{@link GenericDocument} into a {@link Indexable.Builder}. */
-    @NonNull
-    Indexable.Builder convertGenericDocument(@NonNull Context context,
-            @NonNull GenericDocument genericDocument);
-}
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AppSearchDocumentConverterFactory.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AppSearchDocumentConverterFactory.java
deleted file mode 100644
index 7cf4fad..0000000
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AppSearchDocumentConverterFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.converters;
-
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-import androidx.core.util.Preconditions;
-
-/**
- * A factory for {@link AppSearchDocumentConverter}. Given a schema type, if the schema type has
- * a supported converter, then return that converter. Otherwise a default
- * {@link GenericDocumentConverter} will be returned.
- *
- * @hide
- */
-@RestrictTo(LIBRARY)
-public class AppSearchDocumentConverterFactory {
-    private static final String TAG = "AppSearchDocumentConver"; // NOTYPO
-
-    private static final String TIMER_SCHEMA_TYPE = "builtin:Timer";
-    private static final String ALARM_SCHEMA_TYPE = "builtin:Alarm";
-    private static final String ALARM_INSTANCE_SCHEMA_TYPE = "builtin:AlarmInstance";
-
-    /**
-     * Returns a {@link AppSearchDocumentConverter} given a schema type. If the schema type is not
-     * supported, then the {@link GenericDocumentConverter} will be returned.
-     */
-    @NonNull
-    public static AppSearchDocumentConverter getConverter(@NonNull String schemaType) {
-        Preconditions.checkNotNull(schemaType);
-
-        if (TIMER_SCHEMA_TYPE.equals(schemaType)) {
-            return new TimerConverter();
-        } else if (ALARM_SCHEMA_TYPE.equals(schemaType)) {
-            return new AlarmConverter();
-        } else if (ALARM_INSTANCE_SCHEMA_TYPE.equals(schemaType)) {
-            return new AlarmInstanceConverter();
-        }
-
-        Log.w(TAG, "schema type " + schemaType + " does not have a Typed Converter registered. "
-                + "Returning the default GenericDocument converter.");
-        return new GenericDocumentConverter();
-    }
-
-    private AppSearchDocumentConverterFactory() {}
-}
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/GenericDocumentConverter.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/GenericDocumentConverter.java
deleted file mode 100644
index a079c9a..0000000
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/GenericDocumentConverter.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.converters;
-
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-
-import android.content.Context;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-import androidx.appsearch.app.GenericDocument;
-import androidx.core.google.shortcuts.utils.ConverterUtils;
-import androidx.core.util.Preconditions;
-
-import com.google.android.gms.appindex.AppIndexInvalidArgumentException;
-import com.google.android.gms.appindex.Indexable;
-
-/**
- * Default converter for all {@link GenericDocument}. This converter will map each property into
- * its respective {@link Indexable} field. If a schema type is not registered with a specific
- * converter, then this should be used as fallback.
- *
- * @hide
- */
-@RestrictTo(LIBRARY)
-public class GenericDocumentConverter implements AppSearchDocumentConverter {
-    private static final String TAG = "GenericDocumentConverte"; // NOTYPO
-
-    @NonNull
-    @Override
-    public Indexable.Builder convertGenericDocument(
-            @NonNull Context context,
-            @NonNull GenericDocument genericDocument) {
-        Preconditions.checkNotNull(context);
-        Preconditions.checkNotNull(genericDocument);
-
-        Indexable.Builder indexableBuilder = ConverterUtils.buildBaseIndexableFromGenericDocument(
-                context, genericDocument.getSchemaType(), genericDocument);
-
-        for (String property : genericDocument.getPropertyNames()) {
-            Object rawProperty = genericDocument.getProperty(property);
-            if (rawProperty instanceof String[]) {
-                indexableBuilder.put(property, (String[]) rawProperty);
-            } else if (rawProperty instanceof long[]) {
-                indexableBuilder.put(property, (long[]) rawProperty);
-            } else if (rawProperty instanceof double[]) {
-                // TODO (b/205890624): add conversion for double once it's supported in Indexable.
-                Log.w(TAG, "Property type double for " + property + " is not supported.");
-            } else if (rawProperty instanceof boolean[]) {
-                indexableBuilder.put(property, (boolean[]) rawProperty);
-            } else if (rawProperty instanceof byte[][]) {
-                // TODO (b/205890624): add conversion for byte[] once it's supported in Indexable.
-                Log.w(TAG, "Property type byte[] for " + property + " is not supported.");
-            } else if (rawProperty instanceof GenericDocument[]) {
-                try {
-                    indexableBuilder.put(property,
-                            convertGenericDocuments(context, (GenericDocument[]) rawProperty));
-                } catch (AppIndexInvalidArgumentException e) {
-                    Log.e(TAG, "Cannot convert GenericDocument for property " + property);
-                }
-            } else {
-                Log.e(TAG, "Undefined property type from " + property);
-            }
-        }
-        return indexableBuilder;
-    }
-
-    private Indexable[] convertGenericDocuments(Context context,
-            GenericDocument[] genericDocuments) {
-        Indexable[] indexables = new Indexable[genericDocuments.length];
-        for (int i = 0; i < genericDocuments.length; i++) {
-            indexables[i] = convertGenericDocument(context, genericDocuments[i]).build();
-        }
-
-        return indexables;
-    }
-}
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/IndexableKeys.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/IndexableKeys.java
deleted file mode 100644
index e34a460..0000000
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/IndexableKeys.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.converters;
-
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-
-import androidx.annotation.RestrictTo;
-
-/**
- * Constants for the keys for common {@link com.google.firebase.appindexing.Indexable} fields.
- *
- * @hide
- */
-@RestrictTo(LIBRARY)
-public class IndexableKeys {
-    // General
-    public static final String NAMESPACE = "_namespace";
-    public static final String TTL_MILLIS = "_ttlMillis";
-    public static final String CREATION_TIMESTAMP_MILLIS = "_creationTimestampMillis";
-
-    private IndexableKeys() {}
-}
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/TimeModel.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/TimeModel.java
deleted file mode 100644
index 12256a3..0000000
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/TimeModel.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.converters;
-
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-
-import android.os.SystemClock;
-
-import androidx.annotation.RestrictTo;
-
-/**
- * Wrapper around time related system methods. This makes unit testing against system times
- * easier.
- *
- * @hide
- */
-@RestrictTo(LIBRARY)
-public class TimeModel {
-    /** Returns {@link System#currentTimeMillis()}. */
-    public long getSystemCurrentTimeMillis() {
-        return System.currentTimeMillis();
-    }
-
-    /** Returns {@link SystemClock#elapsedRealtime()}. */
-    public long getSystemClockElapsedRealtime() {
-        return SystemClock.elapsedRealtime();
-    }
-}
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/TimerConverter.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/TimerConverter.java
deleted file mode 100644
index db5f88a..0000000
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/TimerConverter.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.converters;
-
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-
-import android.content.Context;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-import androidx.annotation.VisibleForTesting;
-import androidx.appsearch.app.GenericDocument;
-import androidx.appsearch.builtintypes.Timer;
-import androidx.core.google.shortcuts.utils.ConverterUtils;
-import androidx.core.util.Preconditions;
-
-import com.google.android.gms.appindex.Indexable;
-
-/**
- * Convert for the {@link Timer} built-in type.
- *
- * @hide
- */
-@RestrictTo(LIBRARY)
-public class TimerConverter implements AppSearchDocumentConverter {
-    private static final String TAG = "TimerConverter";
-
-    // Keys from the AppSearch document
-    private static final String NAME_KEY = "name";
-    private static final String DURATION_MILLIS_KEY = "durationMillis";
-    private static final String REMAINING_DURATION_MILLIS_KEY = "remainingDurationMillis";
-    private static final String RINGTONE_KEY = "ringtone";
-    private static final String STATUS_KEY = "status";
-    private static final String SHOULD_VIBRATE_KEY = "shouldVibrate";
-    private static final String BASE_TIME_MILLIS_KEY = "baseTimeMillis";
-    private static final String BASE_TIME_MILLIS_IN_ELAPSED_REALTIME_KEY =
-            "baseTimeMillisInElapsedRealtime";
-    private static final String BOOT_COUNT_KEY = "bootCount";
-    private static final String ORIGINAL_DURATION_MILLIS_KEY = "originalDurationMillis";
-
-    // Keys for Indexables
-    private static final String MESSAGE_KEY = "message";
-    private static final String LENGTH_KEY = "length";
-    private static final String REMAINING_TIME_KEY = "remainingTime";
-    private static final String EXPIRE_TIME_KEY = "expireTime";
-    private static final String EXPIRE_TIME_CORRECTED_BY_START_TIME_IN_ELAPSED_REALTIME_KEY =
-            "expireTimeCorrectedByStartTimeInElapsedRealtime";
-    private static final String TIMER_STATUS_KEY = "timerStatus";
-    private static final String VIBRATE_KEY = "vibrate";
-
-    // Enums for TimerStatus
-    private static final String STARTED = "Started";
-    private static final String PAUSED = "Paused";
-    private static final String EXPIRED = "Expired";
-    private static final String MISSED = "Missed";
-    private static final String RESET = "Reset";
-    private static final String UNKNOWN = "Unknown";
-
-    private static final String TIMER_INDEXABLE_TYPE = "Timer";
-
-    private final TimeModel mTimeModel;
-
-    public TimerConverter() {
-        this(new TimeModel());
-    }
-
-    @VisibleForTesting
-    TimerConverter(TimeModel timeModel) {
-        mTimeModel = timeModel;
-    }
-
-    @Override
-    @NonNull
-    public Indexable.Builder convertGenericDocument(@NonNull Context context,
-            @NonNull GenericDocument timer) {
-        Preconditions.checkNotNull(context);
-        Preconditions.checkNotNull(timer);
-
-        Indexable.Builder indexableBuilder = ConverterUtils.buildBaseIndexableFromGenericDocument(
-                    context, TIMER_INDEXABLE_TYPE, timer);
-
-        indexableBuilder
-                .put(MESSAGE_KEY, timer.getPropertyString(NAME_KEY))
-                .put(LENGTH_KEY, timer.getPropertyLong(DURATION_MILLIS_KEY))
-                .put(REMAINING_TIME_KEY,
-                        timer.getPropertyLong(REMAINING_DURATION_MILLIS_KEY))
-                .put(RINGTONE_KEY, timer.getPropertyString(RINGTONE_KEY))
-                .put(VIBRATE_KEY, timer.getPropertyBoolean(SHOULD_VIBRATE_KEY))
-                .put(BOOT_COUNT_KEY, timer.getPropertyLong(BOOT_COUNT_KEY))
-                .put(ORIGINAL_DURATION_MILLIS_KEY,
-                        timer.getPropertyLong(ORIGINAL_DURATION_MILLIS_KEY));
-
-        int timerStatus = (int) timer.getPropertyLong(STATUS_KEY);
-        switch (timerStatus) {
-            case Timer.STATUS_UNKNOWN:
-                indexableBuilder.put(TIMER_STATUS_KEY, UNKNOWN);
-                break;
-            case Timer.STATUS_STARTED:
-                indexableBuilder.put(TIMER_STATUS_KEY, STARTED);
-                break;
-            case Timer.STATUS_PAUSED:
-                indexableBuilder.put(TIMER_STATUS_KEY, PAUSED);
-                break;
-            case Timer.STATUS_EXPIRED:
-                indexableBuilder.put(TIMER_STATUS_KEY, EXPIRED);
-                break;
-            case Timer.STATUS_MISSED:
-                indexableBuilder.put(TIMER_STATUS_KEY, MISSED);
-                break;
-            case Timer.STATUS_RESET:
-                indexableBuilder.put(TIMER_STATUS_KEY, RESET);
-                break;
-            default:
-                indexableBuilder.put(TIMER_STATUS_KEY, UNKNOWN);
-                Log.w(TAG, "Invalid time status: " + timerStatus + ", defaulting to "
-                        + "Timer.STATUS_UNKNOWN");
-        }
-
-        if (timerStatus == Timer.STATUS_STARTED) {
-            long startTime = timer.getPropertyLong(BASE_TIME_MILLIS_KEY);
-            long remainingTime = timer.getPropertyLong(REMAINING_DURATION_MILLIS_KEY);
-
-            long expireTime = remainingTime + startTime;
-            indexableBuilder.put(EXPIRE_TIME_KEY,
-                    ConverterUtils.convertTimestampToISO8601Format(expireTime, null));
-
-            long startTimeInElapsedRealtime =
-                    timer.getPropertyLong(BASE_TIME_MILLIS_IN_ELAPSED_REALTIME_KEY);
-            if (startTimeInElapsedRealtime >= 0) {
-                // If startTime in elapsed realtime is set, use that to calculate expire time as
-                // well.
-                long elapsedTime = mTimeModel.getSystemClockElapsedRealtime()
-                        - startTimeInElapsedRealtime;
-                long expireTimeFromElapsedRealtime =
-                        mTimeModel.getSystemCurrentTimeMillis() - elapsedTime + remainingTime;
-                indexableBuilder.put(EXPIRE_TIME_CORRECTED_BY_START_TIME_IN_ELAPSED_REALTIME_KEY,
-                        ConverterUtils.convertTimestampToISO8601Format(
-                                expireTimeFromElapsedRealtime, null));
-            }
-        }
-        return indexableBuilder;
-    }
-}
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/utils/ConverterUtils.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/utils/ConverterUtils.java
deleted file mode 100644
index bfd4a4f..0000000
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/utils/ConverterUtils.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.utils;
-
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-
-import android.content.Context;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
-import androidx.appsearch.app.GenericDocument;
-import androidx.core.google.shortcuts.converters.AppSearchDocumentConverter;
-import androidx.core.google.shortcuts.converters.IndexableKeys;
-import androidx.core.util.Preconditions;
-
-import com.google.android.gms.appindex.Indexable;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-import java.util.TimeZone;
-
-/**
- * Utility methods for {@link AppSearchDocumentConverter}.
- *
- * @hide
- */
-@RestrictTo(LIBRARY)
-public class ConverterUtils {
-    private static final String ISO8601_DATE_TIME_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ssZ";
-
-    /** Creates an {@link Indexable.Builder} from {@link GenericDocument} with common fields set. */
-    @NonNull
-    public static Indexable.Builder buildBaseIndexableFromGenericDocument(
-            @NonNull Context context,
-            @NonNull String indexableType,
-            @NonNull GenericDocument genericDocument) {
-        Preconditions.checkNotNull(context);
-        Preconditions.checkNotNull(genericDocument);
-
-        return new Indexable.Builder(indexableType)
-                .setId(genericDocument.getId())
-                // TODO (b/206020715): remove name when it's no longer a required field.
-                .setName(genericDocument.getNamespace())
-                .setMetadata(new Indexable.Metadata.Builder().setScore(genericDocument.getScore()))
-                .setUrl(ShortcutUtils.getIndexableUrl(context, genericDocument.getId()))
-                .put(IndexableKeys.NAMESPACE, genericDocument.getNamespace())
-                .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS,
-                        genericDocument.getCreationTimestampMillis())
-                .put(IndexableKeys.TTL_MILLIS, genericDocument.getTtlMillis());
-    }
-
-    /** Converts a timestamp into ISO8601 format. */
-    @NonNull
-    public static String convertTimestampToISO8601Format(
-            long timestamp,
-            @Nullable TimeZone timeZone) {
-        DateFormat dateFormat = new SimpleDateFormat(ISO8601_DATE_TIME_FORMAT_STRING, Locale.US);
-        if (timeZone != null) {
-            dateFormat.setTimeZone(timeZone);
-        }
-        Date date = new Date(timestamp);
-        return dateFormat.format(date);
-    }
-
-    private ConverterUtils() {}
-}
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/utils/EntityUriUtils.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/utils/EntityUriUtils.java
deleted file mode 100644
index 1d41cd8..0000000
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/utils/EntityUriUtils.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.core.google.shortcuts.utils;
-
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-
-import android.content.UriMatcher;
-import android.net.Uri;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
-import androidx.core.util.Preconditions;
-
-/**
- * Utility methods for {@link Uri} for AppSearch Documents.
- *
- * @hide
- */
-@RestrictTo(LIBRARY)
-public class EntityUriUtils {
-    private static final String ENTITY_URI_SCHEME = "appsearch";
-    private static final String ENTITY_URI_AUTHORITY = "__shortcut_adapter_db__";
-    private static final String ENTITY_URI_NS_PATH = "__shortcut_adapter_ns__";
-
-    private static final int ENTITY_ID = 1;
-
-    private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
-    static {
-        sUriMatcher.addURI(ENTITY_URI_AUTHORITY, ENTITY_URI_NS_PATH + "/*", ENTITY_ID);
-    }
-
-    /**
-     * If the uri is a valid AppSearch entity uri, then return its entity id, otherwise return
-     * null.
-     */
-    // TODO (ddong): move this to ShortcutAdapter.
-    @Nullable
-    public static String getEntityId(@NonNull String entityUriString) {
-        Preconditions.checkNotNull(entityUriString);
-
-        Uri entityUri = Uri.parse(entityUriString);
-        if (!ENTITY_URI_SCHEME.equals(entityUri.getScheme())) {
-            return null;
-        }
-
-        int match = sUriMatcher.match(entityUri);
-        if (match == ENTITY_ID) {
-            return entityUri.getLastPathSegment();
-        }
-
-        return null;
-    }
-
-    private EntityUriUtils() {}
-}
diff --git a/core/core/src/main/java/androidx/core/app/ActivityCompat.java b/core/core/src/main/java/androidx/core/app/ActivityCompat.java
index 4481909..b57647b 100644
--- a/core/core/src/main/java/androidx/core/app/ActivityCompat.java
+++ b/core/core/src/main/java/androidx/core/app/ActivityCompat.java
@@ -17,6 +17,7 @@
 package androidx.core.app;
 
 import android.Manifest;
+import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.Context;
 import android.content.ContextWrapper;
@@ -49,6 +50,8 @@
 import androidx.core.os.BuildCompat;
 import androidx.core.view.DragAndDropPermissionsCompat;
 
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
@@ -596,7 +599,11 @@
             // notification permission doesn't exist before T
             return false;
         }
-        if (Build.VERSION.SDK_INT >= 23) {
+        if (Build.VERSION.SDK_INT >= 32) {
+            return Api32Impl.shouldShowRequestPermissionRationale(activity, permission);
+        } else if (Build.VERSION.SDK_INT == 31) {
+            return Api31Impl.shouldShowRequestPermissionRationale(activity, permission);
+        } else if (Build.VERSION.SDK_INT >= 23) {
             return Api23Impl.shouldShowRequestPermissionRationale(activity, permission);
         }
         return false;
@@ -795,6 +802,50 @@
         static boolean isLaunchedFromBubble(@NonNull final Activity activity)  {
             return activity.isLaunchedFromBubble();
         }
+
+        /**
+         * Fix memory leak on Android 12:
+         * <a href="https://github.com/androidx/androidx/pull/435">
+         *     https://github.com/androidx/androidx/pull/435
+         * </a>
+         */
+        @SuppressLint("BanUncheckedReflection")
+        @DoNotInline
+        static boolean shouldShowRequestPermissionRationale(Activity activity, String permission) {
+            try {
+                // 1. Background of the problem:Fix shouldShowRequestPermissionRationale causing memory leak in Android 12,
+                //    this problem has been fixed on the Android 12L system, but it is still a historical problem for the Android 12 system
+                // 2. The reason for the problem: The culprit is that the PermissionUsageHelper holds the Context object as a field,
+                //    and calls AppOpsManager.startWatchingStarted in the constructor to start the monitoring,
+                //    so that the PermissionUsageHelper object will be added to the AppOpsManager#mStartedWatchers collection,
+                //    which will lead to active calls in the Activity When finishing, stopWatchingStarted is not used to remove the watch,
+                //    which causes the Activity object to be held in the AppOpsManager#mStartedWatchers collection,
+                //    which indirectly causes the Activity object to not be recycled by the system.
+                // 3. The solution to the problem: The handling of this problem is also very simple and rude, that is,
+                //    to replace the Context parameter passed in the outer layer from the Activity object to the Application object,
+                //    because the Application life cycle is relatively long, but there is only the shouldShowRequestPermissionRationale method in the Activity,
+                //    and What if there is no such method in Application? Looking at the implementation of this method, in fact,
+                //    that method will eventually call the PackageManager.shouldShowRequestPermissionRationale method (hidden API, but not in the blacklist),
+                //    so as long as the PackageManager object can be obtained, and finally use reflection to execute this method , which avoids memory leaks.
+                PackageManager packageManager = activity.getApplication().getPackageManager();
+                Method method = PackageManager.class.getMethod("shouldShowRequestPermissionRationale", String.class);
+                return (boolean) method.invoke(packageManager, permission);
+            } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
+                return activity.shouldShowRequestPermissionRationale(permission);
+            }
+        }
+    }
+
+    @RequiresApi(32)
+    static class Api32Impl  {
+        private Api32Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static boolean shouldShowRequestPermissionRationale(Activity activity, String permission) {
+            return activity.shouldShowRequestPermissionRationale(permission);
+        }
     }
 
     @RequiresApi(16)
diff --git a/core/core/src/main/java/androidx/core/app/NotificationCompat.java b/core/core/src/main/java/androidx/core/app/NotificationCompat.java
index 3ba98ca..3e79961 100644
--- a/core/core/src/main/java/androidx/core/app/NotificationCompat.java
+++ b/core/core/src/main/java/androidx/core/app/NotificationCompat.java
@@ -56,6 +56,7 @@
 import androidx.annotation.ColorInt;
 import androidx.annotation.DimenRes;
 import androidx.annotation.Dimension;
+import androidx.annotation.DoNotInline;
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -1035,7 +1036,7 @@
 
             // Avoid the setter which requires wrapping/unwrapping IconCompat and extra null checks
             if (Build.VERSION.SDK_INT >= 23) {
-                this.mSmallIcon = notification.getSmallIcon();
+                this.mSmallIcon = Api23Impl.getSmallIcon(notification);
             }
 
             // Add actions from the notification.
@@ -1542,10 +1543,11 @@
             mNotification.sound = sound;
             mNotification.audioStreamType = Notification.STREAM_DEFAULT;
             if (Build.VERSION.SDK_INT >= 21) {
-                mNotification.audioAttributes = new AudioAttributes.Builder()
-                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
-                        .setUsage(AudioAttributes.USAGE_NOTIFICATION)
-                        .build();
+                AudioAttributes.Builder builder = Api21Impl.createBuilder();
+                builder = Api21Impl.setContentType(builder,
+                        AudioAttributes.CONTENT_TYPE_SONIFICATION);
+                builder = Api21Impl.setUsage(builder, AudioAttributes.USAGE_NOTIFICATION);
+                mNotification.audioAttributes = Api21Impl.build(builder);
             }
             return this;
         }
@@ -1571,10 +1573,11 @@
             mNotification.sound = sound;
             mNotification.audioStreamType = streamType;
             if (Build.VERSION.SDK_INT >= 21) {
-                mNotification.audioAttributes = new AudioAttributes.Builder()
-                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
-                        .setLegacyStreamType(streamType)
-                        .build();
+                AudioAttributes.Builder builder = Api21Impl.createBuilder();
+                builder = Api21Impl.setContentType(builder,
+                        AudioAttributes.CONTENT_TYPE_SONIFICATION);
+                builder = Api21Impl.setLegacyStreamType(builder, streamType);
+                mNotification.audioAttributes = Api21Impl.build(builder);
             }
             return this;
         }
@@ -2122,8 +2125,8 @@
             Notification notification = compatBuilder.build();
             if (Build.VERSION.SDK_INT >= 24) {
                 // On N and newer, do some magic and delegate to the Platform's implementation
-                return Notification.Builder.recoverBuilder(mContext, notification)
-                        .createContentView();
+                return Api24Impl.createContentView(Api24Impl.recoverBuilder(mContext,
+                        notification));
             } else {
                 // Before N, delegate to the deprecated field on the built notification
                 return notification.contentView;
@@ -2156,8 +2159,8 @@
             Notification notification = compatBuilder.build();
             if (Build.VERSION.SDK_INT >= 24) {
                 // On N and newer, do some magic and delegate to the Platform's implementation
-                return Notification.Builder.recoverBuilder(mContext, notification)
-                        .createBigContentView();
+                return Api24Impl.createBigContentView(Api24Impl.recoverBuilder(mContext,
+                        notification));
             } else {
                 // Before N, delegate to the deprecated field on the built notification
                 return notification.bigContentView;
@@ -2190,9 +2193,8 @@
             Notification notification = compatBuilder.build();
             if (Build.VERSION.SDK_INT >= 24) {
                 // On N and newer, do some magic and delegate to the Platform's implementation
-                Notification.Builder platformBuilder =
-                        Notification.Builder.recoverBuilder(mContext, notification);
-                return platformBuilder.createHeadsUpContentView();
+                return Api24Impl.createHeadsUpContentView(Api24Impl.recoverBuilder(mContext,
+                        notification));
             } else {
                 // Before N, delegate to the deprecated field on the built notification
                 return notification.headsUpContentView;
@@ -2530,6 +2532,88 @@
         public @Nullable BubbleMetadata getBubbleMetadata() {
             return mBubbleMetadata;
         }
+
+        /**
+         * A class for wrapping calls to {@link Notification.Builder} methods which
+         * were added in API 21; these calls must be wrapped to avoid performance issues.
+         * See the UnsafeNewApiCall lint rule for more details.
+         */
+        @RequiresApi(21)
+        static class Api21Impl {
+            private Api21Impl() { }
+
+            @DoNotInline
+            static AudioAttributes.Builder createBuilder() {
+                return new AudioAttributes.Builder();
+            }
+
+            @DoNotInline
+            static AudioAttributes.Builder setContentType(AudioAttributes.Builder builder,
+                    int contentType) {
+                return builder.setContentType(contentType);
+            }
+
+            @DoNotInline
+            static AudioAttributes.Builder setUsage(AudioAttributes.Builder builder, int usage) {
+                return builder.setUsage(usage);
+            }
+
+            @DoNotInline
+            static AudioAttributes.Builder setLegacyStreamType(AudioAttributes.Builder builder,
+                    int streamType) {
+                return builder.setLegacyStreamType(streamType);
+            }
+
+            @DoNotInline
+            static AudioAttributes build(AudioAttributes.Builder builder) {
+                return builder.build();
+            }
+        }
+
+        /**
+         * A class for wrapping calls to {@link Notification.Builder} methods which
+         * were added in API 23; these calls must be wrapped to avoid performance issues.
+         * See the UnsafeNewApiCall lint rule for more details.
+         */
+        @RequiresApi(23)
+        static class Api23Impl {
+            private Api23Impl() { }
+
+            @DoNotInline
+            static Icon getSmallIcon(Notification notification) {
+                return notification.getSmallIcon();
+            }
+        }
+
+        /**
+         * A class for wrapping calls to {@link Notification.Builder} methods which
+         * were added in API 24; these calls must be wrapped to avoid performance issues.
+         * See the UnsafeNewApiCall lint rule for more details.
+         */
+        @RequiresApi(24)
+        static class Api24Impl {
+            private Api24Impl() { }
+
+            @DoNotInline
+            static Notification.Builder recoverBuilder(Context context, Notification n) {
+                return Notification.Builder.recoverBuilder(context, n);
+            }
+
+            @DoNotInline
+            static RemoteViews createContentView(Notification.Builder builder) {
+                return builder.createContentView();
+            }
+
+            @DoNotInline
+            static RemoteViews createHeadsUpContentView(Notification.Builder builder) {
+                return builder.createHeadsUpContentView();
+            }
+
+            @DoNotInline
+            static RemoteViews createBigContentView(Notification.Builder builder) {
+                return builder.createHeadsUpContentView();
+            }
+        }
     }
 
     /**
diff --git a/datastore/datastore-compose-samples/build.gradle b/datastore/datastore-compose-samples/build.gradle
index b22a33c..81ec2ec 100644
--- a/datastore/datastore-compose-samples/build.gradle
+++ b/datastore/datastore-compose-samples/build.gradle
@@ -70,9 +70,3 @@
         }
     }
 }
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/datastore/datastore-sampleapp/build.gradle b/datastore/datastore-sampleapp/build.gradle
index 152bc1c..a6f728e 100644
--- a/datastore/datastore-sampleapp/build.gradle
+++ b/datastore/datastore-sampleapp/build.gradle
@@ -69,10 +69,3 @@
 android {
     namespace "com.example.datastoresampleapp"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/datastore/datastore/build.gradle b/datastore/datastore/build.gradle
index c5563a6..bad186c 100644
--- a/datastore/datastore/build.gradle
+++ b/datastore/datastore/build.gradle
@@ -61,10 +61,3 @@
             "method along with components that require an Android dependency"
     legacyDisableKotlinStrictApiMode = true
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/development/build_log_simplifier/message-flakes.ignore b/development/build_log_simplifier/message-flakes.ignore
index 21e5de1..978b6c5 100644
--- a/development/build_log_simplifier/message-flakes.ignore
+++ b/development/build_log_simplifier/message-flakes.ignore
@@ -145,5 +145,5 @@
 Using custom version .* of metalava due to METALAVA_VERSION being set\.
 Publishing build scan\.\.\.
 https://ge\.androidx\.dev/s/.*
-# support-v7-demos:compileReleaseJavaWithJavac
+# androidx-demos:compileReleaseJavaWithJavac
 Note: \$SUPPORT/samples/Support[0-9]+Demos/src/main/java/com/example/android/supportv[0-9]+/util/DiffUtilActivity\.java uses unchecked or unsafe operations\.
diff --git a/development/build_log_simplifier/messages.ignore b/development/build_log_simplifier/messages.ignore
index 4ace91a..906fb0d 100644
--- a/development/build_log_simplifier/messages.ignore
+++ b/development/build_log_simplifier/messages.ignore
@@ -131,12 +131,16 @@
 Daemon will be stopped at the end of the build
 # > Configure project :appsearch:appsearch\-local\-backend
 Configuration on demand is an incubating feature\.
+Calculating task graph as configuration cache cannot be reused because the set of Gradle properties has changed\.
 You are using legacy USE_ANDROIDX_REMOTE_BUILD_CACHE=true type, this cache has been turned down, so you are \*not\* using a remote cache\. Please move to the new cache using http://go/androidx\-dev\#remote\-build\-cache
 Configuration cache is an incubating feature\.
 # > Configure project :
 updated local\.properties
 # > Configure project :compose:test\-utils
 The following Kotlin source sets were configured but not added to any Kotlin compilation:
+\* iosArm[0-9]+Main
+\* iosSimulatorArm[0-9]+Main
+\* iosX[0-9]+Main
 \* androidAndroidTestRelease
 \* androidTestFixtures
 \* androidTestFixturesDebug
@@ -478,3 +482,13 @@
 WARNING: Please consider reporting this to the maintainers of org\.gradle\.internal\.classloader\.ClassLoaderUtils\$AbstractClassLoaderLookuper
 # AGP warning about API usage we have no control over
 Values of variant API AnnotationProcessorOptions\.arguments are queried and may return non final values, this is unsupported
+# AGP warning that will go away soon
+WARNING:Software Components will not be created automatically for Maven publishing from Android Gradle Plugin 8\.0\. To opt\-in to the future behavior, set the Gradle property android\.disableAutomaticComponentCreation=true in the `gradle\.properties` file or use the new publishing DSL\.
+# > Task :help
+Welcome to Gradle [0-9]+\.[0-9]+\.
+To run a build, run gradlew <task> \.\.\.
+To see a list of available tasks, run gradlew tasks
+To see more detail about a task, run gradlew help \-\-task <task>
+To see a list of command\-line options, run gradlew \-\-help
+For more detail on using Gradle, see https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/command_line_interface\.html
+For troubleshooting, visit https://help\.gradle\.org
\ No newline at end of file
diff --git a/development/referenceDocs/stageReferenceDocsWithDackka.sh b/development/referenceDocs/stageReferenceDocsWithDackka.sh
index f12d43e..238b6f2 100755
--- a/development/referenceDocs/stageReferenceDocsWithDackka.sh
+++ b/development/referenceDocs/stageReferenceDocsWithDackka.sh
@@ -59,7 +59,6 @@
   "androidx/car"
   "androidx/concurrent"
   "androidx/contentpager"
-  "androidx/cursoradapter"
   "androidx/customview"
   "androidx/datastore"
   "androidx/documentfile"
@@ -109,7 +108,6 @@
   "androidx/car"
   "androidx/concurrent"
   "androidx/contentpager"
-  "androidx/cursoradapter"
   "androidx/customview"
   "androidx/datastore"
   "androidx/documentfile"
diff --git a/docs-public/build.gradle b/docs-public/build.gradle
index 6429cc7..702e574 100644
--- a/docs-public/build.gradle
+++ b/docs-public/build.gradle
@@ -14,8 +14,8 @@
     docs("androidx.activity:activity-ktx:1.6.0-rc02")
     docs("androidx.ads:ads-identifier:1.0.0-alpha04")
     docs("androidx.ads:ads-identifier-provider:1.0.0-alpha04")
-    docs("androidx.annotation:annotation:1.5.0-beta01")
-    docs("androidx.annotation:annotation-experimental:1.3.0-rc01")
+    docs("androidx.annotation:annotation:1.5.0-rc01")
+    docs("androidx.annotation:annotation-experimental:1.3.0")
     docs("androidx.appcompat:appcompat:1.6.0-beta01")
     docs("androidx.appcompat:appcompat-resources:1.6.0-beta01")
     docs("androidx.appsearch:appsearch:1.1.0-alpha02")
@@ -28,10 +28,10 @@
     docs("androidx.arch.core:core-testing:2.1.0")
     docs("androidx.asynclayoutinflater:asynclayoutinflater:1.0.0")
     docs("androidx.autofill:autofill:1.2.0-beta01")
-    docs("androidx.benchmark:benchmark-common:1.2.0-alpha02")
-    docs("androidx.benchmark:benchmark-junit4:1.2.0-alpha02")
-    docs("androidx.benchmark:benchmark-macro:1.2.0-alpha02")
-    docs("androidx.benchmark:benchmark-macro-junit4:1.2.0-alpha02")
+    docs("androidx.benchmark:benchmark-common:1.2.0-alpha03")
+    docs("androidx.benchmark:benchmark-junit4:1.2.0-alpha03")
+    docs("androidx.benchmark:benchmark-macro:1.2.0-alpha03")
+    docs("androidx.benchmark:benchmark-macro-junit4:1.2.0-alpha03")
     docs("androidx.biometric:biometric:1.2.0-alpha04")
     docs("androidx.biometric:biometric-ktx:1.2.0-alpha04")
     samples("androidx.biometric:biometric-ktx-samples:1.2.0-alpha04")
@@ -45,77 +45,77 @@
     docs("androidx.camera:camera-previewview:1.1.0-beta02")
     docs("androidx.camera:camera-video:1.2.0-beta01")
     docs("androidx.camera:camera-view:1.2.0-beta01")
-    docs("androidx.car.app:app:1.3.0-alpha01")
-    docs("androidx.car.app:app-automotive:1.3.0-alpha01")
-    docs("androidx.car.app:app-projected:1.3.0-alpha01")
-    docs("androidx.car.app:app-testing:1.3.0-alpha01")
+    docs("androidx.car.app:app:1.3.0-beta01")
+    docs("androidx.car.app:app-automotive:1.3.0-beta01")
+    docs("androidx.car.app:app-projected:1.3.0-beta01")
+    docs("androidx.car.app:app-testing:1.3.0-beta01")
     docs("androidx.cardview:cardview:1.0.0")
     docs("androidx.collection:collection:1.3.0-alpha02")
     docs("androidx.collection:collection-ktx:1.3.0-alpha02")
-    docs("androidx.compose.animation:animation:1.3.0-beta01")
-    docs("androidx.compose.animation:animation-core:1.3.0-beta01")
-    docs("androidx.compose.animation:animation-graphics:1.3.0-beta01")
-    samples("androidx.compose.animation:animation-samples:1.3.0-beta01")
-    samples("androidx.compose.animation:animation-core-samples:1.3.0-beta01")
-    samples("androidx.compose.animation:animation-graphics-samples:1.3.0-beta01")
-    docs("androidx.compose.foundation:foundation:1.3.0-beta01")
-    docs("androidx.compose.foundation:foundation-layout:1.3.0-beta01")
-    samples("androidx.compose.foundation:foundation-layout-samples:1.3.0-beta01")
-    samples("androidx.compose.foundation:foundation-samples:1.3.0-beta01")
-    docs("androidx.compose.material3:material3:1.0.0-beta01")
-    samples("androidx.compose.material3:material3-samples:1.0.0-beta01")
-    docs("androidx.compose.material3:material3-window-size-class:1.0.0-beta01")
-    samples("androidx.compose.material3:material3-window-size-class-samples:1.0.0-beta01")
-    docs("androidx.compose.material:material:1.3.0-beta01")
-    docs("androidx.compose.material:material-icons-core:1.3.0-beta01")
-    samples("androidx.compose.material:material-icons-core-samples:1.3.0-beta01")
-    docs("androidx.compose.material:material-ripple:1.3.0-beta01")
-    samples("androidx.compose.material:material-samples:1.3.0-beta01")
-    docs("androidx.compose.runtime:runtime:1.3.0-beta01")
-    docs("androidx.compose.runtime:runtime-livedata:1.3.0-beta01")
-    samples("androidx.compose.runtime:runtime-livedata-samples:1.3.0-beta01")
-    docs("androidx.compose.runtime:runtime-rxjava2:1.3.0-beta01")
-    samples("androidx.compose.runtime:runtime-rxjava2-samples:1.3.0-beta01")
-    docs("androidx.compose.runtime:runtime-rxjava3:1.3.0-beta01")
-    samples("androidx.compose.runtime:runtime-rxjava3-samples:1.3.0-beta01")
-    docs("androidx.compose.runtime:runtime-saveable:1.3.0-beta01")
-    samples("androidx.compose.runtime:runtime-saveable-samples:1.3.0-beta01")
-    samples("androidx.compose.runtime:runtime-samples:1.3.0-beta01")
+    docs("androidx.compose.animation:animation:1.3.0-beta02")
+    docs("androidx.compose.animation:animation-core:1.3.0-beta02")
+    docs("androidx.compose.animation:animation-graphics:1.3.0-beta02")
+    samples("androidx.compose.animation:animation-samples:1.3.0-beta02")
+    samples("androidx.compose.animation:animation-core-samples:1.3.0-beta02")
+    samples("androidx.compose.animation:animation-graphics-samples:1.3.0-beta02")
+    docs("androidx.compose.foundation:foundation:1.3.0-beta02")
+    docs("androidx.compose.foundation:foundation-layout:1.3.0-beta02")
+    samples("androidx.compose.foundation:foundation-layout-samples:1.3.0-beta02")
+    samples("androidx.compose.foundation:foundation-samples:1.3.0-beta02")
+    docs("androidx.compose.material3:material3:1.0.0-beta02")
+    samples("androidx.compose.material3:material3-samples:1.0.0-beta02")
+    docs("androidx.compose.material3:material3-window-size-class:1.0.0-beta02")
+    samples("androidx.compose.material3:material3-window-size-class-samples:1.0.0-beta02")
+    docs("androidx.compose.material:material:1.3.0-beta02")
+    docs("androidx.compose.material:material-icons-core:1.3.0-beta02")
+    samples("androidx.compose.material:material-icons-core-samples:1.3.0-beta02")
+    docs("androidx.compose.material:material-ripple:1.3.0-beta02")
+    samples("androidx.compose.material:material-samples:1.3.0-beta02")
+    docs("androidx.compose.runtime:runtime:1.3.0-beta02")
+    docs("androidx.compose.runtime:runtime-livedata:1.3.0-beta02")
+    samples("androidx.compose.runtime:runtime-livedata-samples:1.3.0-beta02")
+    docs("androidx.compose.runtime:runtime-rxjava2:1.3.0-beta02")
+    samples("androidx.compose.runtime:runtime-rxjava2-samples:1.3.0-beta02")
+    docs("androidx.compose.runtime:runtime-rxjava3:1.3.0-beta02")
+    samples("androidx.compose.runtime:runtime-rxjava3-samples:1.3.0-beta02")
+    docs("androidx.compose.runtime:runtime-saveable:1.3.0-beta02")
+    samples("androidx.compose.runtime:runtime-saveable-samples:1.3.0-beta02")
+    samples("androidx.compose.runtime:runtime-samples:1.3.0-beta02")
     docs("androidx.compose.runtime:runtime-tracing:1.0.0-alpha01")
-    docs("androidx.compose.ui:ui:1.3.0-beta01")
-    docs("androidx.compose.ui:ui-geometry:1.3.0-beta01")
-    docs("androidx.compose.ui:ui-graphics:1.3.0-beta01")
-    samples("androidx.compose.ui:ui-graphics-samples:1.3.0-beta01")
-    docs("androidx.compose.ui:ui-test:1.3.0-beta01")
-    docs("androidx.compose.ui:ui-test-junit4:1.3.0-beta01")
-    samples("androidx.compose.ui:ui-test-samples:1.3.0-beta01")
-    docs("androidx.compose.ui:ui-text:1.3.0-beta01")
-    docs("androidx.compose.ui:ui-text-google-fonts:1.3.0-beta01")
-    samples("androidx.compose.ui:ui-text-samples:1.3.0-beta01")
-    docs("androidx.compose.ui:ui-tooling:1.3.0-beta01")
-    docs("androidx.compose.ui:ui-tooling-data:1.3.0-beta01")
-    docs("androidx.compose.ui:ui-tooling-preview:1.3.0-beta01")
-    docs("androidx.compose.ui:ui-unit:1.3.0-beta01")
-    samples("androidx.compose.ui:ui-unit-samples:1.3.0-beta01")
-    docs("androidx.compose.ui:ui-util:1.3.0-beta01")
-    docs("androidx.compose.ui:ui-viewbinding:1.3.0-beta01")
-    samples("androidx.compose.ui:ui-viewbinding-samples:1.3.0-beta01")
-    samples("androidx.compose.ui:ui-samples:1.3.0-beta01")
+    docs("androidx.compose.ui:ui:1.3.0-beta02")
+    docs("androidx.compose.ui:ui-geometry:1.3.0-beta02")
+    docs("androidx.compose.ui:ui-graphics:1.3.0-beta02")
+    samples("androidx.compose.ui:ui-graphics-samples:1.3.0-beta02")
+    docs("androidx.compose.ui:ui-test:1.3.0-beta02")
+    docs("androidx.compose.ui:ui-test-junit4:1.3.0-beta02")
+    samples("androidx.compose.ui:ui-test-samples:1.3.0-beta02")
+    docs("androidx.compose.ui:ui-text:1.3.0-beta02")
+    docs("androidx.compose.ui:ui-text-google-fonts:1.3.0-beta02")
+    samples("androidx.compose.ui:ui-text-samples:1.3.0-beta02")
+    docs("androidx.compose.ui:ui-tooling:1.3.0-beta02")
+    docs("androidx.compose.ui:ui-tooling-data:1.3.0-beta02")
+    docs("androidx.compose.ui:ui-tooling-preview:1.3.0-beta02")
+    docs("androidx.compose.ui:ui-unit:1.3.0-beta02")
+    samples("androidx.compose.ui:ui-unit-samples:1.3.0-beta02")
+    docs("androidx.compose.ui:ui-util:1.3.0-beta02")
+    docs("androidx.compose.ui:ui-viewbinding:1.3.0-beta02")
+    samples("androidx.compose.ui:ui-viewbinding-samples:1.3.0-beta02")
+    samples("androidx.compose.ui:ui-samples:1.3.0-beta02")
     docs("androidx.concurrent:concurrent-futures:1.1.0")
     docs("androidx.concurrent:concurrent-futures-ktx:1.1.0")
     docs("androidx.contentpager:contentpager:1.0.0")
     docs("androidx.coordinatorlayout:coordinatorlayout:1.2.0")
     docs("androidx.core.uwb:uwb:1.0.0-alpha03")
     docs("androidx.core.uwb:uwb-rxjava3:1.0.0-alpha03")
-    docs("androidx.core:core-google-shortcuts:1.1.0-alpha02")
+    docs("androidx.core:core-google-shortcuts:1.1.0-alpha03")
     docs("androidx.core:core-performance:1.0.0-alpha03")
     samples("androidx.core:core-performance-samples:1.0.0-alpha03")
     docs("androidx.core:core-remoteviews:1.0.0-beta02")
     docs("androidx.core:core-role:1.2.0-alpha01")
     docs("androidx.core:core-animation:1.0.0-beta02")
     docs("androidx.core:core-animation-testing:1.0.0-beta01")
-    docs("androidx.core:core:1.9.0-rc01")
-    docs("androidx.core:core-ktx:1.9.0-rc01")
+    docs("androidx.core:core:1.9.0")
+    docs("androidx.core:core-ktx:1.9.0")
     docs("androidx.core:core-splashscreen:1.1.0-alpha01")
     docs("androidx.cursoradapter:cursoradapter:1.0.0")
     docs("androidx.customview:customview:1.2.0-alpha01")
@@ -170,27 +170,27 @@
     docs("androidx.leanback:leanback-paging:1.1.0-alpha09")
     docs("androidx.leanback:leanback-preference:1.2.0-alpha02")
     docs("androidx.leanback:leanback-tab:1.1.0-beta01")
-    docs("androidx.lifecycle:lifecycle-common:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-common-java8:2.6.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-common:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-common-java8:2.6.0-alpha02")
     docs("androidx.lifecycle:lifecycle-extensions:2.2.0")
-    docs("androidx.lifecycle:lifecycle-livedata:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-livedata-core:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-livedata-ktx:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-process:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-reactivestreams:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-runtime:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-runtime-compose:2.6.0-alpha01")
-    samples("androidx.lifecycle:lifecycle-runtime-compose-samples:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-runtime-ktx:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-runtime-testing:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-service:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-viewmodel:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.0-alpha01")
-    samples("androidx.lifecycle:lifecycle-viewmodel-compose-samples:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.0-alpha01")
-    docs("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-livedata:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-livedata-core:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-livedata-ktx:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-process:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-reactivestreams:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-runtime:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-runtime-compose:2.6.0-alpha02")
+    samples("androidx.lifecycle:lifecycle-runtime-compose-samples:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-runtime-ktx:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-runtime-testing:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-service:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-viewmodel:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.0-alpha02")
+    samples("androidx.lifecycle:lifecycle-viewmodel-compose-samples:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.0-alpha02")
+    docs("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.0-alpha02")
     docs("androidx.loader:loader:1.1.0")
     docs("androidx.localbroadcastmanager:localbroadcastmanager:1.1.0")
     docs("androidx.media2:media2-common:1.2.1")
@@ -201,19 +201,19 @@
     docs("androidx.mediarouter:mediarouter:1.3.1")
     docs("androidx.mediarouter:mediarouter-testing:1.3.1")
     docs("androidx.metrics:metrics-performance:1.0.0-alpha03")
-    docs("androidx.navigation:navigation-common:2.5.1")
-    docs("androidx.navigation:navigation-common-ktx:2.5.1")
-    docs("androidx.navigation:navigation-compose:2.5.1")
-    samples("androidx.navigation:navigation-compose-samples:2.5.1")
-    docs("androidx.navigation:navigation-dynamic-features-fragment:2.5.1")
-    docs("androidx.navigation:navigation-dynamic-features-runtime:2.5.1")
-    docs("androidx.navigation:navigation-fragment:2.5.1")
-    docs("androidx.navigation:navigation-fragment-ktx:2.5.1")
-    docs("androidx.navigation:navigation-runtime:2.5.1")
-    docs("androidx.navigation:navigation-runtime-ktx:2.5.1")
-    docs("androidx.navigation:navigation-testing:2.5.1")
-    docs("androidx.navigation:navigation-ui:2.5.1")
-    docs("androidx.navigation:navigation-ui-ktx:2.5.1")
+    docs("androidx.navigation:navigation-common:2.6.0-alpha01")
+    docs("androidx.navigation:navigation-common-ktx:2.6.0-alpha01")
+    docs("androidx.navigation:navigation-compose:2.6.0-alpha01")
+    samples("androidx.navigation:navigation-compose-samples:2.6.0-alpha01")
+    docs("androidx.navigation:navigation-dynamic-features-fragment:2.6.0-alpha01")
+    docs("androidx.navigation:navigation-dynamic-features-runtime:2.6.0-alpha01")
+    docs("androidx.navigation:navigation-fragment:2.6.0-alpha01")
+    docs("androidx.navigation:navigation-fragment-ktx:2.6.0-alpha01")
+    docs("androidx.navigation:navigation-runtime:2.6.0-alpha01")
+    docs("androidx.navigation:navigation-runtime-ktx:2.6.0-alpha01")
+    docs("androidx.navigation:navigation-testing:2.6.0-alpha01")
+    docs("androidx.navigation:navigation-ui:2.6.0-alpha01")
+    docs("androidx.navigation:navigation-ui-ktx:2.6.0-alpha01")
     docs("androidx.paging:paging-common:3.2.0-alpha02")
     docs("androidx.paging:paging-common-ktx:3.2.0-alpha02")
     docs("androidx.paging:paging-compose:1.0.0-alpha16")
@@ -268,11 +268,12 @@
     docs("androidx.sqlite:sqlite-ktx:2.3.0-alpha05")
     docs("androidx.startup:startup-runtime:1.2.0-alpha01")
     docs("androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01")
+    docs("androidx.test.uiautomator:uiautomator:2.3.0-alpha01")
     docs("androidx.textclassifier:textclassifier:1.0.0-alpha04")
     docs("androidx.tracing:tracing:1.2.0-alpha01")
     docs("androidx.tracing:tracing-ktx:1.2.0-alpha01")
-    docs("androidx.tracing:tracing-perfetto:1.0.0-alpha02")
-    docs("androidx.tracing:tracing-perfetto-common:1.0.0-alpha02")
+    docs("androidx.tracing:tracing-perfetto:1.0.0-alpha03")
+    docs("androidx.tracing:tracing-perfetto-common:1.0.0-alpha03")
     docs("androidx.transition:transition:1.4.1")
     docs("androidx.transition:transition-ktx:1.4.1")
     docs("androidx.tvprovider:tvprovider:1.1.0-alpha01")
@@ -282,12 +283,12 @@
     docs("androidx.versionedparcelable:versionedparcelable:1.1.1")
     docs("androidx.viewpager2:viewpager2:1.1.0-beta01")
     docs("androidx.viewpager:viewpager:1.1.0-alpha01")
-    docs("androidx.wear.compose:compose-foundation:1.1.0-alpha04")
-    samples("androidx.wear.compose:compose-foundation-samples:1.1.0-alpha04")
-    docs("androidx.wear.compose:compose-material:1.1.0-alpha04")
-    samples("androidx.wear.compose:compose-material-samples:1.1.0-alpha04")
-    docs("androidx.wear.compose:compose-navigation:1.1.0-alpha04")
-    samples("androidx.wear.compose:compose-navigation-samples:1.1.0-alpha04")
+    docs("androidx.wear.compose:compose-foundation:1.1.0-alpha05")
+    samples("androidx.wear.compose:compose-foundation-samples:1.1.0-alpha05")
+    docs("androidx.wear.compose:compose-material:1.1.0-alpha05")
+    samples("androidx.wear.compose:compose-material-samples:1.1.0-alpha05")
+    docs("androidx.wear.compose:compose-navigation:1.1.0-alpha05")
+    samples("androidx.wear.compose:compose-navigation-samples:1.1.0-alpha05")
     docs("androidx.wear.tiles:tiles:1.1.0")
     docs("androidx.wear.tiles:tiles-material:1.1.0")
     docs("androidx.wear.tiles:tiles-proto:1.1.0")
@@ -325,11 +326,11 @@
     docs("androidx.window:window-rxjava2:1.1.0-alpha03")
     docs("androidx.window:window-rxjava3:1.1.0-alpha03")
     docs("androidx.window:window-testing:1.1.0-alpha03")
-    docs("androidx.work:work-gcm:2.8.0-alpha03")
-    docs("androidx.work:work-multiprocess:2.8.0-alpha03")
-    docs("androidx.work:work-runtime:2.8.0-alpha03")
-    docs("androidx.work:work-runtime-ktx:2.8.0-alpha03")
-    docs("androidx.work:work-rxjava2:2.8.0-alpha03")
-    docs("androidx.work:work-rxjava3:2.8.0-alpha03")
-    docs("androidx.work:work-testing:2.8.0-alpha03")
+    docs("androidx.work:work-gcm:2.8.0-alpha04")
+    docs("androidx.work:work-multiprocess:2.8.0-alpha04")
+    docs("androidx.work:work-runtime:2.8.0-alpha04")
+    docs("androidx.work:work-runtime-ktx:2.8.0-alpha04")
+    docs("androidx.work:work-rxjava2:2.8.0-alpha04")
+    docs("androidx.work:work-rxjava3:2.8.0-alpha04")
+    docs("androidx.work:work-testing:2.8.0-alpha04")
 }
diff --git a/fragment/fragment/build.gradle b/fragment/fragment/build.gradle
index 02e8a8a..e067485 100644
--- a/fragment/fragment/build.gradle
+++ b/fragment/fragment/build.gradle
@@ -19,6 +19,7 @@
 
     defaultConfig {
         multiDexEnabled true
+        testInstrumentationRunnerArgument "listener", "leakcanary.FailTestOnLeakRunListener"
     }
     namespace "androidx.fragment"
 }
@@ -42,6 +43,8 @@
         exclude group: "androidx.activity", module: "activity"
     })
     androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.leakcanary)
+    androidTestImplementation(libs.leakcanaryInstrumentation)
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testRunner)
diff --git a/fragment/fragment/src/androidTest/AndroidManifest.xml b/fragment/fragment/src/androidTest/AndroidManifest.xml
index 7199829..2ea4839 100644
--- a/fragment/fragment/src/androidTest/AndroidManifest.xml
+++ b/fragment/fragment/src/androidTest/AndroidManifest.xml
@@ -22,6 +22,7 @@
     <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
 
     <application
+        android:name="androidx.fragment.app.LeakCanaryApp"
         android:supportsRtl="true"
         android:theme="@style/TestActivityTheme">
         <activity android:name="androidx.fragment.app.test.FragmentTestActivity"/>
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.kt
index dfd3fbc..c50be0d 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.kt
@@ -202,6 +202,32 @@
         fc.dispatchDestroy()
     }
 
+    @Test
+    fun testDismissDialogFragmentNoSuperCall() {
+        with(ActivityScenario.launch(EmptyFragmentTestActivity::class.java)) {
+            val fm = withActivity { supportFragmentManager }
+            val dialogFragment = TestDialogFragment()
+
+            dialogFragment.show(fm, null)
+            executePendingTransactions()
+
+            val dialog = dialogFragment.dialog
+            assertWithMessage("Dialog should be shown")
+                .that(dialog?.isShowing)
+                .isTrue()
+
+            dialogFragment.dismiss()
+            executePendingTransactions()
+
+            assertWithMessage("Ensure onDismiss was actually called")
+                .that(dialogFragment.onDismissedCalled)
+                .isTrue()
+            assertWithMessage("Dialog should be removed")
+                .that(dialog?.isShowing)
+                .isFalse()
+        }
+    }
+
     @UiThreadTest
     @Test
     fun testDialogFragmentInLayout() {
@@ -525,6 +551,7 @@
 
     class TestDialogFragment(val setShowsDialog: Boolean = false) : DialogFragment() {
         var onCancelCalled = false
+        var onDismissedCalled = false
 
         override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
             if (setShowsDialog) {
@@ -543,6 +570,10 @@
             super.onCancel(dialog)
             onCancelCalled = true
         }
+
+        override fun onDismiss(dialog: DialogInterface) {
+            onDismissedCalled = true
+        }
     }
 
     class TestDialogFragmentWithChild(
diff --git a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/LeakCanaryApp.kt
similarity index 82%
copy from privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt
copy to fragment/fragment/src/androidTest/java/androidx/fragment/app/LeakCanaryApp.kt
index c4940c5b..f64a8d1 100644
--- a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/LeakCanaryApp.kt
@@ -14,4 +14,8 @@
  * limitations under the License.
  */
 
-package androidx.privacysandbox.tools.apigenerator
\ No newline at end of file
+package androidx.fragment.app
+
+import androidx.multidex.MultiDexApplication
+
+class LeakCanaryApp : MultiDexApplication()
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/OptionsMenuFragmentTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/OptionsMenuFragmentTest.kt
index 6ff36dc..7838237 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/OptionsMenuFragmentTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/OptionsMenuFragmentTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.fragment.app
 
+import android.os.Build
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.Menu
@@ -32,6 +33,7 @@
 import androidx.test.espresso.matcher.ViewMatchers
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import androidx.testutils.withActivity
 import com.google.common.truth.Truth.assertWithMessage
@@ -41,6 +43,8 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O) // Previous SDK levels have issues passing
+// null menu that causes leak canary to crash to we don't want to run on those devices
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class OptionsMenuFragmentTest {
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java b/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java
index 7cf9874..c560c80 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java
@@ -130,6 +130,16 @@
         @Override
         public void onDismiss(@Nullable DialogInterface dialog) {
             if (mDialog != null) {
+                if (!mViewDestroyed) {
+                    // Note: we need to use allowStateLoss, because the dialog
+                    // dispatches this asynchronously so we can receive the call
+                    // after the activity is paused.  Worst case, when the user comes
+                    // back to the activity they see the dialog again.
+                    if (FragmentManager.isLoggingEnabled(Log.DEBUG)) {
+                        Log.d(TAG, "onDismiss called for DialogFragment " + this);
+                    }
+                    dismissInternal(true, true, false);
+                }
                 DialogFragment.this.onDismiss(mDialog);
             }
         }
@@ -642,16 +652,6 @@
 
     @Override
     public void onDismiss(@NonNull DialogInterface dialog) {
-        if (!mViewDestroyed) {
-            // Note: we need to use allowStateLoss, because the dialog
-            // dispatches this asynchronously so we can receive the call
-            // after the activity is paused.  Worst case, when the user comes
-            // back to the activity they see the dialog again.
-            if (FragmentManager.isLoggingEnabled(Log.DEBUG)) {
-                Log.d(TAG, "onDismiss called for DialogFragment " + this);
-            }
-            dismissInternal(true, true, false);
-        }
     }
 
     private void prepareDialog(@Nullable Bundle savedInstanceState) {
diff --git a/glance/glance-appwidget-preview/src/androidAndroidTest/kotlin/androidx/glance/appwidget/preview/GlanceAppWidgetViewAdapterTest.kt b/glance/glance-appwidget-preview/src/androidAndroidTest/kotlin/androidx/glance/appwidget/preview/GlanceAppWidgetViewAdapterTest.kt
index 673332e..d851096 100644
--- a/glance/glance-appwidget-preview/src/androidAndroidTest/kotlin/androidx/glance/appwidget/preview/GlanceAppWidgetViewAdapterTest.kt
+++ b/glance/glance-appwidget-preview/src/androidAndroidTest/kotlin/androidx/glance/appwidget/preview/GlanceAppWidgetViewAdapterTest.kt
@@ -19,6 +19,7 @@
 import androidx.glance.appwidget.preview.test.R
 import android.app.Activity
 import android.os.Bundle
+import android.view.View
 import android.view.ViewGroup
 import android.widget.FrameLayout
 import android.widget.LinearLayout
@@ -41,7 +42,31 @@
     @Before
     fun setup() {
         glanceAppWidgetViewAdapter =
-            activityTestRule.activity.findViewById(R.id.glance_appwidget_view_adapter)
+            activityTestRule
+                .activity
+                .window
+                .decorView
+                .findViewInHierarchy(GlanceAppWidgetViewAdapter::class.java)!!
+    }
+
+    /**
+     * [AppWidgetHostView] does not support view ID, therefore we need to perform our own traversal
+     * to find the [GlanceAppWidgetViewAdapter].
+     */
+    @Suppress("UNCHECKED_CAST")
+    private fun <T : View> View.findViewInHierarchy(viewClass: Class<T>): T? {
+        if (viewClass.isInstance(this)) {
+            return this as T
+        }
+        if (this is ViewGroup) {
+            (0 until childCount).forEach {
+                val res = getChildAt(it).findViewInHierarchy(viewClass)
+                if (res != null) {
+                    return res
+                }
+            }
+        }
+        return null
     }
 
     private fun initAndInflate(
diff --git a/glance/glance-appwidget-preview/src/androidMain/kotlin/androidx/glance/appwidget/preview/GlanceAppWidgetViewAdapter.kt b/glance/glance-appwidget-preview/src/androidMain/kotlin/androidx/glance/appwidget/preview/GlanceAppWidgetViewAdapter.kt
index a899e95..fab1843 100644
--- a/glance/glance-appwidget-preview/src/androidMain/kotlin/androidx/glance/appwidget/preview/GlanceAppWidgetViewAdapter.kt
+++ b/glance/glance-appwidget-preview/src/androidMain/kotlin/androidx/glance/appwidget/preview/GlanceAppWidgetViewAdapter.kt
@@ -16,9 +16,9 @@
 
 package androidx.glance.appwidget.preview
 
+import android.appwidget.AppWidgetHostView
 import android.content.Context
 import android.util.AttributeSet
-import android.widget.FrameLayout
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.currentComposer
@@ -35,17 +35,17 @@
  * View adapter that renders a glance `@Composable`. The `@Composable` is found by reading the
  * `tools:composableName` attribute that contains the FQN of the function.
  */
-internal class GlanceAppWidgetViewAdapter : FrameLayout {
+internal class GlanceAppWidgetViewAdapter : AppWidgetHostView {
 
-    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
+    constructor(context: Context, attrs: AttributeSet) : super(context) {
         init(attrs)
     }
 
-    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(
-        context,
-        attrs,
-        defStyleAttr
-    ) {
+    constructor(
+        context: Context,
+        attrs: AttributeSet,
+        @Suppress("UNUSED_PARAMETER") defStyleAttr: Int
+    ) : super(context) {
         init(attrs)
     }
 
diff --git a/gradle.properties b/gradle.properties
index c17e4a1..afdb1d0 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -16,7 +16,6 @@
 android.enableAdditionalTestOutput=true
 android.useAndroidX=true
 android.nonTransitiveRClass=true
-android.disableAutomaticComponentCreation=true
 # Suppress pointless warning about mpp being experimental
 kotlin.mpp.stability.nowarn=true
 # Workaround for b/141364941
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 5f453b8..9f483aa 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -32,7 +32,7 @@
 hilt = "2.42"
 incap = "0.2"
 kotlin = "1.7.10"
-kotlinBenchmark = "0.4.4"
+kotlinBenchmark = "0.4.5"
 kotlinNative = "1.7.10"
 kotlinCompileTesting = "1.4.9"
 kotlinCoroutines = "1.6.4"
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
index a2b67b6..f3f391d 100644
--- a/gradle/verification-metadata.xml
+++ b/gradle/verification-metadata.xml
@@ -715,17 +715,17 @@
             <sha256 value="4df94aaeee8d900be431386e31ef44e82a66e57c3ae30866aec2875aff01fe70" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="org.jetbrains.kotlinx" name="kotlinx-benchmark-plugin" version="0.4.4" androidx:reason="https://youtrack.jetbrains.com/issue/KT-53461">
-         <artifact name="kotlinx-benchmark-plugin-0.4.4.jar">
-            <sha256 value="b818d2b6c62cb6f46edbd098c4a6a71cec6f277f8fc3c51bca60d6f538693512" origin="Generated by Gradle"/>
+      <component group="org.jetbrains.kotlinx" name="kotlinx-benchmark-plugin" version="0.4.5" androidx:reason="https://youtrack.jetbrains.com/issue/KT-53461">
+         <artifact name="kotlinx-benchmark-plugin-0.4.5.jar">
+            <sha256 value="64042e32a7c23040980d8b7cb9c2dc2281bf6e19da511d054639f44ba5eaac66" origin="Generated by Gradle because artifact wasn't signed"/>
          </artifact>
-         <artifact name="kotlinx-benchmark-plugin-0.4.4.pom">
-            <sha256 value="57f0bbbf1d4d182e79f400d7cea1ebdd48bd1b4a092411756ccac054d1e07d5c" origin="Generated by Gradle"/>
+         <artifact name="kotlinx-benchmark-plugin-0.4.5.pom">
+            <sha256 value="33a06eec241b0a20bc3f37b32574d1aaed34905005daba892a85cd832de14700" origin="Generated by Gradle because artifact wasn't signed"/>
          </artifact>
       </component>
-      <component group="org.jetbrains.kotlinx.benchmark" name="org.jetbrains.kotlinx.benchmark.gradle.plugin" version="0.4.4" androidx:reason="https://youtrack.jetbrains.com/issue/KT-53461">
-         <artifact name="org.jetbrains.kotlinx.benchmark.gradle.plugin-0.4.4.pom">
-            <sha256 value="72b338deead79e32f508da7ca3a8ac46a3ce3c76ce468e6b1b313ef4ddfb5cbd" origin="Generated by Gradle"/>
+      <component group="org.jetbrains.kotlinx.benchmark" name="org.jetbrains.kotlinx.benchmark.gradle.plugin" version="0.4.5" androidx:reason="https://youtrack.jetbrains.com/issue/KT-53461">
+         <artifact name="org.jetbrains.kotlinx.benchmark.gradle.plugin-0.4.5.pom">
+            <sha256 value="b13fc9975c2f5cfb992f423c60be042252a289e0f40390e7da2122ac2dec08a5" origin="Generated by Gradle because artifact wasn't signed"/>
          </artifact>
       </component>
       <component group="org.ow2" name="ow2" version="1.5" androidx:reason="https://gitlab.ow2.org/asm/asm/-/merge_requests/354">
diff --git a/graphics/graphics-core/api/current.txt b/graphics/graphics-core/api/current.txt
index 4136e2e..1fe1a05 100644
--- a/graphics/graphics-core/api/current.txt
+++ b/graphics/graphics-core/api/current.txt
@@ -229,7 +229,6 @@
     method public void commit();
     method @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public void commitTransactionOnDraw(android.view.AttachedSurfaceControl attachedSurfaceControl);
     method public androidx.graphics.surface.SurfaceControlCompat.Transaction reparent(androidx.graphics.surface.SurfaceControlCompat surfaceControl, androidx.graphics.surface.SurfaceControlCompat? newParent);
-    method public androidx.graphics.surface.SurfaceControlCompat.Transaction reparent(androidx.graphics.surface.SurfaceControlCompat surfaceControl, android.view.SurfaceView surfaceView);
     method @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public androidx.graphics.surface.SurfaceControlCompat.Transaction reparent(androidx.graphics.surface.SurfaceControlCompat surfaceControl, android.view.AttachedSurfaceControl attachedSurfaceControl);
     method public androidx.graphics.surface.SurfaceControlCompat.Transaction setAlpha(androidx.graphics.surface.SurfaceControlCompat surfaceControl, float alpha);
     method public androidx.graphics.surface.SurfaceControlCompat.Transaction setBuffer(androidx.graphics.surface.SurfaceControlCompat surfaceControl, android.hardware.HardwareBuffer buffer, optional androidx.graphics.lowlatency.SyncFenceCompat? fence, optional kotlin.jvm.functions.Function0<kotlin.Unit>? releaseCallback);
@@ -254,7 +253,8 @@
     method public boolean await(long timeoutNanos);
     method public boolean awaitForever();
     method public void close();
-    method public long getSignalTime();
+    method protected void finalize();
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public long getSignalTime();
     method public boolean isValid();
     field public static final androidx.hardware.SyncFence.Companion Companion;
     field public static final long SIGNAL_TIME_INVALID = -1L; // 0xffffffffffffffffL
diff --git a/graphics/graphics-core/api/public_plus_experimental_current.txt b/graphics/graphics-core/api/public_plus_experimental_current.txt
index 4136e2e..1fe1a05 100644
--- a/graphics/graphics-core/api/public_plus_experimental_current.txt
+++ b/graphics/graphics-core/api/public_plus_experimental_current.txt
@@ -229,7 +229,6 @@
     method public void commit();
     method @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public void commitTransactionOnDraw(android.view.AttachedSurfaceControl attachedSurfaceControl);
     method public androidx.graphics.surface.SurfaceControlCompat.Transaction reparent(androidx.graphics.surface.SurfaceControlCompat surfaceControl, androidx.graphics.surface.SurfaceControlCompat? newParent);
-    method public androidx.graphics.surface.SurfaceControlCompat.Transaction reparent(androidx.graphics.surface.SurfaceControlCompat surfaceControl, android.view.SurfaceView surfaceView);
     method @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public androidx.graphics.surface.SurfaceControlCompat.Transaction reparent(androidx.graphics.surface.SurfaceControlCompat surfaceControl, android.view.AttachedSurfaceControl attachedSurfaceControl);
     method public androidx.graphics.surface.SurfaceControlCompat.Transaction setAlpha(androidx.graphics.surface.SurfaceControlCompat surfaceControl, float alpha);
     method public androidx.graphics.surface.SurfaceControlCompat.Transaction setBuffer(androidx.graphics.surface.SurfaceControlCompat surfaceControl, android.hardware.HardwareBuffer buffer, optional androidx.graphics.lowlatency.SyncFenceCompat? fence, optional kotlin.jvm.functions.Function0<kotlin.Unit>? releaseCallback);
@@ -254,7 +253,8 @@
     method public boolean await(long timeoutNanos);
     method public boolean awaitForever();
     method public void close();
-    method public long getSignalTime();
+    method protected void finalize();
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public long getSignalTime();
     method public boolean isValid();
     field public static final androidx.hardware.SyncFence.Companion Companion;
     field public static final long SIGNAL_TIME_INVALID = -1L; // 0xffffffffffffffffL
diff --git a/graphics/graphics-core/api/restricted_current.txt b/graphics/graphics-core/api/restricted_current.txt
index 3345488..d2ba87f 100644
--- a/graphics/graphics-core/api/restricted_current.txt
+++ b/graphics/graphics-core/api/restricted_current.txt
@@ -230,7 +230,6 @@
     method public void commit();
     method @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public void commitTransactionOnDraw(android.view.AttachedSurfaceControl attachedSurfaceControl);
     method public androidx.graphics.surface.SurfaceControlCompat.Transaction reparent(androidx.graphics.surface.SurfaceControlCompat surfaceControl, androidx.graphics.surface.SurfaceControlCompat? newParent);
-    method public androidx.graphics.surface.SurfaceControlCompat.Transaction reparent(androidx.graphics.surface.SurfaceControlCompat surfaceControl, android.view.SurfaceView surfaceView);
     method @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public androidx.graphics.surface.SurfaceControlCompat.Transaction reparent(androidx.graphics.surface.SurfaceControlCompat surfaceControl, android.view.AttachedSurfaceControl attachedSurfaceControl);
     method public androidx.graphics.surface.SurfaceControlCompat.Transaction setAlpha(androidx.graphics.surface.SurfaceControlCompat surfaceControl, float alpha);
     method public androidx.graphics.surface.SurfaceControlCompat.Transaction setBuffer(androidx.graphics.surface.SurfaceControlCompat surfaceControl, android.hardware.HardwareBuffer buffer, optional androidx.graphics.lowlatency.SyncFenceCompat? fence, optional kotlin.jvm.functions.Function0<kotlin.Unit>? releaseCallback);
@@ -255,7 +254,8 @@
     method public boolean await(long timeoutNanos);
     method public boolean awaitForever();
     method public void close();
-    method public long getSignalTime();
+    method protected void finalize();
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public long getSignalTime();
     method public boolean isValid();
     field public static final androidx.hardware.SyncFence.Companion Companion;
     field public static final long SIGNAL_TIME_INVALID = -1L; // 0xffffffffffffffffL
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/GLFrontBufferedRendererTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/GLFrontBufferedRendererTest.kt
index ff42184..246dced 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/GLFrontBufferedRendererTest.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/GLFrontBufferedRendererTest.kt
@@ -277,14 +277,76 @@
         )
     }
 
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
+    fun testRenderFrontBufferSeveralTimes() {
+        if (!deviceSupportsNativeAndroidFence()) {
+            // If the Android device does not support the corresponding extensions to create
+            // a file descriptor from an EGLSync object then skip the test
+            Log.w(TAG, "Skipping testDoubleBufferedLayerRender, no native android fence support")
+            return
+        }
+
+        val callbacks = object : GLFrontBufferedRenderer.Callback<Any> {
+
+            var red = 1f
+            var blue = 0f
+
+            override fun onDrawFrontBufferedLayer(eglManager: EGLManager, param: Any) {
+                GLES20.glViewport(
+                    0,
+                    0,
+                    FrontBufferedRendererTestActivity.WIDTH,
+                    FrontBufferedRendererTestActivity.HEIGHT
+                )
+                GLES20.glClearColor(red, 0.0f, blue, 1.0f)
+                GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
+                val tmp = red
+                red = blue
+                blue = tmp
+            }
+
+            override fun onDrawDoubleBufferedLayer(
+                eglManager: EGLManager,
+                params: Collection<Any>
+            ) {
+                GLES20.glViewport(
+                    0,
+                    0,
+                    FrontBufferedRendererTestActivity.WIDTH,
+                    FrontBufferedRendererTestActivity.HEIGHT
+                )
+                GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f)
+                GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
+            }
+        }
+        var renderer: GLFrontBufferedRenderer<Any>? = null
+        try {
+            val scenario = ActivityScenario.launch(FrontBufferedRendererTestActivity::class.java)
+                .moveToState(Lifecycle.State.CREATED)
+                .onActivity {
+                    renderer = GLFrontBufferedRenderer(it.getSurfaceView(), callbacks)
+                }
+
+            scenario.moveToState(Lifecycle.State.RESUMED).onActivity {
+                val param = Any()
+                repeat(4000) {
+                    renderer?.renderFrontBufferedLayer(param)
+                }
+            }
+        } finally {
+            renderer.blockingRelease(10000)
+        }
+    }
+
     @RequiresApi(Build.VERSION_CODES.Q)
-    private fun GLFrontBufferedRenderer<*>?.blockingRelease() {
+    private fun GLFrontBufferedRenderer<*>?.blockingRelease(timeoutMillis: Long = 3000) {
         if (this != null) {
             val destroyLatch = CountDownLatch(1)
             release(false) {
                 destroyLatch.countDown()
             }
-            assertTrue(destroyLatch.await(3000, TimeUnit.MILLISECONDS))
+            assertTrue(destroyLatch.await(timeoutMillis, TimeUnit.MILLISECONDS))
         } else {
             fail("GLFrontBufferedRenderer is not initialized")
         }
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/egl/EGLManagerTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/egl/EGLManagerTest.kt
index 1c50354..b7c29c1 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/egl/EGLManagerTest.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/egl/EGLManagerTest.kt
@@ -52,7 +52,6 @@
 import org.junit.Assert.assertNotNull
 import org.junit.Assert.assertTrue
 import org.junit.Assert.fail
-import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -634,8 +633,7 @@
             }
         }
     }
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.KITKAT)
-    @Ignore("b/242180917")
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testEglDupNativeFenceFDANDROIDawaitForever() {
         testEGLManager {
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/hardware/SyncFenceBindings.kt b/graphics/graphics-core/src/androidTest/java/androidx/hardware/SyncFenceBindings.kt
new file mode 100644
index 0000000..a97829e
--- /dev/null
+++ b/graphics/graphics-core/src/androidTest/java/androidx/hardware/SyncFenceBindings.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.hardware
+
+/**
+ * Helper class of jni bindings to verify dlopen/dlsym behavior to resolve sync_info_file and
+ * sync_info_file_free methods
+ */
+internal class SyncFenceBindings private constructor() {
+    companion object {
+
+        external fun nResolveSyncFileInfo(): Boolean
+
+        external fun nResolveSyncFileInfoFree(): Boolean
+
+        init {
+            System.loadLibrary("sync-fence")
+        }
+    }
+}
\ No newline at end of file
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/hardware/SyncFenceTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/hardware/SyncFenceTest.kt
new file mode 100644
index 0000000..05b449d
--- /dev/null
+++ b/graphics/graphics-core/src/androidTest/java/androidx/hardware/SyncFenceTest.kt
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.hardware
+
+import android.os.Build
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.SmallTest
+import org.junit.Assert
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class SyncFenceTest {
+
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun testSignalTimeInvalid() {
+        // Something other than -1 even though this is not technically a valid file descriptor
+        // the internal APIs should not crash and instead return SIGNAL_TIME_INVALID
+        // Because not all devices support the ability to create a native file descriptor from
+        // an EGLSync, create a validity check to ensure we can get more presubmit test coverage
+        Assert.assertEquals(
+            SyncFence.SIGNAL_TIME_INVALID,
+            SyncFence(7).getSignalTime()
+        )
+        Assert.assertEquals(
+            SyncFence.SIGNAL_TIME_INVALID,
+            SyncFence(-1).getSignalTime()
+        )
+    }
+
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.KITKAT)
+    @Test
+    fun testIsValid() {
+        assertFalse(SyncFence(-1).isValid())
+        assertTrue(SyncFence(42).isValid())
+    }
+
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun testResolveSyncFileInfo() {
+        assertTrue(SyncFenceBindings.nResolveSyncFileInfo())
+    }
+
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun testResolveSyncFileInfoFree() {
+        assertTrue(SyncFenceBindings.nResolveSyncFileInfoFree())
+    }
+}
\ No newline at end of file
diff --git a/graphics/graphics-core/src/main/cpp/sync_fence.cpp b/graphics/graphics-core/src/main/cpp/sync_fence.cpp
index aae752c..3588b5a 100644
--- a/graphics/graphics-core/src/main/cpp/sync_fence.cpp
+++ b/graphics/graphics-core/src/main/cpp/sync_fence.cpp
@@ -22,6 +22,8 @@
 #include <sys/syscall.h>
 #include <android/file_descriptor_jni.h>
 #include <errno.h>
+#include <dlfcn.h>
+#include <mutex>
 
 static constexpr int64_t SIGNAL_TIME_INVALID = -1;
 static constexpr int64_t SIGNAL_TIME_PENDING = INT64_MAX;
@@ -29,6 +31,8 @@
 #define SYNC_FENCE "SYNC_FENCE"
 #define ALOGE(msg, ...) \
     __android_log_print(ANDROID_LOG_ERROR, SYNC_FENCE, (msg), __VA_ARGS__)
+#define ALOGW(msg, ...) \
+    __android_log_print(ANDROID_LOG_ERROR, SYNC_FENCE, (msg))
 
 extern "C"
 JNIEXPORT void JNICALL
@@ -36,6 +40,79 @@
     close(fd);
 }
 
+/**
+ * Flag to ensure that we only attempt to load libsync.so once
+ */
+static std::once_flag load_sync_lib_flag;
+
+/**
+ * Function pointer to the dynamically linked sync_file_info method
+ */
+static decltype(&sync_file_info) sync_file_info_ptr = nullptr;
+
+/**
+ * Function pointer to the dynamically linked sync_file_info_free method
+ */
+static decltype(&sync_file_info_free) sync_file_info_free_ptr = nullptr;
+
+/**
+ * Helper method to attempt to load libsync.so. It only attempts to load the library once and the
+ * result is cached. On successful load, this method resolves both sync_file_info and
+ * sync_file_info_free methods as well.
+ */
+static void load_libsync() {
+    std::call_once(load_sync_lib_flag, []() {
+        void* handle = dlopen("libsync.so", RTLD_NOW);
+        if (handle) {
+            sync_file_info_ptr =
+                    reinterpret_cast<decltype(&sync_file_info)>(
+                            dlsym(handle, "sync_file_info"));
+            if (!sync_file_info_ptr) {
+                ALOGW("Unable to resolve sync_file_info from dlsym");
+            }
+            sync_file_info_free_ptr =
+                    reinterpret_cast<decltype(&sync_file_info_free)>(
+                            dlsym(handle, "sync_file_info_free"));
+            if (!sync_file_info_free_ptr) {
+                ALOGW("Unable to resolve sync_file_info_free from dlsym");
+            }
+        } else  {
+            ALOGW("Unable to load libsync.so");
+            sync_file_info_ptr = nullptr;
+            sync_file_info_free_ptr = nullptr;
+        }
+    });
+}
+
+/**
+ * Obtains a sync_file_info object from the provided file descriptor.
+ * Internally this attempts to dynamcially resolve the sync_file_info method from libsync.so
+ * @param fd File descriptor to resolve the corresponding sync_file_info from
+ * @return sync_file_info or nullptr if the method cannot be resolved or there is no sync_file_info
+ * associated with the provided file descriptor
+ */
+static struct sync_file_info* get_sync_file_info(int fd) {
+    load_libsync();
+    if (sync_file_info_ptr) {
+        return sync_file_info_ptr(fd);
+    } else {
+        return nullptr;
+    }
+}
+
+/**
+ * Helper method that resolves and invokes sync_file_info_free from libsync.so.
+ * This attempts to dynamically resolve the method once and caches the function pointer.
+ * If the release method cannot be invoked this method call is a no-op.
+ * @param info sync_file_info instance to release
+ */
+static void release_sync_file_info(struct sync_file_info* info) {
+    load_libsync();
+    if (sync_file_info_free_ptr) {
+        sync_file_info_free_ptr(info);
+    }
+}
+
 extern "C"
 JNIEXPORT jlong JNICALL
 Java_androidx_hardware_SyncFence_nGetSignalTime(JNIEnv *env, jobject thiz,
@@ -45,7 +122,7 @@
         return SIGNAL_TIME_INVALID;
     }
 
-    struct sync_file_info* finfo = sync_file_info(fd);
+    struct sync_file_info* finfo = get_sync_file_info(fd);
     if (finfo == nullptr) {
         ALOGE("sync_file_info returned NULL for fd %d", fd);
         return SIGNAL_TIME_INVALID;
@@ -57,7 +134,7 @@
             ALOGE("nGetSignalTime: sync_file_info contains an error: <%d> for fd: <%d>", status,
                   fd);
         }
-        sync_file_info_free(finfo);
+        release_sync_file_info(finfo);
         return status < 0 ? SIGNAL_TIME_INVALID : SIGNAL_TIME_PENDING;
     }
 
@@ -69,7 +146,7 @@
         }
     }
 
-    sync_file_info_free(finfo);
+    release_sync_file_info(finfo);
     return static_cast<int64_t>(timestamp);
 }
 
@@ -116,5 +193,21 @@
     // API appears to consume an int. Also the documentation in Fence.cpp seems to indicate
     // that the timeout is consumed as an int in milliseconds
     int err = sync_wait(fd, timeout_millis);
-    return static_cast<jboolean>(err == JNI_OK);
+    return static_cast<jboolean>(err == 0);
+}
+
+extern "C"
+JNIEXPORT jboolean JNICALL
+Java_androidx_hardware_SyncFenceBindings_00024Companion_nResolveSyncFileInfo(JNIEnv *env,
+                                                                             jobject thiz) {
+    load_libsync();
+    return sync_file_info_ptr != nullptr;
+}
+
+extern "C"
+JNIEXPORT jboolean JNICALL
+Java_androidx_hardware_SyncFenceBindings_00024Companion_nResolveSyncFileInfoFree(JNIEnv *env,
+                                                                                 jobject thiz) {
+    load_libsync();
+    return sync_file_info_free_ptr != nullptr;
 }
\ No newline at end of file
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SurfaceViewRenderLayer.kt b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SurfaceViewRenderLayer.kt
index 3d71b07..460209b 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SurfaceViewRenderLayer.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SurfaceViewRenderLayer.kt
@@ -46,7 +46,7 @@
         child: SurfaceControlCompat,
         transaction: SurfaceControlCompat.Transaction
     ) {
-        transaction.reparent(child, surfaceView)
+        transaction.reparent(child, mParentSurfaceControl)
     }
 
     override fun setParent(builder: SurfaceControlCompat.Builder) {
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlCompat.kt b/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlCompat.kt
index dbcb0ac..21da3e2 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlCompat.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlCompat.kt
@@ -200,20 +200,6 @@
         }
 
         /**
-         * Re-parents a given [SurfaceControlCompat] to be a child of the [Surface] associated with
-         * the provided [SurfaceView]. Children inherit transform
-         * (position, scaling) crop, visibility, and Z-ordering from their parents, as if the
-         * children were pixels within the parent [Surface].
-         * @param surfaceControl Target [SurfaceControlCompat] instance to reparent
-         * @param surfaceView [SurfaceView] instance that acts as the new parent of the provided
-         * [SurfaceControlCompat] instance.
-         */
-        fun reparent(surfaceControl: SurfaceControlCompat, surfaceView: SurfaceView): Transaction {
-            mImpl.reparent(surfaceControl.scImpl, surfaceView)
-            return this
-        }
-
-        /**
          * Re-parents a given [SurfaceControlCompat] to be a child of the [AttachedSurfaceControl].
          * Children inherit transform (position, scaling) crop, visibility, and Z-ordering from
          * their parents, as if the children were pixels within the parent [Surface].
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlImpl.kt b/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlImpl.kt
index e8258b6..b3f2bde 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlImpl.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlImpl.kt
@@ -126,17 +126,6 @@
         ): Transaction
 
         /**
-         * Re-parents a given [SurfaceControlImpl] to be a child of the [Surface] associated with
-         * the provided [SurfaceView]. Children inherit transform
-         * (position, scaling) crop, visibility, and Z-ordering from their parents, as if the
-         * children were pixels within the parent [Surface].
-         * @param surfaceControl Target [SurfaceControlImpl] instance to reparent
-         * @param surfaceView [SurfaceView] instance that acts as the new parent of the provided
-         * [SurfaceControlImpl] instance.
-         */
-        fun reparent(surfaceControl: SurfaceControlImpl, surfaceView: SurfaceView): Transaction
-
-        /**
          * Re-parents a given [SurfaceControlImpl] to be a child of the [AttachedSurfaceControl].
          * Children inherit transform (position, scaling) crop, visibility, and Z-ordering from
          * their parents, as if the children were pixels within the parent [Surface].
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlV29.kt b/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlV29.kt
index 1257c221..8787759 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlV29.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlV29.kt
@@ -128,23 +128,6 @@
         }
 
         /**
-         * See [SurfaceControlWrapper.Transaction.reparent]
-         */
-        override fun reparent(
-            surfaceControl: SurfaceControlImpl,
-            surfaceView: SurfaceView
-        ): SurfaceControlImpl.Transaction {
-            transaction.reparent(
-                surfaceControl.asWrapperSurfaceControl(),
-                SurfaceControlWrapper.Builder()
-                    .setParent(surfaceView.holder.surface)
-                    .setDebugName(surfaceView.toString())
-                    .build()
-            )
-            return this
-        }
-
-        /**
          * See [SurfaceControlWrapper.Transaction.setBuffer]
          */
         override fun setBuffer(
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlV33.kt b/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlV33.kt
index 34ed9c7..e52a2e0 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlV33.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlV33.kt
@@ -155,20 +155,6 @@
          */
         override fun reparent(
             surfaceControl: SurfaceControlImpl,
-            surfaceView: SurfaceView
-        ): SurfaceControlImpl.Transaction {
-            mTransaction.reparent(
-                surfaceControl.asFrameworkSurfaceControl(),
-                surfaceView.surfaceControl
-            )
-            return this
-        }
-
-        /**
-         * See [SurfaceControlImpl.Transaction.reparent]
-         */
-        override fun reparent(
-            surfaceControl: SurfaceControlImpl,
             attachedSurfaceControl: AttachedSurfaceControl
         ): SurfaceControlImpl.Transaction {
             val reparentTransaction = attachedSurfaceControl
diff --git a/graphics/graphics-core/src/main/java/androidx/hardware/SyncFence.kt b/graphics/graphics-core/src/main/java/androidx/hardware/SyncFence.kt
index 4ba6353..3977a83 100644
--- a/graphics/graphics-core/src/main/java/androidx/hardware/SyncFence.kt
+++ b/graphics/graphics-core/src/main/java/androidx/hardware/SyncFence.kt
@@ -59,6 +59,8 @@
      * Returns the time that the fence signaled in the [CLOCK_MONOTONIC] time domain.
      * This returns [SyncFence.SIGNAL_TIME_INVALID] if the SyncFence is invalid.
      */
+    // Relies on NDK APIs sync_file_info/sync_file_info_free which were introduced in API level 26
+    @RequiresApi(Build.VERSION_CODES.O)
     fun getSignalTime(): Long =
         if (isValid()) {
             nGetSignalTime(fd)
@@ -107,6 +109,10 @@
         fd = -1
     }
 
+    protected fun finalize() {
+        close()
+    }
+
     // SyncFence in the framework implements timeoutNanos as a long but
     // it is casted down to an int within native code and eventually calls into
     // the poll API which consumes a timeout in nanoseconds as an int.
diff --git a/health/connect/connect-client/build.gradle b/health/connect/connect-client/build.gradle
index 6352024..1055380 100644
--- a/health/connect/connect-client/build.gradle
+++ b/health/connect/connect-client/build.gradle
@@ -81,10 +81,3 @@
     inceptionYear = "2022"
     description = "read or write user's health and fitness records."
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/inspection/inspection-gradle-plugin/build.gradle b/inspection/inspection-gradle-plugin/build.gradle
index 4a0da05..dc1c3a7 100644
--- a/inspection/inspection-gradle-plugin/build.gradle
+++ b/inspection/inspection-gradle-plugin/build.gradle
@@ -52,12 +52,6 @@
     }
 }
 
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += [ "-opt-in=kotlin.Experimental" ]
-    }
-}
-
 androidx {
     name = "Android Inspection Gradle Plugin"
     type = LibraryType.GRADLE_PLUGIN
diff --git a/inspection/inspection-testing/build.gradle b/inspection/inspection-testing/build.gradle
index e2a69cb..6261051 100644
--- a/inspection/inspection-testing/build.gradle
+++ b/inspection/inspection-testing/build.gradle
@@ -45,13 +45,6 @@
     description = "Experimental AndroidX Inspection Project"
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 android {
     defaultConfig {
         // studio pipeline works only starting with Android O
diff --git a/leanback/leanback-paging/build.gradle b/leanback/leanback-paging/build.gradle
index 6c33712..878ec32 100644
--- a/leanback/leanback-paging/build.gradle
+++ b/leanback/leanback-paging/build.gradle
@@ -51,13 +51,6 @@
     namespace "androidx.leanback.paging"
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 androidx {
     name = "AndroidX Leanback Paging"
     publish = Publish.SNAPSHOT_AND_RELEASE
diff --git a/libraryversions.toml b/libraryversions.toml
index fc6bd2c..780011e 100644
--- a/libraryversions.toml
+++ b/libraryversions.toml
@@ -16,7 +16,7 @@
 CAMERA = "1.2.0-beta02"
 CAMERA_PIPE = "1.0.0-alpha01"
 CARDVIEW = "1.1.0-alpha01"
-CAR_APP = "1.3.0-alpha02"
+CAR_APP = "1.3.0-beta01"
 COLLECTION = "1.3.0-alpha03"
 COMPOSE = "1.3.0-beta02"
 COMPOSE_COMPILER = "1.3.1"
@@ -114,7 +114,7 @@
 TEST_UIAUTOMATOR = "2.3.0-alpha01"
 TEXT = "1.0.0-alpha01"
 TRACING = "1.2.0-alpha01"
-TRACING_PERFETTO = "1.0.0-alpha02"
+TRACING_PERFETTO = "1.0.0-alpha03"
 TRANSITION = "1.5.0-alpha01"
 TV = "1.0.0-alpha01"
 TVPROVIDER = "1.1.0-alpha02"
diff --git a/lifecycle/integration-tests/kotlintestapp/build.gradle b/lifecycle/integration-tests/kotlintestapp/build.gradle
index 4763c94..ab9ca908 100644
--- a/lifecycle/integration-tests/kotlintestapp/build.gradle
+++ b/lifecycle/integration-tests/kotlintestapp/build.gradle
@@ -51,8 +51,6 @@
 
 android {
     kotlinOptions {
-        // Allow usage of Kotlin"s @OptIn.
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
         jvmTarget = "1.8" // necessary to use espresso kotlin extensions
     }
     sourceSets {
diff --git a/lifecycle/lifecycle-livedata-core-ktx/build.gradle b/lifecycle/lifecycle-livedata-core-ktx/build.gradle
index 5571b89..dc35984 100644
--- a/lifecycle/lifecycle-livedata-core-ktx/build.gradle
+++ b/lifecycle/lifecycle-livedata-core-ktx/build.gradle
@@ -57,10 +57,3 @@
 android {
     namespace "androidx.lifecycle.livedata.core.ktx"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/lifecycle/lifecycle-livedata-ktx/build.gradle b/lifecycle/lifecycle-livedata-ktx/build.gradle
index 7b55d68..b55620a 100644
--- a/lifecycle/lifecycle-livedata-ktx/build.gradle
+++ b/lifecycle/lifecycle-livedata-ktx/build.gradle
@@ -24,13 +24,6 @@
     id("org.jetbrains.kotlin.android")
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 dependencies {
     api(project(":lifecycle:lifecycle-livedata"))
     api(project(":lifecycle:lifecycle-livedata-core-ktx"))
diff --git a/lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/FlowLiveData.kt b/lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/FlowLiveData.kt
index 7c2d8ed..fd50175 100644
--- a/lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/FlowLiveData.kt
+++ b/lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/FlowLiveData.kt
@@ -27,10 +27,11 @@
 import kotlinx.coroutines.DelicateCoroutinesApi
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.GlobalScope
-import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.channels.awaitClose
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.flow
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.conflate
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 
@@ -102,24 +103,20 @@
  * LiveData due to a slow collector, so collector always gets the most recent value emitted.
  */
 @OptIn(DelicateCoroutinesApi::class)
-public fun <T> LiveData<T>.asFlow(): Flow<T> = flow {
-    val channel = Channel<T>(Channel.CONFLATED)
+public fun <T> LiveData<T>.asFlow(): Flow<T> = callbackFlow {
     val observer = Observer<T> {
-        channel.trySend(it)
+        trySend(it)
     }
     withContext(Dispatchers.Main.immediate) {
         observeForever(observer)
     }
-    try {
-        for (value in channel) {
-            emit(value)
-        }
-    } finally {
+
+    awaitClose {
         GlobalScope.launch(Dispatchers.Main.immediate) {
             removeObserver(observer)
         }
     }
-}
+}.conflate()
 
 /**
  * Creates a LiveData that has values collected from the origin [Flow].
diff --git a/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/LiveDataAsFlowTest.kt b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/LiveDataAsFlowTest.kt
index 97cdd15..ab075f6 100644
--- a/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/LiveDataAsFlowTest.kt
+++ b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/LiveDataAsFlowTest.kt
@@ -86,11 +86,14 @@
     fun reusingFlow() {
         val ld = MutableLiveData<Int>()
         val flow = ld.asFlow()
-        mainScope.launch { ld.value = 1 }
         val firstCollection = testScope.launch {
             assertThat(flow.first()).isEqualTo(1)
         }
         scopes.triggerAllActions()
+        assertThat(ld.hasActiveObservers()).isTrue()
+
+        mainScope.launch { ld.value = 1 }
+        scopes.triggerAllActions()
         // check that we're done with previous collection
         assertThat(ld.hasActiveObservers()).isFalse()
         assertThat(firstCollection.isCompleted).isTrue()
@@ -119,7 +122,7 @@
             assertThat(flowB.take(2).toList()).isEqualTo(listOf(1, 2))
         }
         scopes.triggerAllActions()
-        assertThat(ld.hasActiveObservers())
+        assertThat(ld.hasActiveObservers()).isTrue()
 
         mainScope.launch { ld.value = 1 }
         scopes.triggerAllActions()
diff --git a/lifecycle/lifecycle-livedata/api/current.txt b/lifecycle/lifecycle-livedata/api/current.txt
index e3cda57..2d5345c 100644
--- a/lifecycle/lifecycle-livedata/api/current.txt
+++ b/lifecycle/lifecycle-livedata/api/current.txt
@@ -3,6 +3,7 @@
 
   public class MediatorLiveData<T> extends androidx.lifecycle.MutableLiveData<T> {
     ctor public MediatorLiveData();
+    ctor public MediatorLiveData(T!);
     method @MainThread public <S> void addSource(androidx.lifecycle.LiveData<S!>, androidx.lifecycle.Observer<? super S>);
     method @MainThread public <S> void removeSource(androidx.lifecycle.LiveData<S!>);
   }
diff --git a/lifecycle/lifecycle-livedata/api/public_plus_experimental_current.txt b/lifecycle/lifecycle-livedata/api/public_plus_experimental_current.txt
index e3cda57..2d5345c 100644
--- a/lifecycle/lifecycle-livedata/api/public_plus_experimental_current.txt
+++ b/lifecycle/lifecycle-livedata/api/public_plus_experimental_current.txt
@@ -3,6 +3,7 @@
 
   public class MediatorLiveData<T> extends androidx.lifecycle.MutableLiveData<T> {
     ctor public MediatorLiveData();
+    ctor public MediatorLiveData(T!);
     method @MainThread public <S> void addSource(androidx.lifecycle.LiveData<S!>, androidx.lifecycle.Observer<? super S>);
     method @MainThread public <S> void removeSource(androidx.lifecycle.LiveData<S!>);
   }
diff --git a/lifecycle/lifecycle-livedata/api/restricted_current.txt b/lifecycle/lifecycle-livedata/api/restricted_current.txt
index ea6cc5e..382ae45 100644
--- a/lifecycle/lifecycle-livedata/api/restricted_current.txt
+++ b/lifecycle/lifecycle-livedata/api/restricted_current.txt
@@ -11,6 +11,7 @@
 
   public class MediatorLiveData<T> extends androidx.lifecycle.MutableLiveData<T> {
     ctor public MediatorLiveData();
+    ctor public MediatorLiveData(T!);
     method @MainThread public <S> void addSource(androidx.lifecycle.LiveData<S!>, androidx.lifecycle.Observer<? super S>);
     method @MainThread public <S> void removeSource(androidx.lifecycle.LiveData<S!>);
   }
diff --git a/lifecycle/lifecycle-livedata/build.gradle b/lifecycle/lifecycle-livedata/build.gradle
index b6c8a20..1b8932d 100644
--- a/lifecycle/lifecycle-livedata/build.gradle
+++ b/lifecycle/lifecycle-livedata/build.gradle
@@ -31,6 +31,7 @@
     testImplementation(libs.kotlinCoroutinesTest)
     testImplementation(libs.junit)
     testImplementation(libs.mockitoCore)
+    testImplementation(libs.truth)
 
     constraints {
         // this syntax is a temporary workout to allow project dependency on cross-project-set
diff --git a/lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/MediatorLiveData.java b/lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/MediatorLiveData.java
index 2b93c5e..13e58d8 100644
--- a/lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/MediatorLiveData.java
+++ b/lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/MediatorLiveData.java
@@ -70,6 +70,22 @@
     private SafeIterableMap<LiveData<?>, Source<?>> mSources = new SafeIterableMap<>();
 
     /**
+     * Creates a MediatorLiveData with no value assigned to it.
+     */
+    public MediatorLiveData() {
+        super();
+    }
+
+    /**
+     * Creates a MediatorLiveData initialized with the given {@code value}.
+     *
+     * @param value initial value
+     */
+    public MediatorLiveData(T value) {
+        super(value);
+    }
+
+    /**
      * Starts to listen the given {@code source} LiveData, {@code onChanged} observer will be called
      * when {@code source} value was changed.
      * <p>
diff --git a/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/MediatorLiveDataTest.java b/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/MediatorLiveDataTest.java
index eacd430..ce81059 100644
--- a/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/MediatorLiveDataTest.java
+++ b/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/MediatorLiveDataTest.java
@@ -16,6 +16,8 @@
 
 package androidx.lifecycle;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.mockito.ArgumentMatchers.any;
@@ -80,6 +82,12 @@
     }
 
     @Test
+    public void testHasInitialValue() {
+        MediatorLiveData<String> mediator = new MediatorLiveData<>("value");
+        assertThat(mediator.getValue()).isEqualTo("value");
+    }
+
+    @Test
     public void testSingleDelivery() {
         Observer observer = mock(Observer.class);
         mMediator.addSource(mSource, observer);
diff --git a/lifecycle/lifecycle-reactivestreams-ktx/build.gradle b/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
index fe0f886..826258a 100644
--- a/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
+++ b/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
@@ -51,10 +51,3 @@
 android {
     namespace "androidx.lifecycle.reactivestreams.ktx"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-  kotlinOptions {
-    freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-  }
-}
diff --git a/lifecycle/lifecycle-runtime-ktx/build.gradle b/lifecycle/lifecycle-runtime-ktx/build.gradle
index a4effba..f8d0d7b 100644
--- a/lifecycle/lifecycle-runtime-ktx/build.gradle
+++ b/lifecycle/lifecycle-runtime-ktx/build.gradle
@@ -58,10 +58,3 @@
 android {
     namespace "androidx.lifecycle.ktx"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/lifecycle/lifecycle-runtime-testing/build.gradle b/lifecycle/lifecycle-runtime-testing/build.gradle
index ab852c1..73c5a96 100644
--- a/lifecycle/lifecycle-runtime-testing/build.gradle
+++ b/lifecycle/lifecycle-runtime-testing/build.gradle
@@ -53,10 +53,3 @@
 android {
     namespace "androidx.lifecycle.testing"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/lint-checks/integration-tests/build.gradle b/lint-checks/integration-tests/build.gradle
index 3d01ce6..a4a6f28 100644
--- a/lint-checks/integration-tests/build.gradle
+++ b/lint-checks/integration-tests/build.gradle
@@ -28,16 +28,6 @@
     implementation(libs.kotlinStdlib)
 }
 
-// Allow usage of Kotlin's @Experimental and @RequiresOptIn annotations.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += [
-                "-opt-in=kotlin.Experimental",
-                "-opt-in=kotlin.RequiresOptIn",
-        ]
-    }
-}
-
 androidx {
     name = "Lint Checks Integration Tests"
     description = "This is a sample library for confirming that lint checks execute correctly, b/177437928"
diff --git a/navigation/navigation-common/build.gradle b/navigation/navigation-common/build.gradle
index 8bc8969..8bb9c03 100644
--- a/navigation/navigation-common/build.gradle
+++ b/navigation/navigation-common/build.gradle
@@ -80,9 +80,3 @@
     inceptionYear = "2017"
     description = "Android Navigation-Common"
 }
-
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
-    }
-}
diff --git a/navigation/navigation-dynamic-features-runtime/build.gradle b/navigation/navigation-dynamic-features-runtime/build.gradle
index 8365a88..20863e1 100644
--- a/navigation/navigation-dynamic-features-runtime/build.gradle
+++ b/navigation/navigation-dynamic-features-runtime/build.gradle
@@ -65,10 +65,4 @@
     mavenGroup = LibraryGroups.NAVIGATION
     inceptionYear = "2019"
     description = "Android Dynamic Feature Navigation Runtime"
-}
-
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
-    }
 }
\ No newline at end of file
diff --git a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigator.kt b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigator.kt
index 83ff1e4..14dfb04 100644
--- a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigator.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigator.kt
@@ -57,6 +57,7 @@
             val moduleName = destination.moduleName
             if (moduleName != null && installManager.needsInstall(moduleName)) {
                 installManager.performInstall(entry, extras, moduleName)
+                return
             }
         }
         super.navigate(
diff --git a/navigation/navigation-runtime/build.gradle b/navigation/navigation-runtime/build.gradle
index 94c45c4..5e3f870 100644
--- a/navigation/navigation-runtime/build.gradle
+++ b/navigation/navigation-runtime/build.gradle
@@ -65,10 +65,3 @@
     inceptionYear = "2017"
     description = "Android Navigation-Runtime"
 }
-
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        // Allow usage of Kotlin's @OptIn.
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryLifecycleTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryLifecycleTest.kt
index 08b1df5..5481dad 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryLifecycleTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryLifecycleTest.kt
@@ -716,6 +716,65 @@
             .isEqualTo(Lifecycle.State.RESUMED)
     }
 
+    /**
+     * Test that popping the last destination in a graph and navigating to a double nested graph
+     * with the same previous parent graph, does not DESTROY the parent graph.
+     */
+    @UiThreadTest
+    @Test
+    fun testLifecycleDoubleNestedGraph() {
+        val navController = createNavController()
+        val navGraph = navController.navigatorProvider.navigation(
+            route = "root",
+            startDestination = "first_nested"
+        ) {
+            navigation(route = "first_nested", startDestination = "first_nested_test") {
+                test("first_nested_test")
+                navigation(route = "second_nested", startDestination = "third_nested") {
+                    navigation(route = "third_nested", startDestination = "third_nested_test") {
+                        test("third_nested_test")
+                    }
+                }
+            }
+        }
+        navController.graph = navGraph
+
+        val graphBackStackEntry = navController.getBackStackEntry(navGraph.route!!)
+        assertWithMessage("The parent graph should be resumed when its child is resumed")
+            .that(graphBackStackEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.RESUMED)
+        val nestedGraphBackStackEntry = navController.getBackStackEntry("first_nested")
+        assertWithMessage("The nested graph should be resumed when its child is resumed")
+            .that(nestedGraphBackStackEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.RESUMED)
+        val nestedBackStackEntry = navController.getBackStackEntry("first_nested_test")
+        assertWithMessage("The nested start destination should be resumed")
+            .that(nestedBackStackEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.RESUMED)
+
+        navController.navigate(
+            "second_nested",
+            navOptions {
+                popUpTo("first_nested")
+            }
+        )
+
+        assertWithMessage("The parent graph should be resumed when its child is resumed")
+            .that(graphBackStackEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.RESUMED)
+        assertWithMessage("The nested start destination should be destroyed after being popped")
+            .that(nestedBackStackEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.DESTROYED)
+        assertWithMessage("The nested graph should be resumed when its new child is resumed")
+            .that(nestedGraphBackStackEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.RESUMED)
+
+        val secondBackStackEntry = navController.getBackStackEntry("third_nested_test")
+        assertWithMessage("The new destination should be resumed")
+            .that(secondBackStackEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.RESUMED)
+    }
+
     @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerRouteTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerRouteTest.kt
index 02e03d9..33fa054 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerRouteTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerRouteTest.kt
@@ -563,7 +563,7 @@
 
         Intents.init()
 
-        with(ActivityScenario.launch<TestActivity>(intent)) {
+        with(ActivityScenario.launchActivityForResult<TestActivity>(intent)) {
             moveToState(Lifecycle.State.CREATED)
             onActivity { activity ->
                 run {
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
index 41b30fc..69d3f7b 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
@@ -743,7 +743,7 @@
 
         Intents.init()
 
-        with(ActivityScenario.launch<TestActivity>(intent)) {
+        with(ActivityScenario.launchActivityForResult<TestActivity>(intent)) {
             withActivity {
                 val navController = navController
                 navController.setGraph(R.navigation.nav_simple)
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
index b53e7fd..56449ca 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
@@ -1885,7 +1885,7 @@
             if (hierarchy.isEmpty())
                 newDest
             else
-                hierarchy.last().destination
+                hierarchy.first().destination
         // Pop any orphaned navigation graphs that don't connect to the new destinations
         while (!backQueue.isEmpty() && backQueue.last().destination is NavGraph &&
             (backQueue.last().destination as NavGraph).findNode(
diff --git a/navigation/navigation-ui/build.gradle b/navigation/navigation-ui/build.gradle
index 82b53f9..f9836df 100644
--- a/navigation/navigation-ui/build.gradle
+++ b/navigation/navigation-ui/build.gradle
@@ -61,10 +61,3 @@
     inceptionYear = "2018"
     description = "Android Navigation-UI"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/paging/integration-tests/testapp/build.gradle b/paging/integration-tests/testapp/build.gradle
index 316b00d..77e84de 100644
--- a/paging/integration-tests/testapp/build.gradle
+++ b/paging/integration-tests/testapp/build.gradle
@@ -59,13 +59,6 @@
     namespace "androidx.paging.integration.testapp"
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 // Enable parameter names to support Room incremental when its a project() dep.
 // See b/198431380
 tasks.withType(JavaCompile) {
diff --git a/paging/paging-common/build.gradle b/paging/paging-common/build.gradle
index ec8b5f5..e674f69 100644
--- a/paging/paging-common/build.gradle
+++ b/paging/paging-common/build.gradle
@@ -59,10 +59,3 @@
     inceptionYear = "2017"
     description = "Android Paging-Common"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/paging/paging-compose/api/current.txt b/paging/paging-compose/api/current.txt
index cefe0e5..5f5b021 100644
--- a/paging/paging-compose/api/current.txt
+++ b/paging/paging-compose/api/current.txt
@@ -15,7 +15,7 @@
   }
 
   public final class LazyPagingItemsKt {
-    method @androidx.compose.runtime.Composable public static <T> androidx.paging.compose.LazyPagingItems<T> collectAsLazyPagingItems(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>);
+    method @androidx.compose.runtime.Composable public static <T> androidx.paging.compose.LazyPagingItems<T> collectAsLazyPagingItems(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>, optional kotlin.coroutines.CoroutineContext context);
     method public static <T> void items(androidx.compose.foundation.lazy.LazyListScope, androidx.paging.compose.LazyPagingItems<T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
     method public static <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, androidx.paging.compose.LazyPagingItems<T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
   }
diff --git a/paging/paging-compose/api/public_plus_experimental_current.txt b/paging/paging-compose/api/public_plus_experimental_current.txt
index cefe0e5..5f5b021 100644
--- a/paging/paging-compose/api/public_plus_experimental_current.txt
+++ b/paging/paging-compose/api/public_plus_experimental_current.txt
@@ -15,7 +15,7 @@
   }
 
   public final class LazyPagingItemsKt {
-    method @androidx.compose.runtime.Composable public static <T> androidx.paging.compose.LazyPagingItems<T> collectAsLazyPagingItems(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>);
+    method @androidx.compose.runtime.Composable public static <T> androidx.paging.compose.LazyPagingItems<T> collectAsLazyPagingItems(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>, optional kotlin.coroutines.CoroutineContext context);
     method public static <T> void items(androidx.compose.foundation.lazy.LazyListScope, androidx.paging.compose.LazyPagingItems<T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
     method public static <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, androidx.paging.compose.LazyPagingItems<T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
   }
diff --git a/paging/paging-compose/api/restricted_current.txt b/paging/paging-compose/api/restricted_current.txt
index cefe0e5..5f5b021 100644
--- a/paging/paging-compose/api/restricted_current.txt
+++ b/paging/paging-compose/api/restricted_current.txt
@@ -15,7 +15,7 @@
   }
 
   public final class LazyPagingItemsKt {
-    method @androidx.compose.runtime.Composable public static <T> androidx.paging.compose.LazyPagingItems<T> collectAsLazyPagingItems(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>);
+    method @androidx.compose.runtime.Composable public static <T> androidx.paging.compose.LazyPagingItems<T> collectAsLazyPagingItems(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>, optional kotlin.coroutines.CoroutineContext context);
     method public static <T> void items(androidx.compose.foundation.lazy.LazyListScope, androidx.paging.compose.LazyPagingItems<T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
     method public static <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, androidx.paging.compose.LazyPagingItems<T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
   }
diff --git a/paging/paging-compose/build.gradle b/paging/paging-compose/build.gradle
index d67110f..a1a8f3a 100644
--- a/paging/paging-compose/build.gradle
+++ b/paging/paging-compose/build.gradle
@@ -45,6 +45,7 @@
     androidTestImplementation(libs.testRunner)
     androidTestImplementation(libs.junit)
     androidTestImplementation(libs.truth)
+    androidTestImplementation(project(":internal-testutils-ktx"))
 
     samples(projectOrArtifact(":paging:paging-compose:paging-compose-samples"))
 }
diff --git a/paging/paging-compose/src/androidTest/java/androidx/paging/compose/LazyPagingItemsTest.kt b/paging/paging-compose/src/androidTest/java/androidx/paging/compose/LazyPagingItemsTest.kt
index b0e501a..a61fd87 100644
--- a/paging/paging-compose/src/androidTest/java/androidx/paging/compose/LazyPagingItemsTest.kt
+++ b/paging/paging-compose/src/androidTest/java/androidx/paging/compose/LazyPagingItemsTest.kt
@@ -25,6 +25,7 @@
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.testTag
+import androidx.testutils.TestDispatcher
 import androidx.compose.ui.test.assertIsDisplayed
 import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -595,4 +596,59 @@
         rule.onNodeWithText("Item=1. index=1. remembered index=0")
             .assertExists()
     }
+
+    @Test
+    fun collectOnDefaultThread() {
+        val items = mutableListOf(1, 2, 3)
+        val pager = createPager {
+            TestPagingSource(items = items, loadDelay = 0)
+        }
+
+        lateinit var lazyPagingItems: LazyPagingItems<Int>
+        rule.setContent {
+            lazyPagingItems = pager.flow.collectAsLazyPagingItems()
+        }
+
+        rule.waitUntil {
+            lazyPagingItems.itemCount == 3
+        }
+        assertThat(lazyPagingItems.itemSnapshotList).containsExactlyElementsIn(
+            items
+        )
+    }
+
+    @Test
+    fun collectOnWorkerThread() {
+        val items = mutableListOf(1, 2, 3)
+        val pager = createPager {
+            TestPagingSource(items = items, loadDelay = 0)
+        }
+
+        val context = TestDispatcher()
+
+        lateinit var lazyPagingItems: LazyPagingItems<Int>
+        rule.setContent {
+            assertThat(context.queue).isEmpty()
+            lazyPagingItems = pager.flow.collectAsLazyPagingItems(context)
+        }
+
+        rule.waitForIdle()
+        // LaunchedEffect queued on custom context
+        assertThat(context.queue).isNotEmpty()
+        assertThat(lazyPagingItems.itemSnapshotList).isEmpty()
+        context.executeAll()
+
+        rule.waitForIdle()
+        // collection queued on custom context
+        assertThat(context.queue).isNotEmpty()
+        assertThat(lazyPagingItems.itemSnapshotList).isEmpty()
+        context.executeAll()
+
+        rule.waitUntil {
+            lazyPagingItems.itemCount == items.size
+        }
+        assertThat(lazyPagingItems.itemSnapshotList).containsExactlyElementsIn(
+            items
+        )
+    }
 }
diff --git a/paging/paging-compose/src/main/java/androidx/paging/compose/LazyPagingItems.kt b/paging/paging-compose/src/main/java/androidx/paging/compose/LazyPagingItems.kt
index f9323e2..30d786d 100644
--- a/paging/paging-compose/src/main/java/androidx/paging/compose/LazyPagingItems.kt
+++ b/paging/paging-compose/src/main/java/androidx/paging/compose/LazyPagingItems.kt
@@ -39,10 +39,13 @@
 import androidx.paging.NullPaddedList
 import androidx.paging.PagingData
 import androidx.paging.PagingDataDiffer
+import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.EmptyCoroutineContext
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.flow.collectLatest
+import kotlinx.coroutines.withContext
 
 /**
  * The class responsible for accessing the data from a [Flow] of [PagingData].
@@ -243,16 +246,35 @@
  * from [LazyListScope] in order to display the data obtained from a [Flow] of [PagingData].
  *
  * @sample androidx.paging.compose.samples.PagingBackendSample
+ *
+ * @param context the [CoroutineContext] to perform the collection of [PagingData]
+ * and [CombinedLoadStates].
  */
 @Composable
-public fun <T : Any> Flow<PagingData<T>>.collectAsLazyPagingItems(): LazyPagingItems<T> {
+public fun <T : Any> Flow<PagingData<T>>.collectAsLazyPagingItems(
+    context: CoroutineContext = EmptyCoroutineContext
+): LazyPagingItems<T> {
+
     val lazyPagingItems = remember(this) { LazyPagingItems(this) }
 
     LaunchedEffect(lazyPagingItems) {
-        lazyPagingItems.collectPagingData()
+        if (context == EmptyCoroutineContext) {
+            lazyPagingItems.collectPagingData()
+        } else {
+            withContext(context) {
+                lazyPagingItems.collectPagingData()
+            }
+        }
     }
+
     LaunchedEffect(lazyPagingItems) {
-        lazyPagingItems.collectLoadState()
+        if (context == EmptyCoroutineContext) {
+            lazyPagingItems.collectLoadState()
+        } else {
+            withContext(context) {
+                lazyPagingItems.collectLoadState()
+            }
+        }
     }
 
     return lazyPagingItems
diff --git a/paging/paging-guava/build.gradle b/paging/paging-guava/build.gradle
index 91cec79..8138c10 100644
--- a/paging/paging-guava/build.gradle
+++ b/paging/paging-guava/build.gradle
@@ -50,10 +50,3 @@
 android {
     namespace "androidx.paging.guava"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/paging/paging-runtime/build.gradle b/paging/paging-runtime/build.gradle
index eb2de3b..7297aae 100644
--- a/paging/paging-runtime/build.gradle
+++ b/paging/paging-runtime/build.gradle
@@ -73,10 +73,3 @@
     description = "Android Paging-Runtime"
     legacyDisableKotlinStrictApiMode = true
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/paging/paging-rxjava2/build.gradle b/paging/paging-rxjava2/build.gradle
index 1c88485..0ee6124 100644
--- a/paging/paging-rxjava2/build.gradle
+++ b/paging/paging-rxjava2/build.gradle
@@ -58,10 +58,3 @@
 android {
     namespace "androidx.paging.rxjava2"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/paging/paging-rxjava3/build.gradle b/paging/paging-rxjava3/build.gradle
index 79a0f66..ae2cd17 100644
--- a/paging/paging-rxjava3/build.gradle
+++ b/paging/paging-rxjava3/build.gradle
@@ -56,10 +56,3 @@
 android {
     namespace "androidx.paging.rxjava3"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/paging/samples/build.gradle b/paging/samples/build.gradle
index 02eb600..855bd82 100644
--- a/paging/samples/build.gradle
+++ b/paging/samples/build.gradle
@@ -58,10 +58,3 @@
     inceptionYear = "2019"
     description = "Contains the sample code for the Androidx Paging library"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/playground-common/androidx-shared.properties b/playground-common/androidx-shared.properties
index 8314ae8..2d6ebce 100644
--- a/playground-common/androidx-shared.properties
+++ b/playground-common/androidx-shared.properties
@@ -39,7 +39,6 @@
 android.enableAdditionalTestOutput=true
 android.useAndroidX=true
 android.nonTransitiveRClass=true
-android.disableAutomaticComponentCreation=true
 # Suppress pointless warning about mpp being experimental
 kotlin.mpp.stability.nowarn=true
 # Workaround for b/141364941
diff --git a/playground-common/playground.properties b/playground-common/playground.properties
index dfa2f9e..d8a397f 100644
--- a/playground-common/playground.properties
+++ b/playground-common/playground.properties
@@ -25,7 +25,7 @@
 kotlin.code.style=official
 # Disable docs
 androidx.enableDocumentation=false
-androidx.playground.snapshotBuildId=8877926
+androidx.playground.snapshotBuildId=9006035
 androidx.playground.metalavaBuildId=8993580
 androidx.playground.dokkaBuildId=7472101
 androidx.studio.type=playground
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParser.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParser.kt
index 11b1474..43759b1 100644
--- a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParser.kt
+++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParser.kt
@@ -96,7 +96,9 @@
     private fun parseType(method: KSFunctionDeclaration, type: KSType): Type {
         validator.validateType(method, type)
         return Type(
-            name = type.declaration.simpleName.getFullName(),
+            // we should always have the qualified name here because there can't be local type
+            // declarations in method signatures.
+            name = type.declaration.qualifiedName!!.getFullName(),
         )
     }
 }
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParserTest.kt b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParserTest.kt
index 54a21a1..a44a798 100644
--- a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParserTest.kt
+++ b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParserTest.kt
@@ -43,6 +43,7 @@
                     @PrivacySandboxService
                     interface MySdk {
                         fun doStuff(x: Int, y: Int): String
+                        fun doMoreStuff()
                     }
                 """
             )
@@ -59,19 +60,24 @@
                                     Parameter(
                                         name = "x",
                                         type = Type(
-                                            name = "Int",
+                                            name = "kotlin.Int",
                                         )
                                     ),
                                     Parameter(
                                         name = "y",
                                         type = Type(
-                                            name = "Int",
+                                            name = "kotlin.Int",
                                         )
                                     )
                                 ),
                                 returnType = Type(
-                                    name = "String",
+                                    name = "kotlin.String",
                                 )
+                            ),
+                            Method(
+                                name = "doMoreStuff",
+                                parameters = listOf(),
+                                returnType = Type("kotlin.Unit")
                             )
                         )
                     )
diff --git a/privacysandbox/tools/tools-apigenerator/build.gradle b/privacysandbox/tools/tools-apigenerator/build.gradle
index 125c7fb..68a3e97 100644
--- a/privacysandbox/tools/tools-apigenerator/build.gradle
+++ b/privacysandbox/tools/tools-apigenerator/build.gradle
@@ -23,6 +23,16 @@
 
 dependencies {
     api(libs.kotlinStdlib)
+    implementation(libs.asm)
+    implementation(libs.asmCommons)
+    implementation(libs.kotlinMetadataJvm)
+    implementation project(path: ':privacysandbox:tools:tools')
+    implementation project(path: ':privacysandbox:tools:tools-core')
+
+    testImplementation(project(":room:room-compiler-processing-testing"))
+    testImplementation(project(":internal-testutils-truth"))
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
 }
 
 androidx {
diff --git a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParser.kt b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParser.kt
new file mode 100644
index 0000000..9f7bb10
--- /dev/null
+++ b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParser.kt
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.privacysandbox.tools.apigenerator.parser
+
+import androidx.privacysandbox.tools.PrivacySandboxService
+import androidx.privacysandbox.tools.core.AnnotatedInterface
+import androidx.privacysandbox.tools.core.Method
+import androidx.privacysandbox.tools.core.Parameter
+import androidx.privacysandbox.tools.core.ParsedApi
+import androidx.privacysandbox.tools.core.Type
+import java.io.File
+import kotlinx.metadata.Flag
+import kotlinx.metadata.KmClass
+import kotlinx.metadata.KmClassifier
+import kotlinx.metadata.KmFunction
+import kotlinx.metadata.KmType
+import kotlinx.metadata.jvm.KotlinClassHeader
+import kotlinx.metadata.jvm.KotlinClassMetadata
+import org.objectweb.asm.ClassReader
+import org.objectweb.asm.ClassReader.SKIP_CODE
+import org.objectweb.asm.ClassReader.SKIP_DEBUG
+import org.objectweb.asm.ClassReader.SKIP_FRAMES
+import org.objectweb.asm.Opcodes
+import org.objectweb.asm.Type.getDescriptor
+import org.objectweb.asm.tree.AnnotationNode
+import org.objectweb.asm.tree.ClassNode
+
+internal object ApiStubParser {
+    /**
+     * Parses the API annotated by a Privacy Sandbox SDK from its compiled classes.
+     *
+     * @param stubClassPath Set of compiled SDK classes. It's expected that at least one of those
+     *      files should be a valid Kotlin interface annotated with @PrivacySandboxService.
+     */
+    internal fun parse(stubClassPath: Set<File>): ParsedApi {
+        val services = stubClassPath.asSequence()
+            .filter { it.extension == "class" }
+            .map { it.inputStream().use { inputStream -> toClassNode(inputStream.readBytes()) } }
+            .filter { it.visibleAnnotationsWithType<PrivacySandboxService>().isNotEmpty() }
+            .map(this::parseClass)
+            .toSet()
+        if (services.isEmpty()) throw IllegalArgumentException(
+            "Unable to find valid interfaces annotated with @PrivacySandboxService."
+        )
+        return ParsedApi(services)
+    }
+
+    private fun toClassNode(classContents: ByteArray): ClassNode {
+        val reader = ClassReader(classContents)
+        val classNode = ClassNode(Opcodes.ASM9)
+        reader.accept(classNode, SKIP_CODE or SKIP_DEBUG or SKIP_FRAMES)
+        return classNode
+    }
+
+    private fun parseClass(classNode: ClassNode): AnnotatedInterface {
+        val kotlinMetadata = parseKotlinMetadata(classNode)
+
+        // Package names are separated with slashes and nested classes are separated with dots.
+        // (e.g com/example/OuterClass.InnerClass).
+        val (packageName, className) = kotlinMetadata.name.split('/').run {
+            dropLast(1).joinToString(separator = ".") to last()
+        }
+
+        if (!Flag.Class.IS_INTERFACE(kotlinMetadata.flags)) {
+            throw IllegalArgumentException(
+                "$packageName.$className is not a Kotlin interface but it's annotated with " +
+                    "@PrivacySandboxService."
+            )
+        }
+
+        if (className.contains('.')) {
+            throw IllegalArgumentException(
+                "$packageName.$className is an inner interface so it can't be annotated with " +
+                    "@PrivacySandboxService."
+            )
+        }
+
+        return AnnotatedInterface(
+            className,
+            packageName,
+            kotlinMetadata.functions.map(this::parseMethod),
+        )
+    }
+
+    private fun parseKotlinMetadata(classNode: ClassNode): KmClass {
+        val metadataValues =
+            classNode.visibleAnnotationsWithType<Metadata>().firstOrNull()?.attributeMap
+                ?: throw IllegalArgumentException(
+                    "Missing Kotlin metadata annotation in ${classNode.name}. " +
+                        "Is this a valid Kotlin class?"
+                )
+
+        // ASM models annotation attributes as flat List<Objects>, so the unchecked cast is
+        // inevitable when some of these objects have type parameters, like the lists below.
+        @Suppress("UNCHECKED_CAST")
+        val header = KotlinClassHeader(
+            kind = metadataValues["k"] as Int?,
+            metadataVersion = (metadataValues["mv"] as? List<Int>?)?.toIntArray(),
+            data1 = (metadataValues["d1"] as? List<String>?)?.toTypedArray(),
+            data2 = (metadataValues["d2"] as? List<String>?)?.toTypedArray(),
+            extraInt = metadataValues["xi"] as? Int?,
+            packageName = metadataValues["pn"] as? String?,
+            extraString = metadataValues["xs"] as? String?,
+        )
+
+        return when (val metadata = KotlinClassMetadata.read(header)) {
+            is KotlinClassMetadata.Class -> metadata.toKmClass()
+            else -> throw IllegalArgumentException(
+                "Unable to parse Kotlin metadata from ${classNode.name}. " +
+                    "Is this a valid Kotlin class?"
+            )
+        }
+    }
+
+    private fun parseMethod(function: KmFunction): Method {
+        return Method(
+            function.name,
+            function.valueParameters.map { Parameter(it.name, parseType(it.type)) },
+            parseType(function.returnType),
+        )
+    }
+
+    private fun parseType(type: KmType): Type {
+        return when (val classifier = type.classifier) {
+            is KmClassifier.Class -> Type(classifier.name.replace('/', '.'))
+            else -> throw IllegalArgumentException(
+                "Unsupported type in API description: $type"
+            )
+        }
+    }
+}
+
+inline fun <reified T> ClassNode.visibleAnnotationsWithType(): List<AnnotationNode> {
+    return (visibleAnnotations ?: listOf<AnnotationNode>())
+        .filter { getDescriptor(T::class.java) == it?.desc }
+        .filterNotNull()
+}
+
+/** Map of annotation attributes. This is a convenience wrapper around [AnnotationNode.values]. */
+val AnnotationNode.attributeMap: Map<String, Any>
+    get() {
+        values ?: return mapOf()
+        val attributes = mutableMapOf<String, Any>()
+        for (i in 0 until values.size step 2) {
+            attributes[values[i] as String] = values[i + 1]
+        }
+        return attributes
+    }
diff --git a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParserTest.kt b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParserTest.kt
new file mode 100644
index 0000000..a010be9
--- /dev/null
+++ b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParserTest.kt
@@ -0,0 +1,199 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.privacysandbox.tools.apigenerator.parser
+
+import androidx.privacysandbox.tools.core.AnnotatedInterface
+import androidx.privacysandbox.tools.core.Method
+import androidx.privacysandbox.tools.core.Parameter
+import androidx.privacysandbox.tools.core.Type
+import androidx.room.compiler.processing.util.Source
+import androidx.room.compiler.processing.util.compiler.TestCompilationArguments
+import androidx.room.compiler.processing.util.compiler.compile
+import androidx.testutils.assertThrows
+import com.google.common.truth.Truth.assertThat
+import java.nio.file.Files
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ApiStubParserTest {
+    @Test
+    fun annotatedInterface_isParsed() {
+        val source = Source.kotlin(
+            "com/mysdk/MySdk.kt", """
+                    package com.mysdk
+                    import androidx.privacysandbox.tools.PrivacySandboxService
+                    @PrivacySandboxService
+                    interface MySdk {
+                      fun doSomething(magicNumber: Int, awesomeString: String)
+                      fun returnMagicNumber(): Int
+                    }
+                """
+        )
+
+        assertThat(compileAndParseApi(source))
+            .containsExactly(
+                AnnotatedInterface(
+                    name = "MySdk", packageName = "com.mysdk", methods = listOf(
+                        Method(
+                            name = "doSomething",
+                            parameters = listOf(
+                                Parameter("magicNumber", Type("kotlin.Int")),
+                                Parameter("awesomeString", Type("kotlin.String"))
+                            ),
+                            returnType = Type("kotlin.Unit")
+                        ),
+                        Method(
+                            name = "returnMagicNumber",
+                            parameters = listOf(),
+                            returnType = Type("kotlin.Int")
+                        )
+                    )
+                )
+            )
+    }
+
+    @Test
+    fun nonAnnotatedClasses_areSafelyIgnored() {
+        val interfaces = compileAndParseApi(
+            Source.kotlin(
+                "com/mysdk/MySdk.kt", """
+                    package com.mysdk
+                    import androidx.privacysandbox.tools.PrivacySandboxService
+                    @PrivacySandboxService
+                    interface MySdk
+                """
+            ), Source.kotlin(
+                "com/mysdk/NonAnnotatedInterface.kt", """
+                    package com.mysdk
+                    interface NonAnnotatedInterface
+                """
+            ), Source.kotlin(
+                "com/mysdk/NonAnnotatedClass.kt", """
+                    package com.mysdk
+                    class NonAnnotatedClass
+                """
+            ), Source.java(
+                "com/mysdk/NonAnnotatedJavaClass.java", """
+                    package com.mysdk;
+                    class NonAnnotatedJavaClass {}
+                """
+            )
+        )
+
+        assertThat(interfaces).containsExactly(AnnotatedInterface("MySdk", "com.mysdk"))
+    }
+
+    @Test
+    fun annotatedInterfaceWithEmptyPackageName_isHandledSafely() {
+        val source = Source.kotlin(
+            "MySdk.kt", """
+                    import androidx.privacysandbox.tools.PrivacySandboxService
+                    @PrivacySandboxService
+                    interface MySdk
+                """
+        )
+
+        assertThat(compileAndParseApi(source)).containsExactly(AnnotatedInterface("MySdk", ""))
+    }
+
+    @Test
+    fun nonKotlinAnnotatedInterface_throws() {
+        val source = Source.java(
+            "com/mysdk/MySdk.java", """
+                    package com.mysdk;
+                    import androidx.privacysandbox.tools.PrivacySandboxService;
+                    @PrivacySandboxService
+                    interface MySdk {}
+                """
+        )
+
+        assertThrows<IllegalArgumentException> {
+            compileAndParseApi(source)
+        }.hasMessageThat().contains(
+            "Missing Kotlin metadata annotation in com/mysdk/MySdk. Is this a valid Kotlin class?"
+        )
+    }
+
+    @Test
+    fun annotatedKotlinClass_throws() {
+        val source = Source.kotlin(
+            "com/mysdk/MySdk.kt", """
+                    package com.mysdk
+                    import androidx.privacysandbox.tools.PrivacySandboxService
+                    @PrivacySandboxService
+                    class MySdk
+                """
+        )
+
+        assertThrows<IllegalArgumentException> {
+            compileAndParseApi(source)
+        }.hasMessageThat().contains(
+            "com.mysdk.MySdk is not a Kotlin interface but it's annotated with " +
+                "@PrivacySandboxService"
+        )
+    }
+
+    @Test
+    fun annotatedKotlinInnerInterface_throws() {
+        val source = Source.kotlin(
+            "com/mysdk/OuterMySdk.kt", """
+                    package com.mysdk
+                    import androidx.privacysandbox.tools.PrivacySandboxService
+                    interface OuterMySdk {
+                      @PrivacySandboxService
+                      interface InnerMySdk
+                    }
+                """
+        )
+
+        assertThrows<IllegalArgumentException> {
+            compileAndParseApi(source)
+        }.hasMessageThat().contains(
+            "com.mysdk.OuterMySdk.InnerMySdk is an inner interface so it can't be annotated with " +
+                "@PrivacySandboxService"
+        )
+    }
+
+    @Test
+    fun missingAnnotatedInterface_throws() {
+        val source = Source.kotlin(
+            "com/mysdk/MySdk.kt", """
+                    package com.mysdk
+                    interface MySdk
+                """
+        )
+
+        assertThrows<IllegalArgumentException> {
+            compileAndParseApi(source)
+        }.hasMessageThat().contains(
+            "Unable to find valid interfaces annotated with @PrivacySandboxService."
+        )
+    }
+
+    private fun compileAndParseApi(vararg sources: Source): Set<AnnotatedInterface> {
+        val result = compile(
+            Files.createTempDirectory("test").toFile(), TestCompilationArguments(
+                sources = sources.asList(),
+            )
+        )
+        assertThat(result.success).isTrue()
+        val stubClassPath = result.outputClasspath.flatMap { it.walk() }.toSet()
+        return ApiStubParser.parse(stubClassPath).services
+    }
+}
diff --git a/privacysandbox/tools/tools/build.gradle b/privacysandbox/tools/tools/build.gradle
index 1c488af..cc192e6 100644
--- a/privacysandbox/tools/tools/build.gradle
+++ b/privacysandbox/tools/tools/build.gradle
@@ -15,6 +15,7 @@
  */
 
 import androidx.build.LibraryType
+import androidx.build.RunApiTasks
 
 plugins {
     id("AndroidXPlugin")
@@ -31,4 +32,5 @@
     mavenGroup = LibraryGroups.PRIVACYSANDBOX_TOOLS
     inceptionYear = "2022"
     description = "Tools for communicating with SDKs running in the Privacy Sandbox."
+    runApiTasks = new RunApiTasks.No("API still under active development.")
 }
diff --git a/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/PrivacySandboxService.kt b/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/PrivacySandboxService.kt
index cd87506..ae29b66 100644
--- a/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/PrivacySandboxService.kt
+++ b/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/PrivacySandboxService.kt
@@ -17,6 +17,6 @@
 package androidx.privacysandbox.tools
 
 /** Entry point for an SDK service running in the privacy sandbox. */
-@Retention(AnnotationRetention.BINARY)
+@Retention(AnnotationRetention.RUNTIME)
 @Target(AnnotationTarget.CLASS)
 public annotation class PrivacySandboxService
\ No newline at end of file
diff --git a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstallReceiver.java b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstallReceiver.java
index 6de83a3..94f5af1 100644
--- a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstallReceiver.java
+++ b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstallReceiver.java
@@ -72,11 +72,14 @@
                     new ResultDiagnostics(), /* forceWriteProfile */true);
         } else if (ACTION_SKIP_FILE.equals(action)) {
             Bundle extras = intent.getExtras();
-            String operation = extras.getString(EXTRA_SKIP_FILE_OPERATION);
-            if (EXTRA_SKIP_FILE_OPERATION_WRITE.equals(operation)) {
-                ProfileInstaller.writeSkipFile(context, Runnable::run, new ResultDiagnostics());
-            } else if (EXTRA_SKIP_FILE_OPERATION_DELETE.equals(operation)) {
-                ProfileInstaller.deleteSkipFile(context, Runnable::run, new ResultDiagnostics());
+            if (extras != null) {
+                String operation = extras.getString(EXTRA_SKIP_FILE_OPERATION);
+                if (EXTRA_SKIP_FILE_OPERATION_WRITE.equals(operation)) {
+                    ProfileInstaller.writeSkipFile(context, Runnable::run, new ResultDiagnostics());
+                } else if (EXTRA_SKIP_FILE_OPERATION_DELETE.equals(operation)) {
+                    ProfileInstaller.deleteSkipFile(
+                            context, Runnable::run, new ResultDiagnostics());
+                }
             }
         }
     }
diff --git a/room/integration-tests/kotlintestapp/build.gradle b/room/integration-tests/kotlintestapp/build.gradle
index a88e0f2..9daf078 100644
--- a/room/integration-tests/kotlintestapp/build.gradle
+++ b/room/integration-tests/kotlintestapp/build.gradle
@@ -121,10 +121,3 @@
 ksp {
     arg("room.schemaLocation","$projectDir/schemas-ksp".toString())
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/InternalsTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/InternalsTest.kt
index e5f90ed..c6b7b26 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/InternalsTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/InternalsTest.kt
@@ -98,7 +98,7 @@
     @Before
     fun init() {
         db = Room.inMemoryDatabaseBuilder(
-            InstrumentationRegistry.getInstrumentation().context,
+            InstrumentationRegistry.getInstrumentation().targetContext,
             InternalDb::class.java
         ).build()
     }
diff --git a/room/room-compiler-processing-testing/build.gradle b/room/room-compiler-processing-testing/build.gradle
index 4cffee2..e314215 100644
--- a/room/room-compiler-processing-testing/build.gradle
+++ b/room/room-compiler-processing-testing/build.gradle
@@ -72,7 +72,6 @@
 tasks.named("compileTestKotlin", KotlinCompile.class).configure {
     it.kotlinOptions {
         freeCompilerArgs += [
-                "-opt-in=kotlin.RequiresOptIn",
                 "-opt-in=androidx.room.compiler.processing.ExperimentalProcessingApi"
         ]
     }
diff --git a/room/room-compiler-processing/build.gradle b/room/room-compiler-processing/build.gradle
index 4e99504..0cc4a53 100644
--- a/room/room-compiler-processing/build.gradle
+++ b/room/room-compiler-processing/build.gradle
@@ -49,7 +49,6 @@
     kotlinOptions {
         freeCompilerArgs += [
                 "-Xjvm-default=all",
-                "-opt-in=kotlin.RequiresOptIn",
                 "-opt-in=kotlin.contracts.ExperimentalContracts",
                 "-opt-in=androidx.room.compiler.processing.ExperimentalProcessingApi"
         ]
diff --git a/room/room-compiler/build.gradle b/room/room-compiler/build.gradle
index 1b33d05..3edc9a10 100644
--- a/room/room-compiler/build.gradle
+++ b/room/room-compiler/build.gradle
@@ -291,7 +291,6 @@
     kotlinOptions {
         freeCompilerArgs += [
                 "-Xjvm-default=all",
-                "-opt-in=kotlin.RequiresOptIn",
                 "-opt-in=kotlin.contracts.ExperimentalContracts",
                 "-opt-in=androidx.room.compiler.processing.ExperimentalProcessingApi"
         ]
diff --git a/room/room-ktx/build.gradle b/room/room-ktx/build.gradle
index daa8372..1b1eec4 100644
--- a/room/room-ktx/build.gradle
+++ b/room/room-ktx/build.gradle
@@ -55,6 +55,6 @@
 // Allow usage of Kotlin's @OptIn.
 tasks.withType(KotlinCompile).configureEach {
     kotlinOptions {
-        freeCompilerArgs += ["-Xjvm-default=all", "-opt-in=kotlin.RequiresOptIn"]
+        freeCompilerArgs += ["-Xjvm-default=all"]
     }
-}
+}
\ No newline at end of file
diff --git a/room/room-paging-guava/build.gradle b/room/room-paging-guava/build.gradle
index 16fc8ae..b737920 100644
--- a/room/room-paging-guava/build.gradle
+++ b/room/room-paging-guava/build.gradle
@@ -45,13 +45,6 @@
     )
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 androidx {
     name = "Room Paging Guava"
     type = LibraryType.PUBLISHED_LIBRARY
diff --git a/room/room-paging-rxjava2/build.gradle b/room/room-paging-rxjava2/build.gradle
index 8556c76..f078726 100644
--- a/room/room-paging-rxjava2/build.gradle
+++ b/room/room-paging-rxjava2/build.gradle
@@ -44,13 +44,6 @@
     )
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 androidx {
     name = "Room Paging RxJava2"
     type = LibraryType.PUBLISHED_LIBRARY
diff --git a/room/room-paging-rxjava3/build.gradle b/room/room-paging-rxjava3/build.gradle
index 8077851..820b60e 100644
--- a/room/room-paging-rxjava3/build.gradle
+++ b/room/room-paging-rxjava3/build.gradle
@@ -44,13 +44,6 @@
     )
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 androidx {
     name = "Room Paging RxJava3"
     type = LibraryType.PUBLISHED_LIBRARY
diff --git a/room/room-paging/build.gradle b/room/room-paging/build.gradle
index 82deecc..5be305e 100644
--- a/room/room-paging/build.gradle
+++ b/room/room-paging/build.gradle
@@ -54,13 +54,6 @@
     androidTestImplementation(project(":internal-testutils-common"))
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 androidx {
     name = "Room Paging"
     type = LibraryType.PUBLISHED_LIBRARY
diff --git a/room/room-runtime/src/androidTest/java/androidx/room/AutoClosingRoomOpenHelperTest.kt b/room/room-runtime/src/androidTest/java/androidx/room/AutoClosingRoomOpenHelperTest.kt
index f9400d2..15ca43c9 100644
--- a/room/room-runtime/src/androidTest/java/androidx/room/AutoClosingRoomOpenHelperTest.kt
+++ b/room/room-runtime/src/androidTest/java/androidx/room/AutoClosingRoomOpenHelperTest.kt
@@ -35,7 +35,7 @@
 import java.util.concurrent.Executors
 import java.util.concurrent.TimeUnit
 
-public class AutoClosingRoomOpenHelperTest {
+class AutoClosingRoomOpenHelperTest {
 
     private open class Callback(var throwOnOpen: Boolean = false) :
         SupportSQLiteOpenHelper.Callback(1) {
@@ -51,7 +51,7 @@
     }
 
     @Before
-    public fun setUp() {
+    fun setUp() {
         ApplicationProvider.getApplicationContext<Context>().deleteDatabase("name")
     }
 
@@ -82,7 +82,7 @@
 
     @RequiresApi(Build.VERSION_CODES.N)
     @Test
-    public fun testQueryFailureDecrementsRefCount() {
+    fun testQueryFailureDecrementsRefCount() {
         val autoClosingRoomOpenHelper = getAutoClosingRoomOpenHelper()
 
         assertThrows<SQLiteException> {
@@ -95,7 +95,7 @@
 
     @RequiresApi(Build.VERSION_CODES.N)
     @Test
-    public fun testCursorKeepsDbAlive() {
+    fun testCursorKeepsDbAlive() {
         val autoClosingRoomOpenHelper = getAutoClosingRoomOpenHelper()
         autoClosingRoomOpenHelper.writableDatabase.execSQL("create table user (idk int)")
 
@@ -108,7 +108,7 @@
 
     @RequiresApi(Build.VERSION_CODES.N)
     @Test
-    public fun testTransactionKeepsDbAlive() {
+    fun testTransactionKeepsDbAlive() {
         val autoClosingRoomOpenHelper = getAutoClosingRoomOpenHelper()
         autoClosingRoomOpenHelper.writableDatabase.beginTransaction()
         assertThat(autoClosingRoomOpenHelper.autoCloser.refCountForTest).isEqualTo(1)
@@ -119,7 +119,7 @@
     @RequiresApi(Build.VERSION_CODES.N)
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.JELLY_BEAN)
-    public fun enableWriteAheadLogging_onOpenHelper() {
+    fun enableWriteAheadLogging_onOpenHelper() {
         val autoClosingRoomOpenHelper = getAutoClosingRoomOpenHelper()
 
         autoClosingRoomOpenHelper.setWriteAheadLoggingEnabled(true)
@@ -132,7 +132,7 @@
 
     @RequiresApi(Build.VERSION_CODES.N)
     @Test
-    public fun testEnableWriteAheadLogging_onSupportSqliteDatabase_throwsUnsupportedOperation() {
+    fun testEnableWriteAheadLogging_onSupportSqliteDatabase_throwsUnsupportedOperation() {
         val autoClosingRoomOpenHelper = getAutoClosingRoomOpenHelper()
 
         assertThrows<UnsupportedOperationException> {
@@ -147,7 +147,7 @@
     @RequiresApi(Build.VERSION_CODES.N)
     @FlakyTest(bugId = 190607416)
     @Test
-    public fun testOnOpenCalledOnEachOpen() {
+    fun testOnOpenCalledOnEachOpen() {
         val countingCallback = object : Callback() {
             var onCreateCalls = 0
             var onOpenCalls = 0
@@ -177,7 +177,7 @@
 
     @RequiresApi(Build.VERSION_CODES.N)
     @Test
-    public fun testStatementReturnedByCompileStatement_doesntKeepDatabaseOpen() {
+    fun testStatementReturnedByCompileStatement_doesntKeepDatabaseOpen() {
         val autoClosingRoomOpenHelper = getAutoClosingRoomOpenHelper()
 
         val db = autoClosingRoomOpenHelper.writableDatabase
@@ -192,7 +192,7 @@
 
     @RequiresApi(Build.VERSION_CODES.N)
     @Test
-    public fun testStatementReturnedByCompileStatement_reOpensDatabase() {
+    fun testStatementReturnedByCompileStatement_reOpensDatabase() {
         val autoClosingRoomOpenHelper = getAutoClosingRoomOpenHelper()
 
         val db = autoClosingRoomOpenHelper.writableDatabase
@@ -214,7 +214,7 @@
 
     @RequiresApi(Build.VERSION_CODES.N)
     @Test
-    public fun testStatementReturnedByCompileStatement_worksWithBinds() {
+    fun testStatementReturnedByCompileStatement_worksWithBinds() {
         val autoClosingRoomOpenHelper = getAutoClosingRoomOpenHelper()
         val db = autoClosingRoomOpenHelper.writableDatabase
 
@@ -257,7 +257,7 @@
     }
 
     @Test
-    public fun testGetDelegate() {
+    fun testGetDelegate() {
         val delegateOpenHelper = FrameworkSQLiteOpenHelperFactory()
             .create(
                 SupportSQLiteOpenHelper.Configuration
diff --git a/samples/Support7Demos/OWNERS b/samples/AndroidXDemos/OWNERS
similarity index 100%
rename from samples/Support7Demos/OWNERS
rename to samples/AndroidXDemos/OWNERS
diff --git a/samples/Support7Demos/_index.html b/samples/AndroidXDemos/_index.html
similarity index 66%
rename from samples/Support7Demos/_index.html
rename to samples/AndroidXDemos/_index.html
index 0c017ab..aef0f37 100644
--- a/samples/Support7Demos/_index.html
+++ b/samples/AndroidXDemos/_index.html
@@ -1,5 +1,5 @@
-<p>The Support v7 Demos application contains a variety of small sample
-code showing how to use key features of the Android API 7+ Support Library.
+<p>The AndroidX Demos application contains a variety of small sample
+code showing how to use key features of the AndroidX Library.
 This library contains code that you can
 build in to your application to access new features and common
 utilities while being able to run down to version 2.1 (API 7)
@@ -20,9 +20,9 @@
 "points to the program code for the different topics included in the project:</p>"+
 
 "<ul>"+
-"<li><a href='src/com/example/android/supportv7/app/index.html'>App</a></li>"+
-"<li><a href='src/com/example/android/supportv7/media/index.html'>Media</a></li>"+
-"<li><a href='src/com/example/android/supportv7/view/index.html'>Views</a></li>"+
+"<li><a href='src/com/example/androidx/app/index.html'>App</a></li>"+
+"<li><a href='src/com/example/androidx/media/index.html'>Media</a></li>"+
+"<li><a href='src/com/example/androidx/view/index.html'>Views</a></li>"+
 "</ul>");
 
 }
diff --git a/samples/Support7Demos/build.gradle b/samples/AndroidXDemos/build.gradle
similarity index 95%
rename from samples/Support7Demos/build.gradle
rename to samples/AndroidXDemos/build.gradle
index dc3790f..56df8c2 100644
--- a/samples/Support7Demos/build.gradle
+++ b/samples/AndroidXDemos/build.gradle
@@ -33,5 +33,5 @@
         // TODO: Enable lint after appcompat:1.1.0 release or use lint-baseline.xml instead.
         abortOnError false
     }
-    namespace "com.example.android.supportv7"
+    namespace "com.example.androidx"
 }
diff --git a/samples/Support7Demos/lint-baseline.xml b/samples/AndroidXDemos/lint-baseline.xml
similarity index 80%
rename from samples/Support7Demos/lint-baseline.xml
rename to samples/AndroidXDemos/lint-baseline.xml
index d671b58..66b57c7 100644
--- a/samples/Support7Demos/lint-baseline.xml
+++ b/samples/AndroidXDemos/lint-baseline.xml
@@ -43,7 +43,7 @@
         errorLine1="        notificationManager.notify(NOTIFICATION_ID, notification);"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -64,7 +64,7 @@
         errorLine1="                        .detectImplicitDirectBoot()"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeBootAwareActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatDefaultNightModeBootAwareActivity.java"/>
     </issue>
 
     <issue
@@ -73,7 +73,7 @@
         errorLine1="        getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);"
         errorLine2="                      ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatLocalNightModeActivity.java"/>
     </issue>
 
     <issue
@@ -82,7 +82,7 @@
         errorLine1="        getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);"
         errorLine2="                      ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatLocalNightModeActivity.java"/>
     </issue>
 
     <issue
@@ -91,7 +91,7 @@
         errorLine1="        getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);"
         errorLine2="                      ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatLocalNightModeActivity.java"/>
     </issue>
 
     <issue
@@ -100,7 +100,7 @@
         errorLine1="        getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_TIME);"
         errorLine2="                      ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatLocalNightModeActivity.java"/>
     </issue>
 
     <issue
@@ -109,7 +109,7 @@
         errorLine1="        getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY);"
         errorLine2="                      ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatLocalNightModeActivity.java"/>
     </issue>
 
     <issue
@@ -118,7 +118,7 @@
         errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);"
         errorLine2="                             ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeAlertDialog.java"/>
     </issue>
 
     <issue
@@ -127,7 +127,7 @@
         errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);"
         errorLine2="                             ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeAlertDialog.java"/>
     </issue>
 
     <issue
@@ -136,7 +136,7 @@
         errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);"
         errorLine2="                             ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeAlertDialog.java"/>
     </issue>
 
     <issue
@@ -145,7 +145,7 @@
         errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_TIME);"
         errorLine2="                             ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeAlertDialog.java"/>
     </issue>
 
     <issue
@@ -154,7 +154,7 @@
         errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY);"
         errorLine2="                             ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeAlertDialog.java"/>
     </issue>
 
     <issue
@@ -163,7 +163,7 @@
         errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);"
         errorLine2="                             ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeDialog.java"/>
     </issue>
 
     <issue
@@ -172,7 +172,7 @@
         errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);"
         errorLine2="                             ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeDialog.java"/>
     </issue>
 
     <issue
@@ -181,7 +181,7 @@
         errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);"
         errorLine2="                             ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeDialog.java"/>
     </issue>
 
     <issue
@@ -190,7 +190,7 @@
         errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_TIME);"
         errorLine2="                             ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeDialog.java"/>
     </issue>
 
     <issue
@@ -199,7 +199,7 @@
         errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY);"
         errorLine2="                             ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeDialog.java"/>
     </issue>
 
     <issue
@@ -208,13 +208,13 @@
         errorLine1="                } catch (WindowManager.InvalidDisplayException ex) {"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
         id="NewApi"
         message="`&lt;class>` requires API level 24 (current min is 14)"
-        errorLine1="    class=&quot;com.example.android.supportv7.drawable.MyDrawable&quot;"
+        errorLine1="    class=&quot;com.example.androidx.drawable.MyDrawable&quot;"
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/res/drawable/my_drawable.xml"/>
@@ -303,74 +303,74 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class com.example.android.supportv7.app.AppCompatDefaultNightModeBootAwareActivity is reachable from earlier API levels and will fail run-time class verification."
+        message="This call references a method added in API level 29; however, the containing class com.example.androidx.app.AppCompatDefaultNightModeBootAwareActivity is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        .detectImplicitDirectBoot()"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeBootAwareActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatDefaultNightModeBootAwareActivity.java"/>
     </issue>
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class com.example.android.supportv7.widget.selection.fancy.FancySelectionDemoActivity.OnContextClickListener is reachable from earlier API levels and will fail run-time class verification."
+        message="This call references a method added in API level 24; however, the containing class com.example.androidx.widget.selection.fancy.FancySelectionDemoActivity.OnContextClickListener is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (view.showContextMenu(x, y)) {"
         errorLine2="                     ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/selection/fancy/FancySelectionDemoActivity.java"/>
     </issue>
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class com.example.android.supportv7.media.LocalPlayer.SurfaceViewPlayer is reachable from earlier API levels and will fail run-time class verification."
+        message="This call references a method added in API level 17; however, the containing class com.example.androidx.media.LocalPlayer.SurfaceViewPlayer is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (mPresentation != null &amp;&amp; mPresentation.getDisplay() != presentationDisplay) {"
         errorLine2="                                                       ~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class com.example.android.supportv7.media.Player is reachable from earlier API levels and will fail run-time class verification."
+        message="This call references a method added in API level 26; however, the containing class com.example.androidx.media.Player is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            NotificationChannel channel = new NotificationChannel("
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class com.example.android.supportv7.media.Player is reachable from earlier API levels and will fail run-time class verification."
+        message="This call references a method added in API level 26; however, the containing class com.example.androidx.media.Player is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            channel.setDescription(description);"
         errorLine2="                    ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class com.example.android.supportv7.media.Player is reachable from earlier API levels and will fail run-time class verification."
+        message="This call references a method added in API level 23; however, the containing class com.example.androidx.media.Player is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mContext.getSystemService(NotificationManager.class);"
         errorLine2="                             ~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class com.example.android.supportv7.media.Player is reachable from earlier API levels and will fail run-time class verification."
+        message="This call references a method added in API level 26; however, the containing class com.example.androidx.media.Player is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            notificationManager.createNotificationChannel(channel);"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class com.example.android.supportv7.media.SampleMediaRouteProvider is reachable from earlier API levels and will fail run-time class verification."
+        message="This call references a method added in API level 23; however, the containing class com.example.androidx.media.SampleMediaRouteProvider is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        if (Build.VERSION.SDK_INT >= 23 &amp;&amp; !Settings.canDrawOverlays(getContext())) {"
         errorLine2="                                                     ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SampleMediaRouteProvider.java"/>
+            file="src/main/java/com/example/androidx/media/SampleMediaRouteProvider.java"/>
     </issue>
 
     <issue
@@ -379,7 +379,7 @@
         errorLine1="        @NotNull"
         errorLine2="        ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/RemoveLargeItemsDemo.java"/>
+            file="src/main/java/com/example/androidx/widget/RemoveLargeItemsDemo.java"/>
     </issue>
 
     <issue
@@ -388,7 +388,7 @@
         errorLine1="        public MyViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {"
         errorLine2="                                               ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/RemoveLargeItemsDemo.java"/>
+            file="src/main/java/com/example/androidx/widget/RemoveLargeItemsDemo.java"/>
     </issue>
 
     <issue
@@ -397,7 +397,7 @@
         errorLine1="        public void onBindViewHolder(@NotNull MyViewHolder myViewHolder, int position) {"
         errorLine2="                                     ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/RemoveLargeItemsDemo.java"/>
+            file="src/main/java/com/example/androidx/widget/RemoveLargeItemsDemo.java"/>
     </issue>
 
     <issue
@@ -413,7 +413,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarActionMode.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarActionMode.java"/>
     </issue>
 
     <issue
@@ -422,7 +422,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarBackgroundChange.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarBackgroundChange.java"/>
     </issue>
 
     <issue
@@ -431,7 +431,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarDisplayOptions.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarDisplayOptions.java"/>
     </issue>
 
     <issue
@@ -440,7 +440,7 @@
         errorLine1="    public void onTabSelected(Tab tab, FragmentTransaction ft) {"
         errorLine2="                              ~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarDisplayOptions.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarDisplayOptions.java"/>
     </issue>
 
     <issue
@@ -449,7 +449,7 @@
         errorLine1="    public void onTabSelected(Tab tab, FragmentTransaction ft) {"
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarDisplayOptions.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarDisplayOptions.java"/>
     </issue>
 
     <issue
@@ -458,7 +458,7 @@
         errorLine1="    public void onTabUnselected(Tab tab, FragmentTransaction ft) {"
         errorLine2="                                ~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarDisplayOptions.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarDisplayOptions.java"/>
     </issue>
 
     <issue
@@ -467,7 +467,7 @@
         errorLine1="    public void onTabUnselected(Tab tab, FragmentTransaction ft) {"
         errorLine2="                                         ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarDisplayOptions.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarDisplayOptions.java"/>
     </issue>
 
     <issue
@@ -476,7 +476,7 @@
         errorLine1="    public void onTabReselected(Tab tab, FragmentTransaction ft) {"
         errorLine2="                                ~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarDisplayOptions.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarDisplayOptions.java"/>
     </issue>
 
     <issue
@@ -485,7 +485,7 @@
         errorLine1="    public void onTabReselected(Tab tab, FragmentTransaction ft) {"
         errorLine2="                                         ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarDisplayOptions.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarDisplayOptions.java"/>
     </issue>
 
     <issue
@@ -494,7 +494,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarFragmentMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarFragmentMenu.java"/>
     </issue>
 
     <issue
@@ -503,7 +503,7 @@
         errorLine1="        public void onCreate(Bundle savedInstanceState) {"
         errorLine2="                             ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarFragmentMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarFragmentMenu.java"/>
     </issue>
 
     <issue
@@ -512,7 +512,7 @@
         errorLine1="        public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) {"
         errorLine2="                                        ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarFragmentMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarFragmentMenu.java"/>
     </issue>
 
     <issue
@@ -521,7 +521,7 @@
         errorLine1="        public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                             ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarFragmentMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarFragmentMenu.java"/>
     </issue>
 
     <issue
@@ -530,7 +530,7 @@
         errorLine1="        public void onCreate(Bundle savedInstanceState) {"
         errorLine2="                             ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarFragmentMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarFragmentMenu.java"/>
     </issue>
 
     <issue
@@ -539,7 +539,7 @@
         errorLine1="        public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) {"
         errorLine2="                                        ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarFragmentMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarFragmentMenu.java"/>
     </issue>
 
     <issue
@@ -548,7 +548,7 @@
         errorLine1="        public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                             ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarFragmentMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarFragmentMenu.java"/>
     </issue>
 
     <issue
@@ -557,7 +557,7 @@
         errorLine1="        public void onCreate(Bundle savedInstanceState) {"
         errorLine2="                             ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarFragmentMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarFragmentMenu.java"/>
     </issue>
 
     <issue
@@ -566,7 +566,7 @@
         errorLine1="        public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                             ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarFragmentMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarFragmentMenu.java"/>
     </issue>
 
     <issue
@@ -575,7 +575,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarHideOnScroll.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarHideOnScroll.java"/>
     </issue>
 
     <issue
@@ -584,7 +584,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarMechanics.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarMechanics.java"/>
     </issue>
 
     <issue
@@ -593,7 +593,7 @@
         errorLine1="    public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                         ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarMechanics.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarMechanics.java"/>
     </issue>
 
     <issue
@@ -602,7 +602,7 @@
         errorLine1="    public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                         ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarSettingsActionProviderActivity.java"/>
     </issue>
 
     <issue
@@ -611,7 +611,7 @@
         errorLine1="        public SettingsActionProvider(Context context) {"
         errorLine2="                                      ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarSettingsActionProviderActivity.java"/>
     </issue>
 
     <issue
@@ -620,7 +620,7 @@
         errorLine1="        public View onCreateActionView() {"
         errorLine2="               ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarSettingsActionProviderActivity.java"/>
     </issue>
 
     <issue
@@ -629,7 +629,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarUsage.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarUsage.java"/>
     </issue>
 
     <issue
@@ -638,7 +638,7 @@
         errorLine1="    public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                         ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ActionBarUsage.java"/>
+            file="src/main/java/com/example/androidx/app/ActionBarUsage.java"/>
     </issue>
 
     <issue
@@ -647,7 +647,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AlertDialogUsage.java"/>
+            file="src/main/java/com/example/androidx/app/AlertDialogUsage.java"/>
     </issue>
 
     <issue
@@ -656,7 +656,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/AnimatedRecyclerView.java"/>
+            file="src/main/java/com/example/androidx/widget/AnimatedRecyclerView.java"/>
     </issue>
 
     <issue
@@ -665,7 +665,7 @@
         errorLine1="    public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                         ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/AnimatedRecyclerView.java"/>
+            file="src/main/java/com/example/androidx/widget/AnimatedRecyclerView.java"/>
     </issue>
 
     <issue
@@ -674,7 +674,7 @@
         errorLine1="    public void checkboxClicked(View view) {"
         errorLine2="                                ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/AnimatedRecyclerView.java"/>
+            file="src/main/java/com/example/androidx/widget/AnimatedRecyclerView.java"/>
     </issue>
 
     <issue
@@ -683,7 +683,7 @@
         errorLine1="    public void itemClicked(View view) {"
         errorLine2="                            ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/AnimatedRecyclerView.java"/>
+            file="src/main/java/com/example/androidx/widget/AnimatedRecyclerView.java"/>
     </issue>
 
     <issue
@@ -692,7 +692,7 @@
         errorLine1="    public void deleteSelectedItems(View view) {"
         errorLine2="                                    ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/AnimatedRecyclerView.java"/>
+            file="src/main/java/com/example/androidx/widget/AnimatedRecyclerView.java"/>
     </issue>
 
     <issue
@@ -701,7 +701,7 @@
         errorLine1="    public void d1a2d3(View view) {"
         errorLine2="                       ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/AnimatedRecyclerView.java"/>
+            file="src/main/java/com/example/androidx/widget/AnimatedRecyclerView.java"/>
     </issue>
 
     <issue
@@ -710,7 +710,7 @@
         errorLine1="    public void addDeleteItem(View view) {"
         errorLine2="                              ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/AnimatedRecyclerView.java"/>
+            file="src/main/java/com/example/androidx/widget/AnimatedRecyclerView.java"/>
     </issue>
 
     <issue
@@ -719,7 +719,7 @@
         errorLine1="    public void deleteAddItem(View view) {"
         errorLine2="                              ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/AnimatedRecyclerView.java"/>
+            file="src/main/java/com/example/androidx/widget/AnimatedRecyclerView.java"/>
     </issue>
 
     <issue
@@ -728,7 +728,7 @@
         errorLine1="    public void addItem(View view) {"
         errorLine2="                        ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/AnimatedRecyclerView.java"/>
+            file="src/main/java/com/example/androidx/widget/AnimatedRecyclerView.java"/>
     </issue>
 
     <issue
@@ -737,7 +737,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatAnimatedSelector.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatAnimatedSelector.java"/>
     </issue>
 
     <issue
@@ -746,7 +746,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatAnimatedVector.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatAnimatedVector.java"/>
     </issue>
 
     <issue
@@ -755,7 +755,7 @@
         errorLine1="    public void setModeNightFollowSystem(View view) {"
         errorLine2="                                         ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatDefaultNightModeActivity.java"/>
     </issue>
 
     <issue
@@ -764,7 +764,7 @@
         errorLine1="    public void setModeNightNo(View view) {"
         errorLine2="                               ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatDefaultNightModeActivity.java"/>
     </issue>
 
     <issue
@@ -773,7 +773,7 @@
         errorLine1="    public void setModeNightYes(View view) {"
         errorLine2="                                ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatDefaultNightModeActivity.java"/>
     </issue>
 
     <issue
@@ -782,7 +782,7 @@
         errorLine1="    public void setModeNightAutoTime(View view) {"
         errorLine2="                                     ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatDefaultNightModeActivity.java"/>
     </issue>
 
     <issue
@@ -791,7 +791,7 @@
         errorLine1="    public void setModeNightAutoBattery(View view) {"
         errorLine2="                                        ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatDefaultNightModeActivity.java"/>
     </issue>
 
     <issue
@@ -800,7 +800,7 @@
         errorLine1="    public void setModeNightFollowSystem(View view) {"
         errorLine2="                                         ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeBootAwareActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatDefaultNightModeBootAwareActivity.java"/>
     </issue>
 
     <issue
@@ -809,7 +809,7 @@
         errorLine1="    public void setModeNightNo(View view) {"
         errorLine2="                               ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeBootAwareActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatDefaultNightModeBootAwareActivity.java"/>
     </issue>
 
     <issue
@@ -818,7 +818,7 @@
         errorLine1="    public void setModeNightYes(View view) {"
         errorLine2="                                ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeBootAwareActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatDefaultNightModeBootAwareActivity.java"/>
     </issue>
 
     <issue
@@ -827,7 +827,7 @@
         errorLine1="    public void setModeNightAutoTime(View view) {"
         errorLine2="                                     ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeBootAwareActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatDefaultNightModeBootAwareActivity.java"/>
     </issue>
 
     <issue
@@ -836,7 +836,7 @@
         errorLine1="    public void setModeNightAutoBattery(View view) {"
         errorLine2="                                        ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeBootAwareActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatDefaultNightModeBootAwareActivity.java"/>
     </issue>
 
     <issue
@@ -845,7 +845,7 @@
         errorLine1="    public void setModeNightFollowSystem(View view) {"
         errorLine2="                                         ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatLocalNightModeActivity.java"/>
     </issue>
 
     <issue
@@ -854,7 +854,7 @@
         errorLine1="    public void setModeNightNo(View view) {"
         errorLine2="                               ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatLocalNightModeActivity.java"/>
     </issue>
 
     <issue
@@ -863,7 +863,7 @@
         errorLine1="    public void setModeNightYes(View view) {"
         errorLine2="                                ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatLocalNightModeActivity.java"/>
     </issue>
 
     <issue
@@ -872,7 +872,7 @@
         errorLine1="    public void setModeNightAutoTime(View view) {"
         errorLine2="                                     ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatLocalNightModeActivity.java"/>
     </issue>
 
     <issue
@@ -881,7 +881,7 @@
         errorLine1="    public void setModeNightAutoBattery(View view) {"
         errorLine2="                                        ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatLocalNightModeActivity.java"/>
     </issue>
 
     <issue
@@ -890,7 +890,7 @@
         errorLine1="    public void setModeNightFollowSystem(View view) {"
         errorLine2="                                         ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeAlertDialog.java"/>
     </issue>
 
     <issue
@@ -899,7 +899,7 @@
         errorLine1="    public void setModeNightNo(View view) {"
         errorLine2="                               ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeAlertDialog.java"/>
     </issue>
 
     <issue
@@ -908,7 +908,7 @@
         errorLine1="    public void setModeNightYes(View view) {"
         errorLine2="                                ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeAlertDialog.java"/>
     </issue>
 
     <issue
@@ -917,7 +917,7 @@
         errorLine1="    public void setModeNightAutoTime(View view) {"
         errorLine2="                                     ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeAlertDialog.java"/>
     </issue>
 
     <issue
@@ -926,7 +926,7 @@
         errorLine1="    public void setModeNightAutoBattery(View view) {"
         errorLine2="                                        ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeAlertDialog.java"/>
     </issue>
 
     <issue
@@ -935,7 +935,7 @@
         errorLine1="    public void launchActivity(View view) {"
         errorLine2="                               ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeBounceActivity.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeBounceActivity.java"/>
     </issue>
 
     <issue
@@ -944,7 +944,7 @@
         errorLine1="    public void setModeNightFollowSystem(View view) {"
         errorLine2="                                         ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeDialog.java"/>
     </issue>
 
     <issue
@@ -953,7 +953,7 @@
         errorLine1="    public void setModeNightNo(View view) {"
         errorLine2="                               ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeDialog.java"/>
     </issue>
 
     <issue
@@ -962,7 +962,7 @@
         errorLine1="    public void setModeNightYes(View view) {"
         errorLine2="                                ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeDialog.java"/>
     </issue>
 
     <issue
@@ -971,7 +971,7 @@
         errorLine1="    public void setModeNightAutoTime(View view) {"
         errorLine2="                                     ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeDialog.java"/>
     </issue>
 
     <issue
@@ -980,7 +980,7 @@
         errorLine1="    public void setModeNightAutoBattery(View view) {"
         errorLine2="                                        ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatNightModeDialog.java"/>
     </issue>
 
     <issue
@@ -989,7 +989,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatWidgetsButtons.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatWidgetsButtons.java"/>
     </issue>
 
     <issue
@@ -998,7 +998,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatWidgetsRatingBars.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatWidgetsRatingBars.java"/>
     </issue>
 
     <issue
@@ -1007,7 +1007,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatWidgetsSpinners.java"/>
     </issue>
 
     <issue
@@ -1016,7 +1016,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatWidgetsSwitches.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatWidgetsSwitches.java"/>
     </issue>
 
     <issue
@@ -1025,7 +1025,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatWidgetsTextInput.java"/>
     </issue>
 
     <issue
@@ -1034,7 +1034,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatWidgetsTextViews.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatWidgetsTextViews.java"/>
     </issue>
 
     <issue
@@ -1043,7 +1043,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatWidgetsToggleButtons.java"/>
+            file="src/main/java/com/example/androidx/app/AppCompatWidgetsToggleButtons.java"/>
     </issue>
 
     <issue
@@ -1052,7 +1052,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/AsyncListUtilActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/AsyncListUtilActivity.java"/>
     </issue>
 
     <issue
@@ -1061,7 +1061,7 @@
         errorLine1="    public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                         ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/AsyncListUtilActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/AsyncListUtilActivity.java"/>
     </issue>
 
     <issue
@@ -1070,7 +1070,7 @@
         errorLine1="    protected RecyclerView mRecyclerView;"
         errorLine2="              ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/BaseLayoutManagerActivity.java"/>
     </issue>
 
     <issue
@@ -1079,7 +1079,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/BaseLayoutManagerActivity.java"/>
     </issue>
 
     <issue
@@ -1088,7 +1088,7 @@
         errorLine1="    protected void onRecyclerViewInit(RecyclerView recyclerView) {"
         errorLine2="                                      ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/BaseLayoutManagerActivity.java"/>
     </issue>
 
     <issue
@@ -1097,7 +1097,7 @@
         errorLine1="    protected RecyclerView.Adapter createAdapter() {"
         errorLine2="              ~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/BaseLayoutManagerActivity.java"/>
     </issue>
 
     <issue
@@ -1106,7 +1106,7 @@
         errorLine1="    public void onScrollClicked(View view) {"
         errorLine2="                                ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/BaseLayoutManagerActivity.java"/>
     </issue>
 
     <issue
@@ -1115,7 +1115,7 @@
         errorLine1="    protected ConfigToggle[] createConfigToggles() {"
         errorLine2="              ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/BaseLayoutManagerActivity.java"/>
     </issue>
 
     <issue
@@ -1124,7 +1124,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/view/CardViewActivity.java"/>
+            file="src/main/java/com/example/androidx/view/CardViewActivity.java"/>
     </issue>
 
     <issue
@@ -1133,7 +1133,7 @@
         errorLine1="    protected ConfigToggle(Context context, int labelId) {"
         errorLine2="                           ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/util/ConfigToggle.java"/>
+            file="src/main/java/com/example/androidx/widget/util/ConfigToggle.java"/>
     </issue>
 
     <issue
@@ -1142,7 +1142,7 @@
         errorLine1="    public String getText() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/util/ConfigToggle.java"/>
+            file="src/main/java/com/example/androidx/widget/util/ConfigToggle.java"/>
     </issue>
 
     <issue
@@ -1151,7 +1151,7 @@
         errorLine1="    public ConfigViewHolder(View itemView) {"
         errorLine2="                            ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/util/ConfigViewHolder.java"/>
+            file="src/main/java/com/example/androidx/widget/util/ConfigViewHolder.java"/>
     </issue>
 
     <issue
@@ -1160,7 +1160,7 @@
         errorLine1="    public void bind(ConfigToggle toggle) {"
         errorLine2="                     ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/util/ConfigViewHolder.java"/>
+            file="src/main/java/com/example/androidx/widget/util/ConfigViewHolder.java"/>
     </issue>
 
     <issue
@@ -1169,7 +1169,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/drawable/CustomDrawableActivity.java"/>
+            file="src/main/java/com/example/androidx/drawable/CustomDrawableActivity.java"/>
     </issue>
 
     <issue
@@ -1178,7 +1178,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/DialogFragmentUsage.java"/>
+            file="src/main/java/com/example/androidx/app/DialogFragmentUsage.java"/>
     </issue>
 
     <issue
@@ -1187,7 +1187,7 @@
         errorLine1="        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,"
         errorLine2="                                 ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/DialogFragmentUsage.java"/>
+            file="src/main/java/com/example/androidx/app/DialogFragmentUsage.java"/>
     </issue>
 
     <issue
@@ -1196,7 +1196,7 @@
         errorLine1="        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {"
         errorLine2="                                        ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/DialogFragmentUsage.java"/>
+            file="src/main/java/com/example/androidx/app/DialogFragmentUsage.java"/>
     </issue>
 
     <issue
@@ -1205,7 +1205,7 @@
         errorLine1="        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {"
         errorLine2="                                                   ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/DialogFragmentUsage.java"/>
+            file="src/main/java/com/example/androidx/app/DialogFragmentUsage.java"/>
     </issue>
 
     <issue
@@ -1214,7 +1214,7 @@
         errorLine1="        public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                             ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/DialogFragmentUsage.java"/>
+            file="src/main/java/com/example/androidx/app/DialogFragmentUsage.java"/>
     </issue>
 
     <issue
@@ -1223,7 +1223,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/DialogUsage.java"/>
+            file="src/main/java/com/example/androidx/app/DialogUsage.java"/>
     </issue>
 
     <issue
@@ -1232,7 +1232,7 @@
         errorLine1="    public void onBind(ItemTouchViewHolder viewHolder) {"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/DragAndDropActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/DragAndDropActivity.java"/>
     </issue>
 
     <issue
@@ -1241,7 +1241,7 @@
         errorLine1="    public void clearView(RecyclerView.ViewHolder viewHolder) {"
         errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/DragAndDropActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/DragAndDropActivity.java"/>
     </issue>
 
     <issue
@@ -1250,7 +1250,7 @@
         errorLine1="    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {"
         errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/DragAndDropActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/DragAndDropActivity.java"/>
     </issue>
 
     <issue
@@ -1259,7 +1259,7 @@
         errorLine1="    public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/DragAndDropActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/DragAndDropActivity.java"/>
     </issue>
 
     <issue
@@ -1268,7 +1268,7 @@
         errorLine1="    public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {"
         errorLine2="                                                  ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/DragAndDropActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/DragAndDropActivity.java"/>
     </issue>
 
     <issue
@@ -1277,7 +1277,7 @@
         errorLine1="    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {"
         errorLine2="                                ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/DragAndDropActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/DragAndDropActivity.java"/>
     </issue>
 
     <issue
@@ -1286,7 +1286,7 @@
         errorLine1="    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {"
         errorLine2="                                                           ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/DragAndDropActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/DragAndDropActivity.java"/>
     </issue>
 
     <issue
@@ -1295,7 +1295,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/DrawerLayoutActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/DrawerLayoutActivity.java"/>
     </issue>
 
     <issue
@@ -1304,7 +1304,7 @@
         errorLine1="    protected void onPostCreate(Bundle savedInstanceState) {"
         errorLine2="                                ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/DrawerLayoutActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/DrawerLayoutActivity.java"/>
     </issue>
 
     <issue
@@ -1313,7 +1313,7 @@
         errorLine1="    public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                         ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/DrawerLayoutActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/DrawerLayoutActivity.java"/>
     </issue>
 
     <issue
@@ -1322,7 +1322,7 @@
         errorLine1="    public void onConfigurationChanged(Configuration newConfig) {"
         errorLine2="                                       ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/DrawerLayoutActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/DrawerLayoutActivity.java"/>
     </issue>
 
     <issue
@@ -1331,7 +1331,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/view/GridLayout1.java"/>
+            file="src/main/java/com/example/androidx/view/GridLayout1.java"/>
     </issue>
 
     <issue
@@ -1340,7 +1340,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/view/GridLayout2.java"/>
+            file="src/main/java/com/example/androidx/view/GridLayout2.java"/>
     </issue>
 
     <issue
@@ -1349,7 +1349,7 @@
         errorLine1="    public static View create(Context context) {"
         errorLine2="                  ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/view/GridLayout3.java"/>
+            file="src/main/java/com/example/androidx/view/GridLayout3.java"/>
     </issue>
 
     <issue
@@ -1358,7 +1358,7 @@
         errorLine1="    public static View create(Context context) {"
         errorLine2="                              ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/view/GridLayout3.java"/>
+            file="src/main/java/com/example/androidx/view/GridLayout3.java"/>
     </issue>
 
     <issue
@@ -1367,7 +1367,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/view/GridLayout3.java"/>
+            file="src/main/java/com/example/androidx/view/GridLayout3.java"/>
     </issue>
 
     <issue
@@ -1376,7 +1376,7 @@
         errorLine1="    protected GridLayoutManager createLayoutManager() {"
         errorLine2="              ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/GridLayoutManagerActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/GridLayoutManagerActivity.java"/>
     </issue>
 
     <issue
@@ -1385,7 +1385,7 @@
         errorLine1="    protected ConfigToggle[] createConfigToggles() {"
         errorLine2="              ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/GridLayoutManagerActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/GridLayoutManagerActivity.java"/>
     </issue>
 
     <issue
@@ -1394,7 +1394,7 @@
         errorLine1="    protected RecyclerView.Adapter createAdapter() {"
         errorLine2="              ~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/GridLayoutManagerActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/GridLayoutManagerActivity.java"/>
     </issue>
 
     <issue
@@ -1403,7 +1403,7 @@
         errorLine1="    public RecyclerView mRecyclerView;"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1412,7 +1412,7 @@
         errorLine1="    public ItemTouchAdapter mAdapter;"
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1421,7 +1421,7 @@
         errorLine1="    public ItemTouchHelper mItemTouchHelper;"
         errorLine2="           ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1430,7 +1430,7 @@
         errorLine1="    public ItemTouchHelper.Callback mCallback;"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1439,7 +1439,7 @@
         errorLine1="    public void onCreate(Bundle savedInstanceState) {"
         errorLine2="                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1448,7 +1448,7 @@
         errorLine1="    public ItemTouchHelper createItemTouchHelper() {"
         errorLine2="           ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1457,7 +1457,7 @@
         errorLine1="    public ItemTouchHelper.Callback createCallback() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1466,7 +1466,7 @@
         errorLine1="    public boolean onChildDraw(Canvas c, RecyclerView recyclerView,"
         errorLine2="                               ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1475,7 +1475,7 @@
         errorLine1="    public boolean onChildDraw(Canvas c, RecyclerView recyclerView,"
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1484,7 +1484,7 @@
         errorLine1="            RecyclerView.ViewHolder viewHolder,"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1493,7 +1493,7 @@
         errorLine1="    public boolean onChildDrawOver(Canvas c, RecyclerView recyclerView,"
         errorLine2="                                   ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1502,7 +1502,7 @@
         errorLine1="    public boolean onChildDrawOver(Canvas c, RecyclerView recyclerView,"
         errorLine2="                                             ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1511,7 +1511,7 @@
         errorLine1="            RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1520,7 +1520,7 @@
         errorLine1="    public void clearView(RecyclerView.ViewHolder viewHolder) {"
         errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1529,7 +1529,7 @@
         errorLine1="    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {"
         errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1538,7 +1538,7 @@
         errorLine1="    public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1547,7 +1547,7 @@
         errorLine1="    public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {"
         errorLine2="                                                  ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1556,7 +1556,7 @@
         errorLine1="    abstract public int getMovementFlags(RecyclerView recyclerView,"
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1565,7 +1565,7 @@
         errorLine1="            RecyclerView.ViewHolder viewHolder);"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1574,7 +1574,7 @@
         errorLine1="    public ItemTouchAdapter createAdapter() {"
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1583,7 +1583,7 @@
         errorLine1="    public void onBind(ItemTouchViewHolder viewHolder) {"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1592,7 +1592,7 @@
         errorLine1="    public void onCreateViewHolder(ItemTouchViewHolder viewHolder) {"
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1601,7 +1601,7 @@
         errorLine1="        public ItemTouchViewHolder(View itemView) {"
         errorLine2="                                   ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1610,7 +1610,7 @@
         errorLine1="        public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1619,7 +1619,7 @@
         errorLine1="        public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {"
         errorLine2="                                                      ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1628,7 +1628,7 @@
         errorLine1="        public void onBindViewHolder(ItemTouchViewHolder holder, int position) {"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java"/>
     </issue>
 
     <issue
@@ -1637,7 +1637,7 @@
         errorLine1="    protected LinearLayoutManager createLayoutManager() {"
         errorLine2="              ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/LinearLayoutManagerActivity.java"/>
     </issue>
 
     <issue
@@ -1646,7 +1646,7 @@
         errorLine1="    protected void onRecyclerViewInit(RecyclerView recyclerView) {"
         errorLine2="                                      ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/LinearLayoutManagerActivity.java"/>
     </issue>
 
     <issue
@@ -1655,7 +1655,7 @@
         errorLine1="    protected ConfigToggle[] createConfigToggles() {"
         errorLine2="              ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/LinearLayoutManagerActivity.java"/>
     </issue>
 
     <issue
@@ -1664,7 +1664,7 @@
         errorLine1="    protected RecyclerView.Adapter createAdapter() {"
         errorLine2="              ~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/LinearLayoutManagerJankActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/LinearLayoutManagerJankActivity.java"/>
     </issue>
 
     <issue
@@ -1673,7 +1673,7 @@
         errorLine1="    protected ConfigToggle[] createConfigToggles() {"
         errorLine2="              ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/LinearLayoutManagerJankActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/LinearLayoutManagerJankActivity.java"/>
     </issue>
 
     <issue
@@ -1682,7 +1682,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/ListPopupWindowActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/ListPopupWindowActivity.java"/>
     </issue>
 
     <issue
@@ -1691,7 +1691,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/ListViewActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/ListViewActivity.java"/>
     </issue>
 
     <issue
@@ -1700,7 +1700,7 @@
         errorLine1="    public LocalPlayer(Context context) {"
         errorLine2="                       ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1709,7 +1709,7 @@
         errorLine1="    public void connect(RouteInfo route) {"
         errorLine2="                        ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1718,7 +1718,7 @@
         errorLine1="    public void play(final PlaylistItem item) {"
         errorLine2="                           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1727,7 +1727,7 @@
         errorLine1="    public void seek(final PlaylistItem item) {"
         errorLine2="                           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1736,7 +1736,7 @@
         errorLine1="    public void getStatus(final PlaylistItem item, final boolean update) {"
         errorLine2="                                ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1745,7 +1745,7 @@
         errorLine1="    public void enqueue(final PlaylistItem item) {"
         errorLine2="                              ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1754,7 +1754,7 @@
         errorLine1="    public PlaylistItem remove(String iid) {"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1763,7 +1763,7 @@
         errorLine1="    public PlaylistItem remove(String iid) {"
         errorLine2="                               ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1772,7 +1772,7 @@
         errorLine1="    protected Context getContext() { return mContext; }"
         errorLine2="              ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1781,7 +1781,7 @@
         errorLine1="    protected MediaPlayer getMediaPlayer() { return mMediaPlayer; }"
         errorLine2="              ~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1790,7 +1790,7 @@
         errorLine1="    protected void setSurface(Surface surface) {"
         errorLine2="                              ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1799,7 +1799,7 @@
         errorLine1="    protected void setSurface(SurfaceHolder surfaceHolder) {"
         errorLine2="                              ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1808,7 +1808,7 @@
         errorLine1="    protected void removeSurface(SurfaceHolder surfaceHolder) {"
         errorLine2="                                 ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1817,7 +1817,7 @@
         errorLine1="        public SurfaceViewPlayer(Context context) {"
         errorLine2="                                 ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1826,7 +1826,7 @@
         errorLine1="        public void connect(RouteInfo route) {"
         errorLine2="                            ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1835,7 +1835,7 @@
         errorLine1="        public void surfaceChanged(SurfaceHolder holder, int format,"
         errorLine2="                                   ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1844,7 +1844,7 @@
         errorLine1="        public void surfaceCreated(SurfaceHolder holder) {"
         errorLine2="                                   ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1853,7 +1853,7 @@
         errorLine1="        public void surfaceDestroyed(SurfaceHolder holder) {"
         errorLine2="                                     ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1862,7 +1862,7 @@
         errorLine1="        public OverlayPlayer(Context context) {"
         errorLine2="                             ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1871,7 +1871,7 @@
         errorLine1="        public void connect(RouteInfo route) {"
         errorLine2="                            ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1880,7 +1880,7 @@
         errorLine1="        public void onWindowCreated(Surface surface) {"
         errorLine2="                                    ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1889,7 +1889,7 @@
         errorLine1="        public void onWindowCreated(SurfaceHolder surfaceHolder) {"
         errorLine2="                                    ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1898,7 +1898,7 @@
         errorLine1="        public Bitmap getSnapshot() {"
         errorLine2="               ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"/>
+            file="src/main/java/com/example/androidx/media/LocalPlayer.java"/>
     </issue>
 
     <issue
@@ -1907,7 +1907,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/MenuItemIconTinting.java"/>
+            file="src/main/java/com/example/androidx/app/MenuItemIconTinting.java"/>
     </issue>
 
     <issue
@@ -1916,7 +1916,7 @@
         errorLine1="    public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                         ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/MenuItemIconTinting.java"/>
+            file="src/main/java/com/example/androidx/app/MenuItemIconTinting.java"/>
     </issue>
 
     <issue
@@ -1925,7 +1925,7 @@
         errorLine1="    public void draw(Canvas canvas) {"
         errorLine2="                     ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/drawable/MyDrawable.java"/>
+            file="src/main/java/com/example/androidx/drawable/MyDrawable.java"/>
     </issue>
 
     <issue
@@ -1934,7 +1934,7 @@
         errorLine1="    public void setColorFilter(ColorFilter colorFilter) {"
         errorLine2="                               ~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/drawable/MyDrawable.java"/>
+            file="src/main/java/com/example/androidx/drawable/MyDrawable.java"/>
     </issue>
 
     <issue
@@ -1943,7 +1943,7 @@
         errorLine1="    public MyMediaRouteControllerDialog(Context context) {"
         errorLine2="                                        ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java"/>
+            file="src/main/java/com/example/androidx/media/MyMediaRouteControllerDialog.java"/>
     </issue>
 
     <issue
@@ -1952,7 +1952,7 @@
         errorLine1="    public View onCreateMediaControlView(Bundle savedInstanceState) {"
         errorLine2="           ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java"/>
+            file="src/main/java/com/example/androidx/media/MyMediaRouteControllerDialog.java"/>
     </issue>
 
     <issue
@@ -1961,7 +1961,7 @@
         errorLine1="    public View onCreateMediaControlView(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java"/>
+            file="src/main/java/com/example/androidx/media/MyMediaRouteControllerDialog.java"/>
     </issue>
 
     <issue
@@ -1970,7 +1970,7 @@
         errorLine1="    protected LinearLayoutManager createLayoutManager() {"
         errorLine2="              ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/NestedRecyclerViewActivity.java"/>
     </issue>
 
     <issue
@@ -1979,7 +1979,7 @@
         errorLine1="    protected void onRecyclerViewInit(RecyclerView recyclerView) {"
         errorLine2="                                      ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/NestedRecyclerViewActivity.java"/>
     </issue>
 
     <issue
@@ -1988,7 +1988,7 @@
         errorLine1="    protected ConfigToggle[] createConfigToggles() {"
         errorLine2="              ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/NestedRecyclerViewActivity.java"/>
     </issue>
 
     <issue
@@ -1997,7 +1997,7 @@
         errorLine1="            public ViewHolder(TextView itemView) {"
         errorLine2="                              ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/NestedRecyclerViewActivity.java"/>
     </issue>
 
     <issue
@@ -2006,7 +2006,7 @@
         errorLine1="            public ViewHolder(RecyclerView itemView) {"
         errorLine2="                              ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/NestedRecyclerViewActivity.java"/>
     </issue>
 
     <issue
@@ -2015,7 +2015,7 @@
         errorLine1="    protected RecyclerView.Adapter createAdapter() {"
         errorLine2="              ~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/NestedRecyclerViewActivity.java"/>
     </issue>
 
     <issue
@@ -2024,7 +2024,7 @@
         errorLine1="    protected OverlayWindowListener mListener;"
         errorLine2="              ~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java"/>
+            file="src/main/java/com/example/androidx/media/OverlayDisplayWindow.java"/>
     </issue>
 
     <issue
@@ -2033,7 +2033,7 @@
         errorLine1="    protected OverlayDisplayWindow(Context context, String name,"
         errorLine2="                                   ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java"/>
+            file="src/main/java/com/example/androidx/media/OverlayDisplayWindow.java"/>
     </issue>
 
     <issue
@@ -2042,7 +2042,7 @@
         errorLine1="    protected OverlayDisplayWindow(Context context, String name,"
         errorLine2="                                                    ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java"/>
+            file="src/main/java/com/example/androidx/media/OverlayDisplayWindow.java"/>
     </issue>
 
     <issue
@@ -2051,7 +2051,7 @@
         errorLine1="    public static OverlayDisplayWindow create(Context context, String name,"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java"/>
+            file="src/main/java/com/example/androidx/media/OverlayDisplayWindow.java"/>
     </issue>
 
     <issue
@@ -2060,7 +2060,7 @@
         errorLine1="    public static OverlayDisplayWindow create(Context context, String name,"
         errorLine2="                                              ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java"/>
+            file="src/main/java/com/example/androidx/media/OverlayDisplayWindow.java"/>
     </issue>
 
     <issue
@@ -2069,7 +2069,7 @@
         errorLine1="    public static OverlayDisplayWindow create(Context context, String name,"
         errorLine2="                                                               ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java"/>
+            file="src/main/java/com/example/androidx/media/OverlayDisplayWindow.java"/>
     </issue>
 
     <issue
@@ -2078,7 +2078,7 @@
         errorLine1="    public void setOverlayWindowListener(OverlayWindowListener listener) {"
         errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java"/>
+            file="src/main/java/com/example/androidx/media/OverlayDisplayWindow.java"/>
     </issue>
 
     <issue
@@ -2087,7 +2087,7 @@
         errorLine1="    public Context getContext() {"
         errorLine2="           ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java"/>
+            file="src/main/java/com/example/androidx/media/OverlayDisplayWindow.java"/>
     </issue>
 
     <issue
@@ -2096,7 +2096,7 @@
         errorLine1="    public abstract Bitmap getSnapshot();"
         errorLine2="                    ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java"/>
+            file="src/main/java/com/example/androidx/media/OverlayDisplayWindow.java"/>
     </issue>
 
     <issue
@@ -2105,7 +2105,7 @@
         errorLine1="        void onWindowCreated(Surface surface);"
         errorLine2="                             ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java"/>
+            file="src/main/java/com/example/androidx/media/OverlayDisplayWindow.java"/>
     </issue>
 
     <issue
@@ -2114,7 +2114,7 @@
         errorLine1="        void onWindowCreated(SurfaceHolder surfaceHolder);"
         errorLine2="                             ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java"/>
+            file="src/main/java/com/example/androidx/media/OverlayDisplayWindow.java"/>
     </issue>
 
     <issue
@@ -2123,7 +2123,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/PagerRecyclerViewActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/PagerRecyclerViewActivity.java"/>
     </issue>
 
     <issue
@@ -2132,7 +2132,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java"/>
+            file="src/main/java/com/example/androidx/graphics/PaletteActivity.java"/>
     </issue>
 
     <issue
@@ -2141,7 +2141,7 @@
         errorLine1="        public void onCreate(Bundle savedInstanceState) {"
         errorLine2="                             ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java"/>
+            file="src/main/java/com/example/androidx/graphics/PaletteActivity.java"/>
     </issue>
 
     <issue
@@ -2150,7 +2150,7 @@
         errorLine1="        public void onViewCreated(View view, Bundle savedInstanceState) {"
         errorLine2="                                  ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java"/>
+            file="src/main/java/com/example/androidx/graphics/PaletteActivity.java"/>
     </issue>
 
     <issue
@@ -2159,7 +2159,7 @@
         errorLine1="        public void onViewCreated(View view, Bundle savedInstanceState) {"
         errorLine2="                                             ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java"/>
+            file="src/main/java/com/example/androidx/graphics/PaletteActivity.java"/>
     </issue>
 
     <issue
@@ -2168,7 +2168,7 @@
         errorLine1="        public void onActivityCreated(Bundle savedInstanceState) {"
         errorLine2="                                      ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java"/>
+            file="src/main/java/com/example/androidx/graphics/PaletteActivity.java"/>
     </issue>
 
     <issue
@@ -2177,7 +2177,7 @@
         errorLine1="        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {"
         errorLine2="                                        ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java"/>
+            file="src/main/java/com/example/androidx/graphics/PaletteActivity.java"/>
     </issue>
 
     <issue
@@ -2186,7 +2186,7 @@
         errorLine1="        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {"
         errorLine2="                                                   ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java"/>
+            file="src/main/java/com/example/androidx/graphics/PaletteActivity.java"/>
     </issue>
 
     <issue
@@ -2195,7 +2195,7 @@
         errorLine1="        public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                             ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java"/>
+            file="src/main/java/com/example/androidx/graphics/PaletteActivity.java"/>
     </issue>
 
     <issue
@@ -2204,7 +2204,7 @@
         errorLine1="        public void onListItemClick(ListView l, View v, int position, long id) {"
         errorLine2="                                    ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java"/>
+            file="src/main/java/com/example/androidx/graphics/PaletteActivity.java"/>
     </issue>
 
     <issue
@@ -2213,7 +2213,7 @@
         errorLine1="        public void onListItemClick(ListView l, View v, int position, long id) {"
         errorLine2="                                                ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java"/>
+            file="src/main/java/com/example/androidx/graphics/PaletteActivity.java"/>
     </issue>
 
     <issue
@@ -2222,7 +2222,7 @@
         errorLine1="        public Loader&lt;Cursor> onCreateLoader(int id, Bundle bundle) {"
         errorLine2="                                                     ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java"/>
+            file="src/main/java/com/example/androidx/graphics/PaletteActivity.java"/>
     </issue>
 
     <issue
@@ -2231,7 +2231,7 @@
         errorLine1="        public void onLoadFinished(@NonNull Loader&lt;Cursor> cursorLoader, Cursor cursor) {"
         errorLine2="                                                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java"/>
+            file="src/main/java/com/example/androidx/graphics/PaletteActivity.java"/>
     </issue>
 
     <issue
@@ -2240,7 +2240,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/graphics/PaletteDetailActivity.java"/>
+            file="src/main/java/com/example/androidx/graphics/PaletteDetailActivity.java"/>
     </issue>
 
     <issue
@@ -2249,7 +2249,7 @@
         errorLine1="    public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                         ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/graphics/PaletteDetailActivity.java"/>
+            file="src/main/java/com/example/androidx/graphics/PaletteDetailActivity.java"/>
     </issue>
 
     <issue
@@ -2258,7 +2258,7 @@
         errorLine1="    protected Context mContext;"
         errorLine2="              ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2267,7 +2267,7 @@
         errorLine1="    protected Callback mCallback;"
         errorLine2="              ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2276,7 +2276,7 @@
         errorLine1="    protected MediaSessionCompat mMediaSession;"
         errorLine2="              ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2285,7 +2285,7 @@
         errorLine1="    protected String mNotificationChannelId;"
         errorLine2="              ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2294,7 +2294,7 @@
         errorLine1="    public abstract void connect(RouteInfo route);"
         errorLine2="                                 ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2303,7 +2303,7 @@
         errorLine1="    public abstract void play(final PlaylistItem item);"
         errorLine2="                                    ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2312,7 +2312,7 @@
         errorLine1="    public abstract void seek(final PlaylistItem item);"
         errorLine2="                                    ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2321,7 +2321,7 @@
         errorLine1="    public abstract void getStatus(final PlaylistItem item, final boolean update);"
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2330,7 +2330,7 @@
         errorLine1="    public abstract void enqueue(final PlaylistItem item);"
         errorLine2="                                       ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2339,7 +2339,7 @@
         errorLine1="    public abstract PlaylistItem remove(String iid);"
         errorLine2="                    ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2348,7 +2348,7 @@
         errorLine1="    public abstract PlaylistItem remove(String iid);"
         errorLine2="                                        ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2357,7 +2357,7 @@
         errorLine1="    public Bitmap getSnapshot() { return null; }"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2366,7 +2366,7 @@
         errorLine1="    public void setCallback(Callback callback) {"
         errorLine2="                            ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2375,7 +2375,7 @@
         errorLine1="    public static Player create(Context context, RouteInfo route, MediaSessionCompat session) {"
         errorLine2="                  ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2384,7 +2384,7 @@
         errorLine1="    public static Player create(Context context, RouteInfo route, MediaSessionCompat session) {"
         errorLine2="                                ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2393,7 +2393,7 @@
         errorLine1="    public static Player create(Context context, RouteInfo route, MediaSessionCompat session) {"
         errorLine2="                                                 ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2402,7 +2402,7 @@
         errorLine1="    public static Player create(Context context, RouteInfo route, MediaSessionCompat session) {"
         errorLine2="                                                                  ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2411,7 +2411,7 @@
         errorLine1="    protected void updateMetadata(PlaylistItem currentItem) {"
         errorLine2="                                  ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"/>
+            file="src/main/java/com/example/androidx/media/Player.java"/>
     </issue>
 
     <issue
@@ -2420,7 +2420,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/PopupMenuActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/PopupMenuActivity.java"/>
     </issue>
 
     <issue
@@ -2429,7 +2429,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/RecyclerViewActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/RecyclerViewActivity.java"/>
     </issue>
 
     <issue
@@ -2438,7 +2438,7 @@
         errorLine1="    public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                         ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/RecyclerViewActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/RecyclerViewActivity.java"/>
     </issue>
 
     <issue
@@ -2447,7 +2447,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/RecyclerViewSmoothScrollByActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/RecyclerViewSmoothScrollByActivity.java"/>
     </issue>
 
     <issue
@@ -2456,7 +2456,7 @@
         errorLine1="    public RemotePlayer(Context context) {"
         errorLine2="                        ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/RemotePlayer.java"/>
+            file="src/main/java/com/example/androidx/media/RemotePlayer.java"/>
     </issue>
 
     <issue
@@ -2465,7 +2465,7 @@
         errorLine1="    public void connect(RouteInfo route) {"
         errorLine2="                        ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/RemotePlayer.java"/>
+            file="src/main/java/com/example/androidx/media/RemotePlayer.java"/>
     </issue>
 
     <issue
@@ -2474,7 +2474,7 @@
         errorLine1="    public void play(final PlaylistItem item) {"
         errorLine2="                           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/RemotePlayer.java"/>
+            file="src/main/java/com/example/androidx/media/RemotePlayer.java"/>
     </issue>
 
     <issue
@@ -2483,7 +2483,7 @@
         errorLine1="    public void seek(final PlaylistItem item) {"
         errorLine2="                           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/RemotePlayer.java"/>
+            file="src/main/java/com/example/androidx/media/RemotePlayer.java"/>
     </issue>
 
     <issue
@@ -2492,7 +2492,7 @@
         errorLine1="    public void getStatus(final PlaylistItem item, final boolean update) {"
         errorLine2="                                ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/RemotePlayer.java"/>
+            file="src/main/java/com/example/androidx/media/RemotePlayer.java"/>
     </issue>
 
     <issue
@@ -2501,7 +2501,7 @@
         errorLine1="    public void enqueue(final PlaylistItem item) {"
         errorLine2="                              ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/RemotePlayer.java"/>
+            file="src/main/java/com/example/androidx/media/RemotePlayer.java"/>
     </issue>
 
     <issue
@@ -2510,7 +2510,7 @@
         errorLine1="    public PlaylistItem remove(String itemId) {"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/RemotePlayer.java"/>
+            file="src/main/java/com/example/androidx/media/RemotePlayer.java"/>
     </issue>
 
     <issue
@@ -2519,7 +2519,7 @@
         errorLine1="    public PlaylistItem remove(String itemId) {"
         errorLine2="                               ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/RemotePlayer.java"/>
+            file="src/main/java/com/example/androidx/media/RemotePlayer.java"/>
     </issue>
 
     <issue
@@ -2528,7 +2528,7 @@
         errorLine1="    public Bitmap getSnapshot() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/RemotePlayer.java"/>
+            file="src/main/java/com/example/androidx/media/RemotePlayer.java"/>
     </issue>
 
     <issue
@@ -2537,7 +2537,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/RvIn2NestedScrollViewsActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/RvIn2NestedScrollViewsActivity.java"/>
     </issue>
 
     <issue
@@ -2546,7 +2546,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/RvInNestedScrollViewActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/RvInNestedScrollViewActivity.java"/>
     </issue>
 
     <issue
@@ -2555,7 +2555,7 @@
         errorLine1="    public MediaRouteProvider onCreateMediaRouteProvider() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrpService.java"/>
+            file="src/main/java/com/example/androidx/media/SampleDynamicGroupMrpService.java"/>
     </issue>
 
     <issue
@@ -2564,7 +2564,7 @@
         errorLine1="    public static void setActivity(SampleMediaRouterActivity activity) {"
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SampleMediaButtonReceiver.java"/>
+            file="src/main/java/com/example/androidx/media/SampleMediaButtonReceiver.java"/>
     </issue>
 
     <issue
@@ -2573,7 +2573,7 @@
         errorLine1="    public MediaRouteProvider onCreateMediaRouteProvider() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SampleMediaRouteProviderService.java"/>
+            file="src/main/java/com/example/androidx/media/SampleMediaRouteProviderService.java"/>
     </issue>
 
     <issue
@@ -2582,7 +2582,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/SearchActivity.java"/>
+            file="src/main/java/com/example/androidx/app/SearchActivity.java"/>
     </issue>
 
     <issue
@@ -2591,7 +2591,7 @@
         errorLine1="    public SessionManager(String name) {"
         errorLine2="                          ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2600,7 +2600,7 @@
         errorLine1="    public String getSessionId() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2609,7 +2609,7 @@
         errorLine1="    public PlaylistItem getCurrentItem() {"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2618,7 +2618,7 @@
         errorLine1="    public List&lt;PlaylistItem> getPlaylist() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2627,7 +2627,7 @@
         errorLine1="    public PlaylistItem add(String title, Uri uri, String mime) {"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2636,7 +2636,7 @@
         errorLine1="    public PlaylistItem add(String title, Uri uri, String mime) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2645,7 +2645,7 @@
         errorLine1="    public PlaylistItem add(String title, Uri uri, String mime) {"
         errorLine2="                                          ~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2654,7 +2654,7 @@
         errorLine1="    public PlaylistItem add(String title, Uri uri, String mime) {"
         errorLine2="                                                   ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2663,7 +2663,7 @@
         errorLine1="    public PlaylistItem add(String title, Uri uri, String mime, long startPosition,"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2672,7 +2672,7 @@
         errorLine1="    public PlaylistItem add(String title, Uri uri, String mime, long startPosition,"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2681,7 +2681,7 @@
         errorLine1="    public PlaylistItem add(String title, Uri uri, String mime, long startPosition,"
         errorLine2="                                          ~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2690,7 +2690,7 @@
         errorLine1="    public PlaylistItem add(String title, Uri uri, String mime, long startPosition,"
         errorLine2="                                                   ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2699,7 +2699,7 @@
         errorLine1="            PendingIntent receiver) {"
         errorLine2="            ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2708,7 +2708,7 @@
         errorLine1="    public PlaylistItem remove(String iid) {"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2717,7 +2717,7 @@
         errorLine1="    public PlaylistItem remove(String iid) {"
         errorLine2="                               ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2726,7 +2726,7 @@
         errorLine1="    public PlaylistItem seek(String iid, long pos) {"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2735,7 +2735,7 @@
         errorLine1="    public PlaylistItem seek(String iid, long pos) {"
         errorLine2="                             ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2744,7 +2744,7 @@
         errorLine1="    public PlaylistItem getStatus(String iid) {"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2753,7 +2753,7 @@
         errorLine1="    public PlaylistItem getStatus(String iid) {"
         errorLine2="                                  ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2762,7 +2762,7 @@
         errorLine1="    public String startSession() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2771,7 +2771,7 @@
         errorLine1="    public void setPlayer(Player player) {"
         errorLine2="                          ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2780,7 +2780,7 @@
         errorLine1="    public void setCallback(Callback callback) {"
         errorLine2="                            ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2789,7 +2789,7 @@
         errorLine1="        void onItemChanged(PlaylistItem item);"
         errorLine2="                           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/media/SessionManager.java"/>
+            file="src/main/java/com/example/androidx/media/SessionManager.java"/>
     </issue>
 
     <issue
@@ -2798,7 +2798,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/selection/simple/SimpleSelectionDemoActivity.java"/>
     </issue>
 
     <issue
@@ -2807,7 +2807,7 @@
         errorLine1="        public String mBoundString;"
         errorLine2="               ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java"/>
+            file="src/main/java/com/example/androidx/widget/adapter/SimpleStringAdapter.java"/>
     </issue>
 
     <issue
@@ -2816,7 +2816,7 @@
         errorLine1="        public TextView mTextView;"
         errorLine2="               ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java"/>
+            file="src/main/java/com/example/androidx/widget/adapter/SimpleStringAdapter.java"/>
     </issue>
 
     <issue
@@ -2825,7 +2825,7 @@
         errorLine1="        public ViewHolder(TextView v) {"
         errorLine2="                          ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java"/>
+            file="src/main/java/com/example/androidx/widget/adapter/SimpleStringAdapter.java"/>
     </issue>
 
     <issue
@@ -2834,7 +2834,7 @@
         errorLine1="    public String getValueAt(int position) {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java"/>
+            file="src/main/java/com/example/androidx/widget/adapter/SimpleStringAdapter.java"/>
     </issue>
 
     <issue
@@ -2843,7 +2843,7 @@
         errorLine1="    public SimpleStringAdapter(Context context, String[] strings) {"
         errorLine2="                               ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java"/>
+            file="src/main/java/com/example/androidx/widget/adapter/SimpleStringAdapter.java"/>
     </issue>
 
     <issue
@@ -2852,7 +2852,7 @@
         errorLine1="    public SimpleStringAdapter(Context context, String[] strings) {"
         errorLine2="                                                ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java"/>
+            file="src/main/java/com/example/androidx/widget/adapter/SimpleStringAdapter.java"/>
     </issue>
 
     <issue
@@ -2861,7 +2861,7 @@
         errorLine1="    public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java"/>
+            file="src/main/java/com/example/androidx/widget/adapter/SimpleStringAdapter.java"/>
     </issue>
 
     <issue
@@ -2870,7 +2870,7 @@
         errorLine1="    public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {"
         errorLine2="                                                             ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java"/>
+            file="src/main/java/com/example/androidx/widget/adapter/SimpleStringAdapter.java"/>
     </issue>
 
     <issue
@@ -2879,7 +2879,7 @@
         errorLine1="    public void onBindViewHolder(ViewHolder holder, int position) {"
         errorLine2="                                 ~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java"/>
+            file="src/main/java/com/example/androidx/widget/adapter/SimpleStringAdapter.java"/>
     </issue>
 
     <issue
@@ -2888,7 +2888,7 @@
         errorLine1="    public RecyclerView.LayoutParams getLayoutParams() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java"/>
+            file="src/main/java/com/example/androidx/widget/adapter/SimpleStringAdapter.java"/>
     </issue>
 
     <issue
@@ -2897,7 +2897,7 @@
         errorLine1="    public List&lt;String> getValues() {"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java"/>
+            file="src/main/java/com/example/androidx/widget/adapter/SimpleStringAdapter.java"/>
     </issue>
 
     <issue
@@ -2906,7 +2906,7 @@
         errorLine1="    public void setValues(List&lt;String> values) {"
         errorLine2="                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java"/>
+            file="src/main/java/com/example/androidx/widget/adapter/SimpleStringAdapter.java"/>
     </issue>
 
     <issue
@@ -2915,7 +2915,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/selection/single/SingleStableIdSelectionDemoActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/selection/single/SingleStableIdSelectionDemoActivity.java"/>
     </issue>
 
     <issue
@@ -2924,7 +2924,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/util/SortedListActivity.java"/>
+            file="src/main/java/com/example/androidx/util/SortedListActivity.java"/>
     </issue>
 
     <issue
@@ -2933,7 +2933,7 @@
         errorLine1="    protected LinearLayoutManager createLayoutManager() {"
         errorLine2="              ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/StableIdActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/StableIdActivity.java"/>
     </issue>
 
     <issue
@@ -2942,7 +2942,7 @@
         errorLine1="    protected RecyclerView.Adapter createAdapter() {"
         errorLine2="              ~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/StableIdActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/StableIdActivity.java"/>
     </issue>
 
     <issue
@@ -2951,7 +2951,7 @@
         errorLine1="    protected void onRecyclerViewInit(RecyclerView recyclerView) {"
         errorLine2="                                      ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/StableIdActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/StableIdActivity.java"/>
     </issue>
 
     <issue
@@ -2960,7 +2960,7 @@
         errorLine1="            public ViewHolder(View itemView) {"
         errorLine2="                              ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/StableIdActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/StableIdActivity.java"/>
     </issue>
 
     <issue
@@ -2969,7 +2969,7 @@
         errorLine1="    protected StaggeredGridLayoutManager createLayoutManager() {"
         errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/StaggeredGridLayoutManagerActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/StaggeredGridLayoutManagerActivity.java"/>
     </issue>
 
     <issue
@@ -2978,7 +2978,7 @@
         errorLine1="    protected ConfigToggle[] createConfigToggles() {"
         errorLine2="              ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/StaggeredGridLayoutManagerActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/StaggeredGridLayoutManagerActivity.java"/>
     </issue>
 
     <issue
@@ -2987,7 +2987,7 @@
         errorLine1="    public void onCreate(Bundle savedInstanceState) {"
         errorLine2="                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/Support7Demos.java"/>
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
     </issue>
 
     <issue
@@ -2996,7 +2996,7 @@
         errorLine1="    protected List&lt;Map&lt;String, Object>> getData(String prefix) {"
         errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/Support7Demos.java"/>
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
     </issue>
 
     <issue
@@ -3005,7 +3005,7 @@
         errorLine1="    protected List&lt;Map&lt;String, Object>> getData(String prefix) {"
         errorLine2="                                                ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/Support7Demos.java"/>
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
     </issue>
 
     <issue
@@ -3014,7 +3014,7 @@
         errorLine1="    protected Intent activityIntent(String pkg, String componentName) {"
         errorLine2="              ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/Support7Demos.java"/>
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
     </issue>
 
     <issue
@@ -3023,7 +3023,7 @@
         errorLine1="    protected Intent activityIntent(String pkg, String componentName) {"
         errorLine2="                                    ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/Support7Demos.java"/>
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
     </issue>
 
     <issue
@@ -3032,7 +3032,7 @@
         errorLine1="    protected Intent activityIntent(String pkg, String componentName) {"
         errorLine2="                                                ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/Support7Demos.java"/>
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
     </issue>
 
     <issue
@@ -3041,7 +3041,7 @@
         errorLine1="    protected Intent browseIntent(String path) {"
         errorLine2="              ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/Support7Demos.java"/>
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
     </issue>
 
     <issue
@@ -3050,7 +3050,7 @@
         errorLine1="    protected Intent browseIntent(String path) {"
         errorLine2="                                  ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/Support7Demos.java"/>
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
     </issue>
 
     <issue
@@ -3059,7 +3059,7 @@
         errorLine1="    protected void addItem(List&lt;Map&lt;String, Object>> data, String name, Intent intent) {"
         errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/Support7Demos.java"/>
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
     </issue>
 
     <issue
@@ -3068,7 +3068,7 @@
         errorLine1="    protected void addItem(List&lt;Map&lt;String, Object>> data, String name, Intent intent) {"
         errorLine2="                                                           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/Support7Demos.java"/>
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
     </issue>
 
     <issue
@@ -3077,7 +3077,7 @@
         errorLine1="    protected void addItem(List&lt;Map&lt;String, Object>> data, String name, Intent intent) {"
         errorLine2="                                                                        ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/Support7Demos.java"/>
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
     </issue>
 
     <issue
@@ -3086,7 +3086,7 @@
         errorLine1="    public void onBind(ItemTouchViewHolder viewHolder) {"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/SwipeToDismissActivity.java"/>
     </issue>
 
     <issue
@@ -3095,7 +3095,7 @@
         errorLine1="    public void clearView(RecyclerView.ViewHolder viewHolder) {"
         errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/SwipeToDismissActivity.java"/>
     </issue>
 
     <issue
@@ -3104,7 +3104,7 @@
         errorLine1="    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {"
         errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/SwipeToDismissActivity.java"/>
     </issue>
 
     <issue
@@ -3113,7 +3113,7 @@
         errorLine1="    public boolean onChildDraw(Canvas c, RecyclerView recyclerView,"
         errorLine2="                               ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/SwipeToDismissActivity.java"/>
     </issue>
 
     <issue
@@ -3122,7 +3122,7 @@
         errorLine1="    public boolean onChildDraw(Canvas c, RecyclerView recyclerView,"
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/SwipeToDismissActivity.java"/>
     </issue>
 
     <issue
@@ -3131,7 +3131,7 @@
         errorLine1="            RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/SwipeToDismissActivity.java"/>
     </issue>
 
     <issue
@@ -3140,7 +3140,7 @@
         errorLine1="    public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/SwipeToDismissActivity.java"/>
     </issue>
 
     <issue
@@ -3149,7 +3149,7 @@
         errorLine1="    public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {"
         errorLine2="                                                  ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/SwipeToDismissActivity.java"/>
     </issue>
 
     <issue
@@ -3158,7 +3158,7 @@
         errorLine1="    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {"
         errorLine2="                                ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/SwipeToDismissActivity.java"/>
     </issue>
 
     <issue
@@ -3167,7 +3167,7 @@
         errorLine1="    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {"
         errorLine2="                                                           ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java"/>
+            file="src/main/java/com/example/androidx/widget/touch/SwipeToDismissActivity.java"/>
     </issue>
 
     <issue
@@ -3176,7 +3176,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarActionMode.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarActionMode.java"/>
     </issue>
 
     <issue
@@ -3185,7 +3185,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarBackgroundChange.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarBackgroundChange.java"/>
     </issue>
 
     <issue
@@ -3194,7 +3194,7 @@
         errorLine1="    public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                         ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarBackgroundChange.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarBackgroundChange.java"/>
     </issue>
 
     <issue
@@ -3203,7 +3203,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarDisplayOptions.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarDisplayOptions.java"/>
     </issue>
 
     <issue
@@ -3212,7 +3212,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java"/>
     </issue>
 
     <issue
@@ -3221,7 +3221,7 @@
         errorLine1="        public void onCreate(Bundle savedInstanceState) {"
         errorLine2="                             ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java"/>
     </issue>
 
     <issue
@@ -3230,7 +3230,7 @@
         errorLine1="        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {"
         errorLine2="                                        ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java"/>
     </issue>
 
     <issue
@@ -3239,7 +3239,7 @@
         errorLine1="        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {"
         errorLine2="                                                   ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java"/>
     </issue>
 
     <issue
@@ -3248,7 +3248,7 @@
         errorLine1="        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,"
         errorLine2="               ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java"/>
     </issue>
 
     <issue
@@ -3257,7 +3257,7 @@
         errorLine1="        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,"
         errorLine2="                                 ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java"/>
     </issue>
 
     <issue
@@ -3266,7 +3266,7 @@
         errorLine1="        public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                             ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java"/>
     </issue>
 
     <issue
@@ -3275,7 +3275,7 @@
         errorLine1="        public void onCreate(Bundle savedInstanceState) {"
         errorLine2="                             ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java"/>
     </issue>
 
     <issue
@@ -3284,7 +3284,7 @@
         errorLine1="        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {"
         errorLine2="                                        ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java"/>
     </issue>
 
     <issue
@@ -3293,7 +3293,7 @@
         errorLine1="        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {"
         errorLine2="                                                   ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java"/>
     </issue>
 
     <issue
@@ -3302,7 +3302,7 @@
         errorLine1="        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,"
         errorLine2="               ~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java"/>
     </issue>
 
     <issue
@@ -3311,7 +3311,7 @@
         errorLine1="        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,"
         errorLine2="                                 ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java"/>
     </issue>
 
     <issue
@@ -3320,7 +3320,7 @@
         errorLine1="        public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                             ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java"/>
     </issue>
 
     <issue
@@ -3329,7 +3329,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarTall.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarTall.java"/>
     </issue>
 
     <issue
@@ -3338,7 +3338,7 @@
         errorLine1="    public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                         ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarTall.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarTall.java"/>
     </issue>
 
     <issue
@@ -3347,7 +3347,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarUsage.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarUsage.java"/>
     </issue>
 
     <issue
@@ -3356,7 +3356,7 @@
         errorLine1="    public boolean onOptionsItemSelected(MenuItem item) {"
         errorLine2="                                         ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/supportv7/app/ToolbarUsage.java"/>
+            file="src/main/java/com/example/androidx/app/ToolbarUsage.java"/>
     </issue>
 
 </issues>
diff --git a/samples/Support7Demos/src/main/AndroidManifest.xml b/samples/AndroidXDemos/src/main/AndroidManifest.xml
similarity index 83%
rename from samples/Support7Demos/src/main/AndroidManifest.xml
rename to samples/AndroidXDemos/src/main/AndroidManifest.xml
index c01ea87..394fac1 100644
--- a/samples/Support7Demos/src/main/AndroidManifest.xml
+++ b/samples/AndroidXDemos/src/main/AndroidManifest.xml
@@ -30,7 +30,7 @@
         android:supportsRtl="true">
 
         <activity
-            android:name="Support7Demos"
+            android:name=".AndroidXDemos"
             android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -47,7 +47,7 @@
             android:theme="@style/Theme.SampleMediaRouter">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
         <!-- MediaRouter Support Samples -->
@@ -60,7 +60,7 @@
             android:theme="@style/Theme.SampleMediaRouter.Light">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -72,7 +72,7 @@
             android:theme="@style/Theme.SampleMediaRouter.Light.DarkActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -84,7 +84,7 @@
             android:theme="@style/Theme.SampleMediaRouter">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -96,7 +96,7 @@
             android:theme="@style/Theme.SampleMediaRouter">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -108,7 +108,7 @@
             android:theme="@style/Theme.SampleMediaRouter">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -128,7 +128,7 @@
             android:label="@string/grid_layout_1">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -138,7 +138,7 @@
             android:label="@string/grid_layout_2">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -148,7 +148,7 @@
             android:label="@string/grid_layout_3">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -160,7 +160,7 @@
             android:theme="@style/Theme.AppCompat.NoActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -173,7 +173,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -197,7 +197,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -208,7 +208,7 @@
             android:theme="@style/Theme.AppCompat.Light">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -221,7 +221,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -232,7 +232,7 @@
             android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -243,7 +243,7 @@
             android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -254,7 +254,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -265,7 +265,7 @@
             android:theme="@style/Theme.Custom.WithActionMode">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -276,7 +276,7 @@
             android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -287,7 +287,7 @@
             android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -298,7 +298,7 @@
             android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -309,7 +309,7 @@
             android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -320,7 +320,7 @@
             android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -331,7 +331,7 @@
             android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -342,7 +342,7 @@
             android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -353,7 +353,7 @@
             android:theme="@style/Theme.Custom.TextLink">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -364,7 +364,7 @@
             android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -375,7 +375,7 @@
             android:theme="@style/Theme.Custom.NoActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -386,7 +386,7 @@
             android:theme="@style/Theme.Custom.NoActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
 
             <meta-data
@@ -401,7 +401,7 @@
             android:theme="@style/Theme.AppCompat.Light.NoActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -412,7 +412,7 @@
             android:theme="@style/Theme.AppCompat.Light.NoActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -423,7 +423,7 @@
             android:theme="@style/Theme.Custom.NoActionBar.WithActionMode">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -434,7 +434,7 @@
             android:theme="@style/Theme.AppCompat.Light.NoActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
 
             <meta-data
@@ -449,7 +449,7 @@
             android:theme="@style/Theme.Custom.NoActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -460,7 +460,7 @@
             android:theme="@style/Theme.AppCompat.Light">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -471,7 +471,7 @@
             android:theme="@style/Theme.AppCompat.Light">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -482,7 +482,7 @@
             android:theme="@style/Theme.AppCompat.Light">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -493,7 +493,7 @@
             android:theme="@style/Theme.AppCompat.DayNight">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -504,7 +504,7 @@
             android:theme="@style/Theme.AppCompat.DayNight">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -515,7 +515,7 @@
             android:theme="@style/Theme.AppCompat.DayNight">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -527,7 +527,7 @@
             android:theme="@style/Theme.AppCompat.DayNight">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
 
             <intent-filter>
@@ -543,7 +543,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -554,7 +554,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -565,7 +565,7 @@
             android:theme="@style/Theme.AppCompat.Light">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -576,7 +576,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -587,7 +587,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -598,7 +598,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -609,7 +609,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -621,7 +621,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -632,7 +632,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -644,7 +644,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
         <activity
@@ -654,7 +654,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -666,7 +666,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -677,7 +677,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -688,7 +688,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -699,7 +699,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -710,7 +710,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -722,7 +722,7 @@
             android:windowSoftInputMode="adjustResize">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -733,7 +733,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -744,7 +744,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -755,7 +755,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -766,7 +766,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -777,7 +777,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -788,7 +788,7 @@
             android:theme="@style/Theme.AppCompat.Light.NoActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -799,7 +799,7 @@
             android:theme="@style/Theme.AppCompat">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -815,7 +815,7 @@
             android:label="@string/swipe_to_dismiss_activity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -825,7 +825,7 @@
             android:label="@string/drag_and_drop_activity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -836,7 +836,7 @@
             android:theme="@style/Theme.SampleDrawerLayout">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -847,7 +847,7 @@
             android:theme="@style/Theme.AppCompat.Light">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -858,7 +858,7 @@
             android:theme="@style/Theme.AppCompat.Light">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -870,7 +870,7 @@
             android:theme="@style/Theme.AppCompat.Light">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
         <activity
@@ -880,7 +880,7 @@
             android:theme="@style/Theme.AppCompat.Light">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -892,7 +892,7 @@
             android:theme="@style/Theme.AppCompat.Light">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -904,7 +904,7 @@
             android:theme="@style/Theme.AppCompat.Light">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
@@ -916,17 +916,17 @@
             android:theme="@style/Theme.AppCompat.Light">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+                <category android:name="com.example.androidx.SAMPLE_CODE" />
             </intent-filter>
         </activity>
 
         <!-- ListView styling activity -->
         <provider
             android:name=".app.RecentSuggestionsProvider"
-            android:authorities="com.example.android.supportv7.RecentSuggestionsProvider" />
+            android:authorities="com.example.androidx.RecentSuggestionsProvider" />
 
         <!-- Selection helper single selection demo activity -->
-        <receiver android:name="com.example.android.supportv7.media.SampleMediaButtonReceiver"
+        <receiver android:name=".media.SampleMediaButtonReceiver"
             android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MEDIA_BUTTON" />
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/Support7Demos.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/AndroidXDemos.java
similarity index 91%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/Support7Demos.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/AndroidXDemos.java
index 2223ccf..b582e7a 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/Support7Demos.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/AndroidXDemos.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7;
+package com.example.androidx;
 
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -33,14 +33,16 @@
 import java.util.Map;
 
 @SuppressWarnings("deprecation")
-public class Support7Demos extends android.app.ListActivity {
+public class AndroidXDemos extends android.app.ListActivity {
+
+    private static final String INTENT_EXTRA_PATH_KEY = "com.example.androidx.apis.Path";
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
         Intent intent = getIntent();
-        String path = intent.getStringExtra("com.example.android.apis.Path");
+        String path = intent.getStringExtra(INTENT_EXTRA_PATH_KEY);
 
         if (path == null) {
             path = "";
@@ -57,7 +59,7 @@
         List<Map<String, Object>> myData = new ArrayList<Map<String, Object>>();
 
         Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
-        mainIntent.addCategory("com.example.android.supportv7.SAMPLE_CODE");
+        mainIntent.addCategory("com.example.androidx.SAMPLE_CODE");
 
         PackageManager pm = getPackageManager();
         List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);
@@ -129,8 +131,8 @@
 
     protected Intent browseIntent(String path) {
         Intent result = new Intent();
-        result.setClass(this, Support7Demos.class);
-        result.putExtra("com.example.android.apis.Path", path);
+        result.setClass(this, AndroidXDemos.class);
+        result.putExtra(INTENT_EXTRA_PATH_KEY, path);
         return result;
     }
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/Cheeses.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/Cheeses.java
similarity index 99%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/Cheeses.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/Cheeses.java
index 61a9bb7..6e6a7cf 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/Cheeses.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/Cheeses.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7;
+package com.example.androidx;
 
 public class Cheeses {
     private Cheeses() {
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/LoremIpsum.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/LoremIpsum.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/LoremIpsum.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/LoremIpsum.java
index 7038c27..d77e269 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/LoremIpsum.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/LoremIpsum.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7;
+package com.example.androidx;
 
 /**
  * Filler text for some of the samples.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/_package.html b/samples/AndroidXDemos/src/main/java/com/example/androidx/_package.html
similarity index 84%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/_package.html
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/_package.html
index be85e78..e7cdb8a 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/_package.html
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/_package.html
@@ -14,7 +14,7 @@
 Examples of how to use support library APIs.  See:
 
 <ol>
-    <li> <a href="com.example.android.supportv7.app">sdk.app</a> for examples
+    <li> <a href="com.example.androidx.app">sdk.app</a> for examples
         of using the application package support APIs.
 </ol>
 </p>
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarActionMode.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarActionMode.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarActionMode.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarActionMode.java
index 7f15249..a9d162e 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarActionMode.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarActionMode.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 import android.view.Menu;
@@ -25,7 +25,7 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.view.ActionMode;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates idiomatic usage of an action mode.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarBackgroundChange.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarBackgroundChange.java
similarity index 95%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarBackgroundChange.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarBackgroundChange.java
index 51d18f7..20edfbe2 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarBackgroundChange.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarBackgroundChange.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.graphics.drawable.ColorDrawable;
 import android.os.Bundle;
@@ -22,7 +22,7 @@
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.AppCompatActivity;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates changing background and elevation (on supported platforms) of ActionBar.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarDisplayOptions.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarDisplayOptions.java
similarity index 97%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarDisplayOptions.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarDisplayOptions.java
index 3d04ba5..47c07b3 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarDisplayOptions.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarDisplayOptions.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 import android.view.Gravity;
@@ -26,7 +26,7 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.fragment.app.FragmentTransaction;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demo shows how various action bar display option flags can be combined and their effects.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarFragmentMenu.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarFragmentMenu.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarFragmentMenu.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarFragmentMenu.java
index be79b92..aa0030f 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarFragmentMenu.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarFragmentMenu.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 import android.view.Menu;
@@ -30,7 +30,7 @@
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * Demonstrates how fragments can participate in the options menu.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarHideOnScroll.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarHideOnScroll.java
similarity index 93%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarHideOnScroll.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarHideOnScroll.java
index fa0a049..73fae2c 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarHideOnScroll.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarHideOnScroll.java
@@ -13,14 +13,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.view.WindowCompat;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates usage of the Action Bar's hide on content scroll
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarMechanics.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarMechanics.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarMechanics.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarMechanics.java
index d31f0b0..5d08042 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarMechanics.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarMechanics.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 import android.view.Menu;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarSettingsActionProviderActivity.java
similarity index 97%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarSettingsActionProviderActivity.java
index 066be1e..0906f37 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarSettingsActionProviderActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.content.Context;
 import android.content.Intent;
@@ -29,7 +29,7 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.view.ActionProvider;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This activity demonstrates how to implement an {@link android.view.ActionProvider}
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarShareActionProvider.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarShareActionProvider.java
similarity index 94%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarShareActionProvider.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarShareActionProvider.java
index c58ad2c..04add40 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarShareActionProvider.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarShareActionProvider.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.content.Intent;
 import android.view.Menu;
@@ -23,7 +23,7 @@
 import androidx.appcompat.widget.ShareActionProvider;
 import androidx.core.view.MenuItemCompat;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This activity demonstrates how to use {@link ShareActionProvider} with the Action Bar.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarUsage.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarUsage.java
similarity index 97%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarUsage.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarUsage.java
index 0a4b4a5..942b569 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarUsage.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ActionBarUsage.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
@@ -28,7 +28,7 @@
 import androidx.appcompat.widget.SearchView;
 import androidx.core.view.MenuItemCompat;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates idiomatic usage of the Action Bar. The default Honeycomb theme
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AlertDialogUsage.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AlertDialogUsage.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AlertDialogUsage.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AlertDialogUsage.java
index 870a7ae..a3e6eb6 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AlertDialogUsage.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AlertDialogUsage.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 import android.view.View;
@@ -24,8 +24,8 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.content.res.AppCompatResources;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.R;
+import com.example.androidx.Cheeses;
+import com.example.androidx.R;
 
 /**
  * This demonstrates idiomatic usage of AppCompat's AlertDialog.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatAnimatedSelector.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatAnimatedSelector.java
similarity index 95%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatAnimatedSelector.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatAnimatedSelector.java
index 111615e..2cc296c 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatAnimatedSelector.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatAnimatedSelector.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
@@ -24,7 +24,7 @@
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * Demonstrating usage of
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatAnimatedVector.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatAnimatedVector.java
similarity index 93%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatAnimatedVector.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatAnimatedVector.java
index 1533763..7101180 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatAnimatedVector.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatAnimatedVector.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.graphics.drawable.Animatable;
 import android.graphics.drawable.Drawable;
@@ -23,7 +23,7 @@
 
 import androidx.appcompat.app.AppCompatActivity;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 
 public class AppCompatAnimatedVector extends AppCompatActivity {
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatDefaultNightModeActivity.java
similarity index 95%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatDefaultNightModeActivity.java
index 9b3ffe9..626968a 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatDefaultNightModeActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 
 import android.os.Bundle;
@@ -24,7 +24,7 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.app.AppCompatDelegate;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates idiomatic usage of AppCompatActivity with Theme.AppCompat.DayNight
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeBootAwareActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatDefaultNightModeBootAwareActivity.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeBootAwareActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatDefaultNightModeBootAwareActivity.java
index f29a3ca..e4131abb 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeBootAwareActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatDefaultNightModeBootAwareActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 
 import android.content.Context;
@@ -26,7 +26,7 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.app.AppCompatDelegate;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This is used to test implicit direct boot violations. To test:
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatLocalNightModeActivity.java
similarity index 95%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatLocalNightModeActivity.java
index 140adab..c08bb21 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatLocalNightModeActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 
 import android.os.Bundle;
@@ -24,7 +24,7 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.app.AppCompatDelegate;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates idiomatic usage of AppCompatActivity with Theme.AppCompat.DayNight
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatNightModeAlertDialog.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatNightModeAlertDialog.java
index 78117fec8..e03f167 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatNightModeAlertDialog.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 import android.view.View;
@@ -23,7 +23,7 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.app.AppCompatDelegate;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates idiomatic usage of AlertDialog with Theme.AppCompat.DayNight
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatNightModeBounceActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatNightModeBounceActivity.java
similarity index 94%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatNightModeBounceActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatNightModeBounceActivity.java
index db98790..9b5cbbe 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatNightModeBounceActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatNightModeBounceActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 
 import android.content.Intent;
@@ -24,7 +24,7 @@
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * An Activity which has a DayNight theme, which allows us to 'bounce' to our
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatNightModeDialog.java
similarity index 97%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatNightModeDialog.java
index 4a62809..5c22916 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatNightModeDialog.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 import android.view.View;
@@ -23,7 +23,7 @@
 import androidx.appcompat.app.AppCompatDelegate;
 import androidx.appcompat.app.AppCompatDialog;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates idiomatic usage of Dialog with Theme.AppCompat.DayNight
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsButtons.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsButtons.java
similarity index 92%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsButtons.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsButtons.java
index 58077b9..373c04c 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsButtons.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsButtons.java
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 
 import androidx.appcompat.app.AppCompatActivity;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates the styled {@link android.widget.Button} widgets in AppCompat.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsIcons.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsIcons.java
similarity index 92%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsIcons.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsIcons.java
index e7446ce..68918d2 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsIcons.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsIcons.java
@@ -14,14 +14,14 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates the styled {@link android.widget.Button} widgets in AppCompat.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsRatingBars.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsRatingBars.java
similarity index 92%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsRatingBars.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsRatingBars.java
index df6ddcf..f216999 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsRatingBars.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsRatingBars.java
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 
 import androidx.appcompat.app.AppCompatActivity;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates the styled {@link android.widget.RatingBar} widgets in AppCompat.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsSpinners.java
similarity index 92%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsSpinners.java
index f05a835..dbeb2ce 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsSpinners.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 import android.widget.ArrayAdapter;
@@ -22,8 +22,8 @@
 
 import androidx.appcompat.app.AppCompatActivity;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.R;
+import com.example.androidx.Cheeses;
+import com.example.androidx.R;
 
 /**
  * This demonstrates the styled {@link android.widget.Spinner} widgets in AppCompat.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsSwitches.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsSwitches.java
similarity index 92%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsSwitches.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsSwitches.java
index b134543..fc61af3 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsSwitches.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsSwitches.java
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 
 import androidx.appcompat.app.AppCompatActivity;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates the styled {@link android.widget.Switch} and
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsTextInput.java
similarity index 93%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsTextInput.java
index 0a76053..684de79 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsTextInput.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 import android.widget.ArrayAdapter;
@@ -23,8 +23,8 @@
 
 import androidx.appcompat.app.AppCompatActivity;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.R;
+import com.example.androidx.Cheeses;
+import com.example.androidx.R;
 
 /**
  * This demonstrates the styled text input widgets in AppCompat, such as
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsTextViews.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsTextViews.java
similarity index 92%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsTextViews.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsTextViews.java
index a76b1aa..6043530 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsTextViews.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsTextViews.java
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 
 import androidx.appcompat.app.AppCompatActivity;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates the styled {@link android.widget.TextView} widgets in AppCompat.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsToggleButtons.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsToggleButtons.java
similarity index 92%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsToggleButtons.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsToggleButtons.java
index ff796cb..8c787a3 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsToggleButtons.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/AppCompatWidgetsToggleButtons.java
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 
 import androidx.appcompat.app.AppCompatActivity;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates the styled {@link android.widget.ToggleButton} widgets in AppCompat.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/DialogFragmentUsage.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/DialogFragmentUsage.java
similarity index 97%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/DialogFragmentUsage.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/DialogFragmentUsage.java
index aa5c6d7..425c90e 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/DialogFragmentUsage.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/DialogFragmentUsage.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 import android.view.LayoutInflater;
@@ -30,7 +30,7 @@
 import androidx.appcompat.app.AppCompatDialog;
 import androidx.appcompat.app.AppCompatDialogFragment;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates idiomatic usage of AppCompatDialogFragment.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/DialogUsage.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/DialogUsage.java
similarity index 95%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/DialogUsage.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/DialogUsage.java
index 957089c..a951f0f 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/DialogUsage.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/DialogUsage.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.app.Dialog;
 import android.os.Bundle;
@@ -22,7 +22,7 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.app.AppCompatDialog;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates idiomatic usage of AppCompatDialog.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/MenuItemIconTinting.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/MenuItemIconTinting.java
similarity index 95%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/MenuItemIconTinting.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/MenuItemIconTinting.java
index 903adc4..7e9e9c8 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/MenuItemIconTinting.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/MenuItemIconTinting.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 import android.view.Menu;
@@ -24,7 +24,7 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.widget.Toolbar;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates icon tinting on menu items.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/RecentSuggestionsProvider.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/RecentSuggestionsProvider.java
similarity index 85%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/RecentSuggestionsProvider.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/RecentSuggestionsProvider.java
index 8d6666d..ea5c26f 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/RecentSuggestionsProvider.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/RecentSuggestionsProvider.java
@@ -14,12 +14,12 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.content.SearchRecentSuggestionsProvider;
 
 public class RecentSuggestionsProvider extends SearchRecentSuggestionsProvider {
-    public final static String AUTHORITY = "com.example.android.supportv7.RecentSuggestionsProvider";
+    public final static String AUTHORITY = "com.example.androidx.RecentSuggestionsProvider";
     public final static int MODE = DATABASE_MODE_QUERIES;
 
     public RecentSuggestionsProvider() {
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/SearchActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/SearchActivity.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/SearchActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/SearchActivity.java
index 622516f..4d0cfc2 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/SearchActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/SearchActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.app.Activity;
 import android.app.SearchManager;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarActionMode.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarActionMode.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarActionMode.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarActionMode.java
index 6356c5d..27586ef 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarActionMode.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarActionMode.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 import android.view.Menu;
@@ -26,7 +26,7 @@
 import androidx.appcompat.view.ActionMode;
 import androidx.appcompat.widget.Toolbar;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates idiomatic usage of an action mode with a Toolbar.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarBackgroundChange.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarBackgroundChange.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarBackgroundChange.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarBackgroundChange.java
index 8fc939a..0a7e079 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarBackgroundChange.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarBackgroundChange.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.app.SearchManager;
 import android.graphics.drawable.ColorDrawable;
@@ -29,7 +29,7 @@
 import androidx.appcompat.widget.SearchView;
 import androidx.appcompat.widget.Toolbar;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates changing background and elevation (on supported platforms) of Toolbar.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarDisplayOptions.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarDisplayOptions.java
similarity index 97%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarDisplayOptions.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarDisplayOptions.java
index 511f36c..ef2f7be 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarDisplayOptions.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarDisplayOptions.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 import android.view.Gravity;
@@ -26,7 +26,7 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.widget.Toolbar;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demo shows how various action bar display option flags can be combined and their effects
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java
index f8ee1ff..45a3a16 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarFragmentPagerMenu.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 import android.view.Gravity;
@@ -35,7 +35,7 @@
 import androidx.fragment.app.FragmentPagerAdapter;
 import androidx.viewpager.widget.ViewPager;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarTall.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarTall.java
similarity index 94%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarTall.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarTall.java
index e0ed723..8bec0b6 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarTall.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarTall.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.os.Bundle;
 import android.view.Menu;
@@ -24,7 +24,7 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.widget.Toolbar;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates usage of a tall Toolbar.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarUsage.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarUsage.java
similarity index 95%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarUsage.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarUsage.java
index 91034f4..b167b15 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarUsage.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/ToolbarUsage.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.app;
+package com.example.androidx.app;
 
 import android.app.SearchManager;
 import android.os.Bundle;
@@ -26,7 +26,7 @@
 import androidx.appcompat.widget.SearchView;
 import androidx.appcompat.widget.Toolbar;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates idiomatic usage of the Toolbar as the action bar.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/_index.html b/samples/AndroidXDemos/src/main/java/com/example/androidx/app/_index.html
similarity index 100%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/app/_index.html
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/app/_index.html
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/drawable/CustomDrawableActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/drawable/CustomDrawableActivity.java
similarity index 91%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/drawable/CustomDrawableActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/drawable/CustomDrawableActivity.java
index 196a768..50d92bf 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/drawable/CustomDrawableActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/drawable/CustomDrawableActivity.java
@@ -13,13 +13,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.drawable;
+package com.example.androidx.drawable;
 
 import android.os.Bundle;
 
 import androidx.appcompat.app.AppCompatActivity;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This demonstrates usage of a custom <drawable>
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/drawable/MyDrawable.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/drawable/MyDrawable.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/drawable/MyDrawable.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/drawable/MyDrawable.java
index ecab1b2..6a6bf80 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/drawable/MyDrawable.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/drawable/MyDrawable.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.drawable;
+package com.example.androidx.drawable;
 
 import android.graphics.Canvas;
 import android.graphics.ColorFilter;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/graphics/ImageLoader.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/graphics/ImageLoader.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/graphics/ImageLoader.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/graphics/ImageLoader.java
index a1ef580..e476651 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/graphics/ImageLoader.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/graphics/ImageLoader.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.graphics;
+package com.example.androidx.graphics;
 
 import android.graphics.Bitmap;
 import android.provider.MediaStore;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/graphics/PaletteActivity.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/graphics/PaletteActivity.java
index ad993d9..d98583a 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/graphics/PaletteActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.graphics;
+package com.example.androidx.graphics;
 
 import android.annotation.SuppressLint;
 import android.content.Context;
@@ -41,7 +41,7 @@
 import androidx.loader.content.Loader;
 import androidx.palette.graphics.Palette;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * Activity which displays the images from the device's {@link MediaStore}, alongside the generated
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/graphics/PaletteDetailActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/graphics/PaletteDetailActivity.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/graphics/PaletteDetailActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/graphics/PaletteDetailActivity.java
index 13d0820..bbd39ea 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/graphics/PaletteDetailActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/graphics/PaletteDetailActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.graphics;
+package com.example.androidx.graphics;
 
 import android.graphics.Bitmap;
 import android.net.Uri;
@@ -32,7 +32,7 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.palette.graphics.Palette;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 import java.util.List;
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/LocalPlayer.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/LocalPlayer.java
similarity index 99%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/media/LocalPlayer.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/media/LocalPlayer.java
index 1e0c88c..ec022f6 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/LocalPlayer.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/LocalPlayer.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.media;
+package com.example.androidx.media;
 
 import android.app.Activity;
 import android.app.Presentation;
@@ -41,7 +41,7 @@
 import androidx.mediarouter.media.MediaItemStatus;
 import androidx.mediarouter.media.MediaRouter.RouteInfo;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 import java.io.IOException;
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/MyMediaRouteControllerDialog.java
similarity index 93%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/media/MyMediaRouteControllerDialog.java
index fa4c885..efdf6fd 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/MyMediaRouteControllerDialog.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.media;
+package com.example.androidx.media;
 
 import android.content.Context;
 import android.graphics.Color;
@@ -24,7 +24,7 @@
 
 import androidx.mediarouter.app.MediaRouteControllerDialog;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * An example MediaRouteControllerDialog for demonstrating
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/OverlayDisplayWindow.java
similarity index 99%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/media/OverlayDisplayWindow.java
index 0efe75d..199046f 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/OverlayDisplayWindow.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.media;
+package com.example.androidx.media;
 
 import android.content.Context;
 import android.graphics.Bitmap;
@@ -40,7 +40,7 @@
 
 import androidx.annotation.RequiresApi;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * Manages an overlay display window, used for simulating remote playback.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/Player.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/Player.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/media/Player.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/media/Player.java
index 1cd930a..3ccd49d 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/Player.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/Player.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.media;
+package com.example.androidx.media;
 
 import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PAUSE;
 import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PLAY;
@@ -40,7 +40,7 @@
 import androidx.mediarouter.media.MediaControlIntent;
 import androidx.mediarouter.media.MediaRouter.RouteInfo;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 /**
  * Abstraction of common playback operations of media items, such as play,
  * seek, etc. Used by PlaybackManager as a backend to handle actual playback
@@ -59,7 +59,7 @@
     protected static final int STATE_PAUSED = 5;
 
     protected static final String NOTIFICATION_CHANNEL_ID =
-            "com.example.android.supportv7.media.channel";
+            "com.example.androidx.media.channel";
     protected static final int NOTIFICATION_ID = 1;
 
     private static final long PLAYBACK_ACTIONS = PlaybackStateCompat.ACTION_PAUSE
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/PlaylistItem.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/PlaylistItem.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/media/PlaylistItem.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/media/PlaylistItem.java
index e079cf4..b5c50b1d 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/PlaylistItem.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/PlaylistItem.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.media;
+package com.example.androidx.media;
 
 import android.app.PendingIntent;
 import android.net.Uri;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/RemotePlayer.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/RemotePlayer.java
similarity index 99%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/media/RemotePlayer.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/media/RemotePlayer.java
index 1a393bc..db07e51 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/RemotePlayer.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/RemotePlayer.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.media;
+package com.example.androidx.media;
 
 import android.content.Context;
 import android.content.Intent;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrp.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleDynamicGroupMrp.java
similarity index 99%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrp.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleDynamicGroupMrp.java
index 98f27b9..81ab7a8 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrp.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleDynamicGroupMrp.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.media;
+package com.example.androidx.media;
 
 import android.app.PendingIntent;
 import android.content.Context;
@@ -33,7 +33,7 @@
 import androidx.mediarouter.media.MediaRouter.ControlRequestCallback;
 import androidx.mediarouter.media.MediaRouter.RouteInfo;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrpService.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleDynamicGroupMrpService.java
similarity index 95%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrpService.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleDynamicGroupMrpService.java
index d0e1599..89698ea 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrpService.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleDynamicGroupMrpService.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.media;
+package com.example.androidx.media;
 
 import androidx.mediarouter.media.MediaRouteProvider;
 import androidx.mediarouter.media.MediaRouteProviderService;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaButtonReceiver.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleMediaButtonReceiver.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaButtonReceiver.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleMediaButtonReceiver.java
index 3ad4b36..b8f236a 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaButtonReceiver.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleMediaButtonReceiver.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.media;
+package com.example.androidx.media;
 
 import android.content.BroadcastReceiver;
 import android.content.Context;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteProvider.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleMediaRouteProvider.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteProvider.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleMediaRouteProvider.java
index afe07ed9..98abca4e 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteProvider.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleMediaRouteProvider.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.media;
+package com.example.androidx.media;
 
 import android.app.PendingIntent;
 import android.content.Context;
@@ -40,7 +40,7 @@
 import androidx.mediarouter.media.MediaRouter.RouteInfo;
 import androidx.mediarouter.media.MediaSessionStatus;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -68,7 +68,7 @@
      * supported by this provider's routes.
      */
     public static final String CATEGORY_SAMPLE_ROUTE =
-            "com.example.android.supportv7.media.CATEGORY_SAMPLE_ROUTE";
+            "com.example.androidx.media.CATEGORY_SAMPLE_ROUTE";
 
     /**
      * A custom media control intent action to take a snapshot.
@@ -77,14 +77,14 @@
      * @see #EXTRA_SNAPSHOT
      */
     public static final String ACTION_TAKE_SNAPSHOT =
-            "com.example.android.supportv7.media.action.TAKE_SNAPSHOT";
+            "com.example.androidx.media.action.TAKE_SNAPSHOT";
 
     /**
      * {@link #ACTION_TAKE_SNAPSHOT} result data: a bitmap containing a snapshot
      * of the currently playing media item
      */
     public static final String EXTRA_SNAPSHOT =
-            "com.example.android.supportv7.media.extra.SNAPSHOT";
+            "com.example.androidx.media.extra.SNAPSHOT";
 
     protected static final ArrayList<IntentFilter> CONTROL_FILTERS_BASIC;
     protected static final ArrayList<IntentFilter> CONTROL_FILTERS_QUEUING;
@@ -220,7 +220,7 @@
                 .setCanDisconnect(true)
                 .build();
 
-        Uri iconUri = Uri.parse("android.resource://com.example.android.supportv7/"
+        Uri iconUri = Uri.parse("android.resource://com.example.androidx/"
                 + R.drawable.ic_android);
         MediaRouteDescriptor routeDescriptor4 = new MediaRouteDescriptor.Builder(
                 VARIABLE_VOLUME_SESSION_ROUTE_ID,
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteProviderService.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleMediaRouteProviderService.java
similarity index 95%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteProviderService.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleMediaRouteProviderService.java
index a1b2408..0f17e65 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteProviderService.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleMediaRouteProviderService.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.media;
+package com.example.androidx.media;
 
 import androidx.mediarouter.media.MediaRouteProvider;
 import androidx.mediarouter.media.MediaRouteProviderService;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteSettingsActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleMediaRouteSettingsActivity.java
similarity index 94%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteSettingsActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleMediaRouteSettingsActivity.java
index 31a9f01..4e66493 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteSettingsActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleMediaRouteSettingsActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.media;
+package com.example.androidx.media;
 
 import androidx.appcompat.app.AppCompatActivity;
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouterActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleMediaRouterActivity.java
similarity index 99%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouterActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleMediaRouterActivity.java
index 507d14e..e51f9b7 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouterActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SampleMediaRouterActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.media;
+package com.example.androidx.media;
 
 import android.app.PendingIntent;
 import android.content.ComponentName;
@@ -65,7 +65,7 @@
 import androidx.mediarouter.media.MediaRouter.RouteInfo;
 import androidx.mediarouter.media.MediaRouterParams;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 import java.io.File;
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SessionManager.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SessionManager.java
similarity index 99%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SessionManager.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/media/SessionManager.java
index d270a0e..e7d706f 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SessionManager.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/SessionManager.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.media;
+package com.example.androidx.media;
 
 import android.app.PendingIntent;
 import android.net.Uri;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/_index.html b/samples/AndroidXDemos/src/main/java/com/example/androidx/media/_index.html
similarity index 100%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/media/_index.html
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/media/_index.html
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/util/DiffUtilActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/util/DiffUtilActivity.java
similarity index 95%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/util/DiffUtilActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/util/DiffUtilActivity.java
index 2d3b3d4..2fdc6f2 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/util/DiffUtilActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/util/DiffUtilActivity.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.util;
+package com.example.androidx.util;
 
 import android.annotation.SuppressLint;
 import android.os.Bundle;
@@ -30,8 +30,8 @@
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
+import com.example.androidx.Cheeses;
+import com.example.androidx.widget.adapter.SimpleStringAdapter;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -40,7 +40,7 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
- * A sample activity that demonstrates usage if {@link android.support.v7.util.DiffUtil} with
+ * A sample activity that demonstrates usage if {@link androidx.recyclerview.widget.DiffUtil} with
  * a RecyclerView.
  */
 public class DiffUtilActivity extends AppCompatActivity {
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/util/SortedListActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/util/SortedListActivity.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/util/SortedListActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/util/SortedListActivity.java
index 7f4377d..4e1065a 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/util/SortedListActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/util/SortedListActivity.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.util;
+package com.example.androidx.util;
 
 import android.os.Bundle;
 import android.view.KeyEvent;
@@ -32,7 +32,7 @@
 import androidx.recyclerview.widget.SortedList;
 import androidx.recyclerview.widget.SortedListAdapterCallback;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * A sample activity that uses {@link SortedList} in combination with RecyclerView.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/CardViewActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/view/CardViewActivity.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/view/CardViewActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/view/CardViewActivity.java
index b3be31a..7cd5e7a 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/CardViewActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/view/CardViewActivity.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.view;
+package com.example.androidx.view;
 
 import android.os.Bundle;
 import android.os.Handler;
@@ -27,7 +27,7 @@
 import androidx.cardview.widget.CardView;
 import androidx.core.content.ContextCompat;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 public class CardViewActivity extends AppCompatActivity {
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/GridLayout1.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/view/GridLayout1.java
similarity index 91%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/view/GridLayout1.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/view/GridLayout1.java
index ce24832..6be88a4e 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/GridLayout1.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/view/GridLayout1.java
@@ -14,12 +14,12 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.view;
+package com.example.androidx.view;
 
 import android.app.Activity;
 import android.os.Bundle;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * Demonstrates using GridLayout to build the same "Simple Form" as in the
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/GridLayout2.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/view/GridLayout2.java
similarity index 91%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/view/GridLayout2.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/view/GridLayout2.java
index 67cda29..56a71d6 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/GridLayout2.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/view/GridLayout2.java
@@ -14,12 +14,12 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.view;
+package com.example.androidx.view;
 
 import android.app.Activity;
 import android.os.Bundle;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * A form, showing use of the GridLayout API from XML.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/GridLayout3.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/view/GridLayout3.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/view/GridLayout3.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/view/GridLayout3.java
index 359efd0..906b24b 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/GridLayout3.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/view/GridLayout3.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.view;
+package com.example.androidx.view;
 
 import static android.text.InputType.TYPE_CLASS_TEXT;
 import static android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/SystemUIModes.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/view/SystemUIModes.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/view/SystemUIModes.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/view/SystemUIModes.java
index 89e4c6b..c39b9c8 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/SystemUIModes.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/view/SystemUIModes.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.view;
+package com.example.androidx.view;
 
 import static android.os.Build.VERSION.SDK_INT;
 
@@ -46,7 +46,7 @@
 import androidx.core.view.MenuItemCompat;
 import androidx.fragment.app.FragmentTransaction;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * This activity demonstrates some of the available ways to reduce the size or visual contrast of
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/_index.html b/samples/AndroidXDemos/src/main/java/com/example/androidx/view/_index.html
similarity index 100%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/view/_index.html
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/view/_index.html
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/AnimatedRecyclerView.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/AnimatedRecyclerView.java
similarity index 99%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/AnimatedRecyclerView.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/AnimatedRecyclerView.java
index 7d626b3..753090a 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/AnimatedRecyclerView.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/AnimatedRecyclerView.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
@@ -36,7 +36,7 @@
 import androidx.recyclerview.widget.DefaultItemAnimator;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/AsyncListUtilActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/AsyncListUtilActivity.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/AsyncListUtilActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/AsyncListUtilActivity.java
index 65f96a9..817238b 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/AsyncListUtilActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/AsyncListUtilActivity.java
@@ -15,7 +15,7 @@
  */
 
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.app.Activity;
 import android.content.Context;
@@ -29,7 +29,7 @@
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.Cheeses;
+import com.example.androidx.Cheeses;
 
 /**
  * A sample Activity to demonstrate capabilities of {@link AsyncListUtil}.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/BaseLayoutManagerActivity.java
similarity index 94%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/BaseLayoutManagerActivity.java
index ff1f343..a0d7f4f 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/BaseLayoutManagerActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.app.Activity;
 import android.os.Bundle;
@@ -31,11 +31,11 @@
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.R;
-import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
-import com.example.android.supportv7.widget.util.ConfigToggle;
-import com.example.android.supportv7.widget.util.ConfigViewHolder;
+import com.example.androidx.Cheeses;
+import com.example.androidx.R;
+import com.example.androidx.widget.adapter.SimpleStringAdapter;
+import com.example.androidx.widget.util.ConfigToggle;
+import com.example.androidx.widget.util.ConfigViewHolder;
 
 /**
  * A simple activity that can be extended to demonstrate LayoutManagers.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/DrawerLayoutActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/DrawerLayoutActivity.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/DrawerLayoutActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/DrawerLayoutActivity.java
index 208c4b6..3a47ba8 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/DrawerLayoutActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/DrawerLayoutActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.content.res.Configuration;
 import android.content.res.Resources;
@@ -36,8 +36,8 @@
 import androidx.core.view.GravityCompat;
 import androidx.drawerlayout.widget.DrawerLayout;
 
-import com.example.android.supportv7.LoremIpsum;
-import com.example.android.supportv7.R;
+import com.example.androidx.LoremIpsum;
+import com.example.androidx.R;
 
 /**
  * This example illustrates a common usage of the DrawerLayout widget combined with Toolbar
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/GridLayoutManagerActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/GridLayoutManagerActivity.java
similarity index 94%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/GridLayoutManagerActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/GridLayoutManagerActivity.java
index fd1f2e0..e6eac0e 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/GridLayoutManagerActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/GridLayoutManagerActivity.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.view.View;
 import android.view.ViewGroup;
@@ -23,10 +23,10 @@
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.R;
-import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
-import com.example.android.supportv7.widget.util.ConfigToggle;
+import com.example.androidx.Cheeses;
+import com.example.androidx.R;
+import com.example.androidx.widget.adapter.SimpleStringAdapter;
+import com.example.androidx.widget.util.ConfigToggle;
 
 /**
  * A sample Activity to demonstrate capabilities of {@link GridLayoutManager}.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/LinearLayoutManagerActivity.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/LinearLayoutManagerActivity.java
index f94915d..5bae336 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/LinearLayoutManagerActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import androidx.core.view.ViewCompat;
 import androidx.recyclerview.widget.DividerItemDecoration;
@@ -22,8 +22,8 @@
 import androidx.recyclerview.widget.LinearSnapHelper;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.R;
-import com.example.android.supportv7.widget.util.ConfigToggle;
+import com.example.androidx.R;
+import com.example.androidx.widget.util.ConfigToggle;
 
 /**
  * A sample activity that uses {@link LinearLayoutManager}.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/LinearLayoutManagerJankActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/LinearLayoutManagerJankActivity.java
similarity index 91%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/LinearLayoutManagerJankActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/LinearLayoutManagerJankActivity.java
index b19834a..301128b 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/LinearLayoutManagerJankActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/LinearLayoutManagerJankActivity.java
@@ -14,17 +14,17 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.view.ViewGroup;
 
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.R;
-import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
-import com.example.android.supportv7.widget.util.ConfigToggle;
+import com.example.androidx.Cheeses;
+import com.example.androidx.R;
+import com.example.androidx.widget.adapter.SimpleStringAdapter;
+import com.example.androidx.widget.util.ConfigToggle;
 
 /**
  * A configurably janky activity that uses {@link LinearLayoutManager}.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/ListPopupWindowActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/ListPopupWindowActivity.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/ListPopupWindowActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/ListPopupWindowActivity.java
index d73d7db..edff85b 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/ListPopupWindowActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/ListPopupWindowActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.graphics.Rect;
 import android.os.Bundle;
@@ -31,7 +31,7 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.widget.ListPopupWindow;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/ListViewActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/ListViewActivity.java
similarity index 95%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/ListViewActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/ListViewActivity.java
index fd3b9a2..9f5d1b9 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/ListViewActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/ListViewActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.os.Bundle;
 import android.view.LayoutInflater;
@@ -26,7 +26,7 @@
 
 import androidx.appcompat.app.AppCompatActivity;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * Sample activity for the demo of list item styles.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/NestedRecyclerViewActivity.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/NestedRecyclerViewActivity.java
index 366028a..297eeaa 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/NestedRecyclerViewActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.graphics.Color;
 import android.os.Parcelable;
@@ -28,9 +28,9 @@
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.R;
-import com.example.android.supportv7.widget.util.ConfigToggle;
+import com.example.androidx.Cheeses;
+import com.example.androidx.R;
+import com.example.androidx.widget.util.ConfigToggle;
 
 import java.util.ArrayList;
 import java.util.Arrays;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/NestedScrollViewCoordinatorLayoutAppBarActivity.kt b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/NestedScrollViewCoordinatorLayoutAppBarActivity.kt
similarity index 93%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/NestedScrollViewCoordinatorLayoutAppBarActivity.kt
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/NestedScrollViewCoordinatorLayoutAppBarActivity.kt
index 27d7f2e..d9608bc 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/NestedScrollViewCoordinatorLayoutAppBarActivity.kt
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/NestedScrollViewCoordinatorLayoutAppBarActivity.kt
@@ -14,12 +14,12 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget
+package com.example.androidx.widget
 
 import android.os.Bundle
 import android.widget.TextView
 import androidx.appcompat.app.AppCompatActivity
-import com.example.android.supportv7.R
+import com.example.androidx.R
 
 class NestedScrollViewCoordinatorLayoutAppBarActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/PagerRecyclerViewActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/PagerRecyclerViewActivity.java
similarity index 92%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/PagerRecyclerViewActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/PagerRecyclerViewActivity.java
index 1f3ed27..8e64815 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/PagerRecyclerViewActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/PagerRecyclerViewActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.os.Bundle;
 import android.view.ViewGroup;
@@ -24,8 +24,8 @@
 import androidx.recyclerview.widget.PagerSnapHelper;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
+import com.example.androidx.Cheeses;
+import com.example.androidx.widget.adapter.SimpleStringAdapter;
 
 /**
  * Example activity that uses LinearLayoutManager, RecyclerView, and PagerSnapHelper.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/PopupMenuActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/PopupMenuActivity.java
similarity index 97%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/PopupMenuActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/PopupMenuActivity.java
index c78fa32..e422ec7 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/PopupMenuActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/PopupMenuActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.os.Bundle;
 import android.view.ContextMenu;
@@ -33,7 +33,7 @@
 import androidx.core.view.MenuCompat;
 import androidx.core.view.MenuItemCompat;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RecyclerViewActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RecyclerViewActivity.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RecyclerViewActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RecyclerViewActivity.java
index a80ea81..1be8063 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RecyclerViewActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RecyclerViewActivity.java
@@ -15,7 +15,7 @@
  */
 
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.app.Activity;
 import android.content.Context;
@@ -29,8 +29,8 @@
 import androidx.recyclerview.widget.DividerItemDecoration;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
+import com.example.androidx.Cheeses;
+import com.example.androidx.widget.adapter.SimpleStringAdapter;
 
 public class RecyclerViewActivity extends Activity {
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RecyclerViewCoordinatorLayoutAppBarActivity.kt b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RecyclerViewCoordinatorLayoutAppBarActivity.kt
similarity index 92%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RecyclerViewCoordinatorLayoutAppBarActivity.kt
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RecyclerViewCoordinatorLayoutAppBarActivity.kt
index 2fa8d8b..163843d 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RecyclerViewCoordinatorLayoutAppBarActivity.kt
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RecyclerViewCoordinatorLayoutAppBarActivity.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget
+package com.example.androidx.widget
 
 import android.os.Bundle
 import android.view.LayoutInflater
@@ -26,7 +26,7 @@
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 
-import com.example.android.supportv7.R
+import com.example.androidx.R
 
 class RecyclerViewCoordinatorLayoutAppBarActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -53,7 +53,7 @@
         return numItems
     }
 
-    override fun onBindViewHolder(holder: ItemsAdapter.ViewHolder, position: Int) {
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
         holder.nameTextView.text = "Item $position"
     }
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RecyclerViewSmoothScrollByActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RecyclerViewSmoothScrollByActivity.java
similarity index 92%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RecyclerViewSmoothScrollByActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RecyclerViewSmoothScrollByActivity.java
index 7e84c3f..44f7ee2 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RecyclerViewSmoothScrollByActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RecyclerViewSmoothScrollByActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.app.Activity;
 import android.os.Bundle;
@@ -27,9 +27,9 @@
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.R;
-import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
+import com.example.androidx.Cheeses;
+import com.example.androidx.R;
+import com.example.androidx.widget.adapter.SimpleStringAdapter;
 
 /**
  * Simple activity to test {@link RecyclerView#smoothScrollBy(int, int, Interpolator, int)}
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RemoveLargeItemsDemo.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RemoveLargeItemsDemo.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RemoveLargeItemsDemo.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RemoveLargeItemsDemo.java
index 2e0b4f7..e74e920 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RemoveLargeItemsDemo.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RemoveLargeItemsDemo.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.annotation.SuppressLint;
 import android.app.Activity;
@@ -31,7 +31,7 @@
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 import org.jetbrains.annotations.NotNull;
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RvIn2NestedScrollViewsActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RvIn2NestedScrollViewsActivity.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RvIn2NestedScrollViewsActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RvIn2NestedScrollViewsActivity.java
index 66a112e..1bc54e2 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RvIn2NestedScrollViewsActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RvIn2NestedScrollViewsActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.app.Activity;
 import android.content.Context;
@@ -28,7 +28,7 @@
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * A sample nested RecyclerView activity.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RvInNestedScrollViewActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RvInNestedScrollViewActivity.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RvInNestedScrollViewActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RvInNestedScrollViewActivity.java
index 6671131..dc24607 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RvInNestedScrollViewActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/RvInNestedScrollViewActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.app.Activity;
 import android.content.Context;
@@ -28,7 +28,7 @@
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * A sample nested RecyclerView activity.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/StableIdActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/StableIdActivity.java
similarity index 97%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/StableIdActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/StableIdActivity.java
index 7d88692..0545279 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/StableIdActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/StableIdActivity.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import android.view.LayoutInflater;
 import android.view.View;
@@ -27,8 +27,8 @@
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.R;
+import com.example.androidx.Cheeses;
+import com.example.androidx.R;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/StaggeredGridLayoutManagerActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/StaggeredGridLayoutManagerActivity.java
similarity index 92%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/StaggeredGridLayoutManagerActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/StaggeredGridLayoutManagerActivity.java
index f6931f1..a5a85c1 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/StaggeredGridLayoutManagerActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/StaggeredGridLayoutManagerActivity.java
@@ -14,12 +14,12 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget;
+package com.example.androidx.widget;
 
 import androidx.recyclerview.widget.StaggeredGridLayoutManager;
 
-import com.example.android.supportv7.R;
-import com.example.android.supportv7.widget.util.ConfigToggle;
+import com.example.androidx.R;
+import com.example.androidx.widget.util.ConfigToggle;
 
 public class StaggeredGridLayoutManagerActivity
         extends BaseLayoutManagerActivity<StaggeredGridLayoutManager> {
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/adapter/SimpleStringAdapter.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/adapter/SimpleStringAdapter.java
index 1b9be89..415ec78 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/adapter/SimpleStringAdapter.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.adapter;
+package com.example.androidx.widget.adapter;
 
 import android.content.Context;
 import android.graphics.Color;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoAdapter.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/DemoAdapter.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoAdapter.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/DemoAdapter.java
index 94131b5..c911363 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoAdapter.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/DemoAdapter.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.selection.fancy;
+package com.example.androidx.widget.selection.fancy;
 
 import static androidx.core.util.Preconditions.checkArgument;
 
@@ -29,7 +29,7 @@
 import androidx.recyclerview.selection.SelectionTracker;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.Cheeses;
+import com.example.androidx.Cheeses;
 
 import java.util.ArrayList;
 import java.util.Collections;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoDetailsLookup.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/DemoDetailsLookup.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoDetailsLookup.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/DemoDetailsLookup.java
index 03421da..fe2a836 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoDetailsLookup.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/DemoDetailsLookup.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.selection.fancy;
+package com.example.androidx.widget.selection.fancy;
 
 import android.net.Uri;
 import android.view.MotionEvent;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHeaderHolder.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/DemoHeaderHolder.java
similarity index 93%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHeaderHolder.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/DemoHeaderHolder.java
index 0e64018..98fba9b 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHeaderHolder.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/DemoHeaderHolder.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.widget.selection.fancy;
+package com.example.androidx.widget.selection.fancy;
 
 import android.content.Context;
 import android.net.Uri;
@@ -23,7 +23,7 @@
 
 import androidx.annotation.NonNull;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 final class DemoHeaderHolder extends DemoHolder {
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHolder.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/DemoHolder.java
similarity index 95%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHolder.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/DemoHolder.java
index fd8d494..0f7273f 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHolder.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/DemoHolder.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.selection.fancy;
+package com.example.androidx.widget.selection.fancy;
 
 import android.content.Context;
 import android.net.Uri;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoItemHolder.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/DemoItemHolder.java
similarity index 97%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoItemHolder.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/DemoItemHolder.java
index aa5f2d5..6563528 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoItemHolder.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/DemoItemHolder.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.widget.selection.fancy;
+package com.example.androidx.widget.selection.fancy;
 
 import android.content.Context;
 import android.graphics.Rect;
@@ -30,7 +30,7 @@
 import androidx.annotation.Nullable;
 import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 final class DemoItemHolder extends DemoHolder {
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/FancySelectionDemoActivity.java
similarity index 98%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/FancySelectionDemoActivity.java
index 2622d4f..15fa441 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/FancySelectionDemoActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.selection.fancy;
+package com.example.androidx.widget.selection.fancy;
 
 import static androidx.recyclerview.widget.ItemTouchHelper.RIGHT;
 
@@ -46,7 +46,7 @@
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.recyclerview.widget.RecyclerView.ViewHolder;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * RecyclerView Selection library fancy demo activity. The fancy
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/Uris.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/Uris.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/Uris.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/Uris.java
index ca9cd57..afa2b73 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/Uris.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/fancy/Uris.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.selection.fancy;
+package com.example.androidx.widget.selection.fancy;
 
 import android.net.Uri;
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoAdapter.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/simple/DemoAdapter.java
similarity index 94%
copy from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoAdapter.java
copy to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/simple/DemoAdapter.java
index c4853bd..6dcb1a4 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoAdapter.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/simple/DemoAdapter.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.selection.simple;
+package com.example.androidx.widget.selection.simple;
 
 import static androidx.core.util.Preconditions.checkArgument;
 
@@ -29,8 +29,8 @@
 import androidx.recyclerview.selection.SelectionTracker;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.R;
+import com.example.androidx.Cheeses;
+import com.example.androidx.R;
 
 final class DemoAdapter extends RecyclerView.Adapter<DemoHolder> {
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoDetailsLookup.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/simple/DemoDetailsLookup.java
similarity index 95%
copy from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoDetailsLookup.java
copy to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/simple/DemoDetailsLookup.java
index af40460..3bab58e 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoDetailsLookup.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/simple/DemoDetailsLookup.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.widget.selection.single;
+package com.example.androidx.widget.selection.simple;
 
 import android.view.MotionEvent;
 import android.view.View;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoHolder.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/simple/DemoHolder.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoHolder.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/simple/DemoHolder.java
index d92eef9..ee3c6a3 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoHolder.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/simple/DemoHolder.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.widget.selection.single;
+package com.example.androidx.widget.selection.simple;
 
 import android.graphics.Rect;
 import android.view.MotionEvent;
@@ -24,7 +24,7 @@
 import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 final class DemoHolder extends RecyclerView.ViewHolder {
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/simple/SimpleSelectionDemoActivity.java
similarity index 97%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/simple/SimpleSelectionDemoActivity.java
index fdee29d..f266e53 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/simple/SimpleSelectionDemoActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.selection.simple;
+package com.example.androidx.widget.selection.simple;
 
 import android.content.Context;
 import android.os.Bundle;
@@ -34,7 +34,7 @@
 import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * RecyclerView Selection library simple demo activity.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoAdapter.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/single/DemoAdapter.java
similarity index 94%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoAdapter.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/single/DemoAdapter.java
index c4853bd..f29f33a 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoAdapter.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/single/DemoAdapter.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.selection.simple;
+package com.example.androidx.widget.selection.single;
 
 import static androidx.core.util.Preconditions.checkArgument;
 
@@ -29,8 +29,8 @@
 import androidx.recyclerview.selection.SelectionTracker;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.R;
+import com.example.androidx.Cheeses;
+import com.example.androidx.R;
 
 final class DemoAdapter extends RecyclerView.Adapter<DemoHolder> {
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoDetailsLookup.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/single/DemoDetailsLookup.java
similarity index 95%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoDetailsLookup.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/single/DemoDetailsLookup.java
index af40460..277b61e 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoDetailsLookup.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/single/DemoDetailsLookup.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.widget.selection.single;
+package com.example.androidx.widget.selection.single;
 
 import android.view.MotionEvent;
 import android.view.View;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoHolder.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/single/DemoHolder.java
similarity index 96%
copy from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoHolder.java
copy to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/single/DemoHolder.java
index d92eef9..f7bb47f 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoHolder.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/single/DemoHolder.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.widget.selection.single;
+package com.example.androidx.widget.selection.single;
 
 import android.graphics.Rect;
 import android.view.MotionEvent;
@@ -24,7 +24,7 @@
 import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 final class DemoHolder extends RecyclerView.ViewHolder {
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/SingleStableIdSelectionDemoActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/single/SingleStableIdSelectionDemoActivity.java
similarity index 97%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/SingleStableIdSelectionDemoActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/single/SingleStableIdSelectionDemoActivity.java
index 0772dab6..5c58647 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/SingleStableIdSelectionDemoActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/selection/single/SingleStableIdSelectionDemoActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.selection.single;
+package com.example.androidx.widget.selection.single;
 
 import android.os.Bundle;
 import android.util.Log;
@@ -29,7 +29,7 @@
 import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.R;
+import com.example.androidx.R;
 
 /**
  * RecyclerView Selection library single-selection mode demo activity.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/DragAndDropActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/touch/DragAndDropActivity.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/DragAndDropActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/touch/DragAndDropActivity.java
index 85a43f5..8652108 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/DragAndDropActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/touch/DragAndDropActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.touch;
+package com.example.androidx.widget.touch;
 
 import android.view.MotionEvent;
 import android.view.View;
@@ -24,8 +24,8 @@
 import androidx.recyclerview.widget.ItemTouchHelper;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.R;
-import com.example.android.supportv7.widget.util.ConfigToggle;
+import com.example.androidx.R;
+import com.example.androidx.widget.util.ConfigToggle;
 
 public class DragAndDropActivity extends ItemTouchHelperActivity {
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java
index 5a2cd9e..d1e7092 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/touch/ItemTouchHelperActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.touch;
+package com.example.androidx.widget.touch;
 
 import android.app.Activity;
 import android.graphics.Canvas;
@@ -32,10 +32,10 @@
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.R;
-import com.example.android.supportv7.widget.util.ConfigToggle;
-import com.example.android.supportv7.widget.util.ConfigViewHolder;
+import com.example.androidx.Cheeses;
+import com.example.androidx.R;
+import com.example.androidx.widget.util.ConfigToggle;
+import com.example.androidx.widget.util.ConfigViewHolder;
 
 import java.util.ArrayList;
 import java.util.Arrays;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/touch/SwipeToDismissActivity.java
similarity index 97%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/touch/SwipeToDismissActivity.java
index 7f3660a..3167f3e 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/touch/SwipeToDismissActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.touch;
+package com.example.androidx.widget.touch;
 
 import android.graphics.Canvas;
 import android.view.MotionEvent;
@@ -25,8 +25,8 @@
 import androidx.recyclerview.widget.ItemTouchHelper;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.example.android.supportv7.R;
-import com.example.android.supportv7.widget.util.ConfigToggle;
+import com.example.androidx.R;
+import com.example.androidx.widget.util.ConfigToggle;
 
 public class SwipeToDismissActivity extends ItemTouchHelperActivity {
     boolean mSwipeStartEnabled = true;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/util/ConfigToggle.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/util/ConfigToggle.java
similarity index 94%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/util/ConfigToggle.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/util/ConfigToggle.java
index eae04b0..50ca0f4 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/util/ConfigToggle.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/util/ConfigToggle.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.util;
+package com.example.androidx.widget.util;
 
 import android.content.Context;
 
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/util/ConfigViewHolder.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/util/ConfigViewHolder.java
similarity index 96%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/util/ConfigViewHolder.java
rename to samples/AndroidXDemos/src/main/java/com/example/androidx/widget/util/ConfigViewHolder.java
index 4b15904..ebcaed1 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/util/ConfigViewHolder.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/util/ConfigViewHolder.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.util;
+package com.example.androidx.widget.util;
 
 import android.view.View;
 import android.widget.CheckBox;
diff --git a/samples/Support7Demos/src/main/res/anim/animation_grouping_1_01.xml b/samples/AndroidXDemos/src/main/res/anim/animation_grouping_1_01.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/anim/animation_grouping_1_01.xml
rename to samples/AndroidXDemos/src/main/res/anim/animation_grouping_1_01.xml
diff --git a/samples/Support7Demos/src/main/res/color/background_tint.xml b/samples/AndroidXDemos/src/main/res/color/background_tint.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/color/background_tint.xml
rename to samples/AndroidXDemos/src/main/res/color/background_tint.xml
diff --git a/samples/Support7Demos/src/main/res/color/background_tint2.xml b/samples/AndroidXDemos/src/main/res/color/background_tint2.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/color/background_tint2.xml
rename to samples/AndroidXDemos/src/main/res/color/background_tint2.xml
diff --git a/samples/Support7Demos/src/main/res/color/card_selector.xml b/samples/AndroidXDemos/src/main/res/color/card_selector.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/color/card_selector.xml
rename to samples/AndroidXDemos/src/main/res/color/card_selector.xml
diff --git a/samples/Support7Demos/src/main/res/color/drawable_tint.xml b/samples/AndroidXDemos/src/main/res/color/drawable_tint.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/color/drawable_tint.xml
rename to samples/AndroidXDemos/src/main/res/color/drawable_tint.xml
diff --git a/samples/Support7Demos/src/main/res/color/link_color.xml b/samples/AndroidXDemos/src/main/res/color/link_color.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/color/link_color.xml
rename to samples/AndroidXDemos/src/main/res/color/link_color.xml
diff --git a/samples/Support7Demos/src/main/res/color/menu_item_color.xml b/samples/AndroidXDemos/src/main/res/color/menu_item_color.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/color/menu_item_color.xml
rename to samples/AndroidXDemos/src/main/res/color/menu_item_color.xml
diff --git a/samples/Support7Demos/src/main/res/color/selection_demo_item.xml b/samples/AndroidXDemos/src/main/res/color/selection_demo_item.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/color/selection_demo_item.xml
rename to samples/AndroidXDemos/src/main/res/color/selection_demo_item.xml
diff --git a/samples/Support7Demos/src/main/res/color/selection_demo_item_selector.xml b/samples/AndroidXDemos/src/main/res/color/selection_demo_item_selector.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/color/selection_demo_item_selector.xml
rename to samples/AndroidXDemos/src/main/res/color/selection_demo_item_selector.xml
diff --git a/samples/Support7Demos/src/main/res/drawable-hdpi/apidemo_androidlogo.png b/samples/AndroidXDemos/src/main/res/drawable-hdpi/apidemo_androidlogo.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-hdpi/apidemo_androidlogo.png
rename to samples/AndroidXDemos/src/main/res/drawable-hdpi/apidemo_androidlogo.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-hdpi/app_sample_code.png b/samples/AndroidXDemos/src/main/res/drawable-hdpi/app_sample_code.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-hdpi/app_sample_code.png
rename to samples/AndroidXDemos/src/main/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-hdpi/drawer_shadow.9.png b/samples/AndroidXDemos/src/main/res/drawable-hdpi/drawer_shadow.9.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-hdpi/drawer_shadow.9.png
rename to samples/AndroidXDemos/src/main/res/drawable-hdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-hdpi/drawer_shadow_end.9.png b/samples/AndroidXDemos/src/main/res/drawable-hdpi/drawer_shadow_end.9.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-hdpi/drawer_shadow_end.9.png
rename to samples/AndroidXDemos/src/main/res/drawable-hdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-hdpi/ic_android.png b/samples/AndroidXDemos/src/main/res/drawable-hdpi/ic_android.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-hdpi/ic_android.png
rename to samples/AndroidXDemos/src/main/res/drawable-hdpi/ic_android.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-hdpi/ic_launcher_settings.png b/samples/AndroidXDemos/src/main/res/drawable-hdpi/ic_launcher_settings.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-hdpi/ic_launcher_settings.png
rename to samples/AndroidXDemos/src/main/res/drawable-hdpi/ic_launcher_settings.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-hdpi/ic_media_pause.png b/samples/AndroidXDemos/src/main/res/drawable-hdpi/ic_media_pause.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-hdpi/ic_media_pause.png
rename to samples/AndroidXDemos/src/main/res/drawable-hdpi/ic_media_pause.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-hdpi/ic_media_play.png b/samples/AndroidXDemos/src/main/res/drawable-hdpi/ic_media_play.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-hdpi/ic_media_play.png
rename to samples/AndroidXDemos/src/main/res/drawable-hdpi/ic_media_play.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-hdpi/ic_media_stop.png b/samples/AndroidXDemos/src/main/res/drawable-hdpi/ic_media_stop.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-hdpi/ic_media_stop.png
rename to samples/AndroidXDemos/src/main/res/drawable-hdpi/ic_media_stop.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-hdpi/ic_menu_add.png b/samples/AndroidXDemos/src/main/res/drawable-hdpi/ic_menu_add.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-hdpi/ic_menu_add.png
rename to samples/AndroidXDemos/src/main/res/drawable-hdpi/ic_menu_add.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-hdpi/ic_menu_delete.png b/samples/AndroidXDemos/src/main/res/drawable-hdpi/ic_menu_delete.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-hdpi/ic_menu_delete.png
rename to samples/AndroidXDemos/src/main/res/drawable-hdpi/ic_menu_delete.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-ldrtl-hdpi/drawer_shadow.9.png b/samples/AndroidXDemos/src/main/res/drawable-ldrtl-hdpi/drawer_shadow.9.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-ldrtl-hdpi/drawer_shadow.9.png
rename to samples/AndroidXDemos/src/main/res/drawable-ldrtl-hdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-ldrtl-hdpi/drawer_shadow_end.9.png b/samples/AndroidXDemos/src/main/res/drawable-ldrtl-hdpi/drawer_shadow_end.9.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-ldrtl-hdpi/drawer_shadow_end.9.png
rename to samples/AndroidXDemos/src/main/res/drawable-ldrtl-hdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-ldrtl-mdpi/drawer_shadow.9.png b/samples/AndroidXDemos/src/main/res/drawable-ldrtl-mdpi/drawer_shadow.9.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-ldrtl-mdpi/drawer_shadow.9.png
rename to samples/AndroidXDemos/src/main/res/drawable-ldrtl-mdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-ldrtl-mdpi/drawer_shadow_end.9.png b/samples/AndroidXDemos/src/main/res/drawable-ldrtl-mdpi/drawer_shadow_end.9.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-ldrtl-mdpi/drawer_shadow_end.9.png
rename to samples/AndroidXDemos/src/main/res/drawable-ldrtl-mdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-ldrtl-xhdpi/drawer_shadow.9.png b/samples/AndroidXDemos/src/main/res/drawable-ldrtl-xhdpi/drawer_shadow.9.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-ldrtl-xhdpi/drawer_shadow.9.png
rename to samples/AndroidXDemos/src/main/res/drawable-ldrtl-xhdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-ldrtl-xhdpi/drawer_shadow_end.9.png b/samples/AndroidXDemos/src/main/res/drawable-ldrtl-xhdpi/drawer_shadow_end.9.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-ldrtl-xhdpi/drawer_shadow_end.9.png
rename to samples/AndroidXDemos/src/main/res/drawable-ldrtl-xhdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-mdpi/apidemo_androidlogo.png b/samples/AndroidXDemos/src/main/res/drawable-mdpi/apidemo_androidlogo.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-mdpi/apidemo_androidlogo.png
rename to samples/AndroidXDemos/src/main/res/drawable-mdpi/apidemo_androidlogo.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-mdpi/app_sample_code.png b/samples/AndroidXDemos/src/main/res/drawable-mdpi/app_sample_code.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-mdpi/app_sample_code.png
rename to samples/AndroidXDemos/src/main/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-mdpi/drawer_shadow.9.png b/samples/AndroidXDemos/src/main/res/drawable-mdpi/drawer_shadow.9.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-mdpi/drawer_shadow.9.png
rename to samples/AndroidXDemos/src/main/res/drawable-mdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-mdpi/drawer_shadow_end.9.png b/samples/AndroidXDemos/src/main/res/drawable-mdpi/drawer_shadow_end.9.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-mdpi/drawer_shadow_end.9.png
rename to samples/AndroidXDemos/src/main/res/drawable-mdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-mdpi/ic_android.png b/samples/AndroidXDemos/src/main/res/drawable-mdpi/ic_android.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-mdpi/ic_android.png
rename to samples/AndroidXDemos/src/main/res/drawable-mdpi/ic_android.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-mdpi/ic_launcher_settings.png b/samples/AndroidXDemos/src/main/res/drawable-mdpi/ic_launcher_settings.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-mdpi/ic_launcher_settings.png
rename to samples/AndroidXDemos/src/main/res/drawable-mdpi/ic_launcher_settings.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-mdpi/ic_media_pause.png b/samples/AndroidXDemos/src/main/res/drawable-mdpi/ic_media_pause.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-mdpi/ic_media_pause.png
rename to samples/AndroidXDemos/src/main/res/drawable-mdpi/ic_media_pause.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-mdpi/ic_media_play.png b/samples/AndroidXDemos/src/main/res/drawable-mdpi/ic_media_play.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-mdpi/ic_media_play.png
rename to samples/AndroidXDemos/src/main/res/drawable-mdpi/ic_media_play.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-mdpi/ic_media_stop.png b/samples/AndroidXDemos/src/main/res/drawable-mdpi/ic_media_stop.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-mdpi/ic_media_stop.png
rename to samples/AndroidXDemos/src/main/res/drawable-mdpi/ic_media_stop.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-mdpi/ic_menu_add.png b/samples/AndroidXDemos/src/main/res/drawable-mdpi/ic_menu_add.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-mdpi/ic_menu_add.png
rename to samples/AndroidXDemos/src/main/res/drawable-mdpi/ic_menu_add.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-mdpi/ic_menu_delete.png b/samples/AndroidXDemos/src/main/res/drawable-mdpi/ic_menu_delete.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-mdpi/ic_menu_delete.png
rename to samples/AndroidXDemos/src/main/res/drawable-mdpi/ic_menu_delete.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-nodpi/frantic.jpg b/samples/AndroidXDemos/src/main/res/drawable-nodpi/frantic.jpg
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-nodpi/frantic.jpg
rename to samples/AndroidXDemos/src/main/res/drawable-nodpi/frantic.jpg
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-xhdpi/drawer_shadow.9.png b/samples/AndroidXDemos/src/main/res/drawable-xhdpi/drawer_shadow.9.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-xhdpi/drawer_shadow.9.png
rename to samples/AndroidXDemos/src/main/res/drawable-xhdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable-xhdpi/drawer_shadow_end.9.png b/samples/AndroidXDemos/src/main/res/drawable-xhdpi/drawer_shadow_end.9.png
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable-xhdpi/drawer_shadow_end.9.png
rename to samples/AndroidXDemos/src/main/res/drawable-xhdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/src/main/res/drawable/animation_vector_drawable_grouping_1.xml b/samples/AndroidXDemos/src/main/res/drawable/animation_vector_drawable_grouping_1.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/animation_vector_drawable_grouping_1.xml
rename to samples/AndroidXDemos/src/main/res/drawable/animation_vector_drawable_grouping_1.xml
diff --git a/samples/Support7Demos/src/main/res/drawable/asl_heart_checked.xml b/samples/AndroidXDemos/src/main/res/drawable/asl_heart_checked.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/asl_heart_checked.xml
rename to samples/AndroidXDemos/src/main/res/drawable/asl_heart_checked.xml
diff --git a/samples/Support7Demos/src/main/res/drawable/asl_heart_pressed.xml b/samples/AndroidXDemos/src/main/res/drawable/asl_heart_pressed.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/asl_heart_pressed.xml
rename to samples/AndroidXDemos/src/main/res/drawable/asl_heart_pressed.xml
diff --git a/samples/Support7Demos/src/main/res/drawable/avd_heart_empty.xml b/samples/AndroidXDemos/src/main/res/drawable/avd_heart_empty.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/avd_heart_empty.xml
rename to samples/AndroidXDemos/src/main/res/drawable/avd_heart_empty.xml
diff --git a/samples/Support7Demos/src/main/res/drawable/avd_heart_fill.xml b/samples/AndroidXDemos/src/main/res/drawable/avd_heart_fill.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/avd_heart_fill.xml
rename to samples/AndroidXDemos/src/main/res/drawable/avd_heart_fill.xml
diff --git a/samples/Support7Demos/src/main/res/drawable/gradient.xml b/samples/AndroidXDemos/src/main/res/drawable/gradient.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/gradient.xml
rename to samples/AndroidXDemos/src/main/res/drawable/gradient.xml
diff --git a/samples/Support7Demos/src/main/res/drawable/ic_heart_empty.xml b/samples/AndroidXDemos/src/main/res/drawable/ic_heart_empty.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/ic_heart_empty.xml
rename to samples/AndroidXDemos/src/main/res/drawable/ic_heart_empty.xml
diff --git a/samples/Support7Demos/src/main/res/drawable/ic_heart_full.xml b/samples/AndroidXDemos/src/main/res/drawable/ic_heart_full.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/ic_heart_full.xml
rename to samples/AndroidXDemos/src/main/res/drawable/ic_heart_full.xml
diff --git a/samples/Support7Demos/src/main/res/drawable/ic_search.xml b/samples/AndroidXDemos/src/main/res/drawable/ic_search.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/ic_search.xml
rename to samples/AndroidXDemos/src/main/res/drawable/ic_search.xml
diff --git a/samples/Support7Demos/src/main/res/drawable/my_drawable.xml b/samples/AndroidXDemos/src/main/res/drawable/my_drawable.xml
similarity index 92%
rename from samples/Support7Demos/src/main/res/drawable/my_drawable.xml
rename to samples/AndroidXDemos/src/main/res/drawable/my_drawable.xml
index 8eb5c46..af7402a 100644
--- a/samples/Support7Demos/src/main/res/drawable/my_drawable.xml
+++ b/samples/AndroidXDemos/src/main/res/drawable/my_drawable.xml
@@ -16,5 +16,5 @@
   -->
 
 <drawable xmlns:android="http://schemas.android.com/apk/res/android"
-    class="com.example.android.supportv7.drawable.MyDrawable"
+    class="com.example.androidx.drawable.MyDrawable"
     android:color="#ffff0000" />
diff --git a/samples/Support7Demos/src/main/res/drawable/selection_demo_band_overlay.xml b/samples/AndroidXDemos/src/main/res/drawable/selection_demo_band_overlay.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/selection_demo_band_overlay.xml
rename to samples/AndroidXDemos/src/main/res/drawable/selection_demo_band_overlay.xml
diff --git a/samples/Support7Demos/src/main/res/drawable/selection_demo_item.xml b/samples/AndroidXDemos/src/main/res/drawable/selection_demo_item.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/selection_demo_item.xml
rename to samples/AndroidXDemos/src/main/res/drawable/selection_demo_item.xml
diff --git a/samples/Support7Demos/src/main/res/drawable/selection_demo_item_background.xml b/samples/AndroidXDemos/src/main/res/drawable/selection_demo_item_background.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/selection_demo_item_background.xml
rename to samples/AndroidXDemos/src/main/res/drawable/selection_demo_item_background.xml
diff --git a/samples/Support7Demos/src/main/res/drawable/switch_compat_thumb.xml b/samples/AndroidXDemos/src/main/res/drawable/switch_compat_thumb.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/switch_compat_thumb.xml
rename to samples/AndroidXDemos/src/main/res/drawable/switch_compat_thumb.xml
diff --git a/samples/Support7Demos/src/main/res/drawable/switch_compat_track.xml b/samples/AndroidXDemos/src/main/res/drawable/switch_compat_track.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/switch_compat_track.xml
rename to samples/AndroidXDemos/src/main/res/drawable/switch_compat_track.xml
diff --git a/samples/Support7Demos/src/main/res/drawable/test_night_color_conversion_background.xml b/samples/AndroidXDemos/src/main/res/drawable/test_night_color_conversion_background.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/test_night_color_conversion_background.xml
rename to samples/AndroidXDemos/src/main/res/drawable/test_night_color_conversion_background.xml
diff --git a/samples/Support7Demos/src/main/res/drawable/vector_drawable_grouping_1.xml b/samples/AndroidXDemos/src/main/res/drawable/vector_drawable_grouping_1.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/drawable/vector_drawable_grouping_1.xml
rename to samples/AndroidXDemos/src/main/res/drawable/vector_drawable_grouping_1.xml
diff --git a/samples/Support7Demos/src/main/res/layout-land/grid_layout_2.xml b/samples/AndroidXDemos/src/main/res/layout-land/grid_layout_2.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout-land/grid_layout_2.xml
rename to samples/AndroidXDemos/src/main/res/layout-land/grid_layout_2.xml
diff --git a/samples/Support7Demos/src/main/res/layout-v11/appcompat_animated_vector.xml b/samples/AndroidXDemos/src/main/res/layout-v11/appcompat_animated_vector.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout-v11/appcompat_animated_vector.xml
rename to samples/AndroidXDemos/src/main/res/layout-v11/appcompat_animated_vector.xml
diff --git a/samples/Support7Demos/src/main/res/layout/action_bar_action_mode.xml b/samples/AndroidXDemos/src/main/res/layout/action_bar_action_mode.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/action_bar_action_mode.xml
rename to samples/AndroidXDemos/src/main/res/layout/action_bar_action_mode.xml
diff --git a/samples/Support7Demos/src/main/res/layout/action_bar_background_change.xml b/samples/AndroidXDemos/src/main/res/layout/action_bar_background_change.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/action_bar_background_change.xml
rename to samples/AndroidXDemos/src/main/res/layout/action_bar_background_change.xml
diff --git a/samples/Support7Demos/src/main/res/layout/action_bar_display_options.xml b/samples/AndroidXDemos/src/main/res/layout/action_bar_display_options.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/action_bar_display_options.xml
rename to samples/AndroidXDemos/src/main/res/layout/action_bar_display_options.xml
diff --git a/samples/Support7Demos/src/main/res/layout/action_bar_display_options_custom.xml b/samples/AndroidXDemos/src/main/res/layout/action_bar_display_options_custom.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/action_bar_display_options_custom.xml
rename to samples/AndroidXDemos/src/main/res/layout/action_bar_display_options_custom.xml
diff --git a/samples/Support7Demos/src/main/res/layout/action_bar_fragment_menu.xml b/samples/AndroidXDemos/src/main/res/layout/action_bar_fragment_menu.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/action_bar_fragment_menu.xml
rename to samples/AndroidXDemos/src/main/res/layout/action_bar_fragment_menu.xml
diff --git a/samples/Support7Demos/src/main/res/layout/action_bar_hide_scroll.xml b/samples/AndroidXDemos/src/main/res/layout/action_bar_hide_scroll.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/action_bar_hide_scroll.xml
rename to samples/AndroidXDemos/src/main/res/layout/action_bar_hide_scroll.xml
diff --git a/samples/Support7Demos/src/main/res/layout/action_bar_settings_action_provider.xml b/samples/AndroidXDemos/src/main/res/layout/action_bar_settings_action_provider.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/action_bar_settings_action_provider.xml
rename to samples/AndroidXDemos/src/main/res/layout/action_bar_settings_action_provider.xml
diff --git a/samples/Support7Demos/src/main/res/layout/action_bar_tab_content.xml b/samples/AndroidXDemos/src/main/res/layout/action_bar_tab_content.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/action_bar_tab_content.xml
rename to samples/AndroidXDemos/src/main/res/layout/action_bar_tab_content.xml
diff --git a/samples/Support7Demos/src/main/res/layout/action_bar_tabs.xml b/samples/AndroidXDemos/src/main/res/layout/action_bar_tabs.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/action_bar_tabs.xml
rename to samples/AndroidXDemos/src/main/res/layout/action_bar_tabs.xml
diff --git a/samples/Support7Demos/src/main/res/layout/activity_base_layout_manager.xml b/samples/AndroidXDemos/src/main/res/layout/activity_base_layout_manager.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/activity_base_layout_manager.xml
rename to samples/AndroidXDemos/src/main/res/layout/activity_base_layout_manager.xml
diff --git a/samples/Support7Demos/src/main/res/layout/activity_card_view.xml b/samples/AndroidXDemos/src/main/res/layout/activity_card_view.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/activity_card_view.xml
rename to samples/AndroidXDemos/src/main/res/layout/activity_card_view.xml
diff --git a/samples/Support7Demos/src/main/res/layout/activity_item_touch.xml b/samples/AndroidXDemos/src/main/res/layout/activity_item_touch.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/activity_item_touch.xml
rename to samples/AndroidXDemos/src/main/res/layout/activity_item_touch.xml
diff --git a/samples/Support7Demos/src/main/res/layout/activity_rv_in_nestedscrollview.xml b/samples/AndroidXDemos/src/main/res/layout/activity_rv_in_nestedscrollview.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/activity_rv_in_nestedscrollview.xml
rename to samples/AndroidXDemos/src/main/res/layout/activity_rv_in_nestedscrollview.xml
diff --git a/samples/Support7Demos/src/main/res/layout/activity_rv_in_two_nestedscrollviews.xml b/samples/AndroidXDemos/src/main/res/layout/activity_rv_in_two_nestedscrollviews.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/activity_rv_in_two_nestedscrollviews.xml
rename to samples/AndroidXDemos/src/main/res/layout/activity_rv_in_two_nestedscrollviews.xml
diff --git a/samples/Support7Demos/src/main/res/layout/activity_rv_smoothscrollby.xml b/samples/AndroidXDemos/src/main/res/layout/activity_rv_smoothscrollby.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/activity_rv_smoothscrollby.xml
rename to samples/AndroidXDemos/src/main/res/layout/activity_rv_smoothscrollby.xml
diff --git a/samples/Support7Demos/src/main/res/layout/alert_dialog_usage.xml b/samples/AndroidXDemos/src/main/res/layout/alert_dialog_usage.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/alert_dialog_usage.xml
rename to samples/AndroidXDemos/src/main/res/layout/alert_dialog_usage.xml
diff --git a/samples/Support7Demos/src/main/res/layout/animated_recycler_view.xml b/samples/AndroidXDemos/src/main/res/layout/animated_recycler_view.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/animated_recycler_view.xml
rename to samples/AndroidXDemos/src/main/res/layout/animated_recycler_view.xml
diff --git a/samples/Support7Demos/src/main/res/layout/appcompat_animated_selector.xml b/samples/AndroidXDemos/src/main/res/layout/appcompat_animated_selector.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/appcompat_animated_selector.xml
rename to samples/AndroidXDemos/src/main/res/layout/appcompat_animated_selector.xml
diff --git a/samples/Support7Demos/src/main/res/layout/appcompat_animated_vector.xml b/samples/AndroidXDemos/src/main/res/layout/appcompat_animated_vector.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/appcompat_animated_vector.xml
rename to samples/AndroidXDemos/src/main/res/layout/appcompat_animated_vector.xml
diff --git a/samples/Support7Demos/src/main/res/layout/appcompat_night_mode.xml b/samples/AndroidXDemos/src/main/res/layout/appcompat_night_mode.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/appcompat_night_mode.xml
rename to samples/AndroidXDemos/src/main/res/layout/appcompat_night_mode.xml
diff --git a/samples/Support7Demos/src/main/res/layout/appcompat_night_mode_bounce.xml b/samples/AndroidXDemos/src/main/res/layout/appcompat_night_mode_bounce.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/appcompat_night_mode_bounce.xml
rename to samples/AndroidXDemos/src/main/res/layout/appcompat_night_mode_bounce.xml
diff --git a/samples/Support7Demos/src/main/res/layout/appcompat_widgets_buttons.xml b/samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_buttons.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/appcompat_widgets_buttons.xml
rename to samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_buttons.xml
diff --git a/samples/Support7Demos/src/main/res/layout/appcompat_widgets_icons.xml b/samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_icons.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/appcompat_widgets_icons.xml
rename to samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_icons.xml
diff --git a/samples/Support7Demos/src/main/res/layout/appcompat_widgets_ratingbars.xml b/samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_ratingbars.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/appcompat_widgets_ratingbars.xml
rename to samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_ratingbars.xml
diff --git a/samples/Support7Demos/src/main/res/layout/appcompat_widgets_switches.xml b/samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_switches.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/appcompat_widgets_switches.xml
rename to samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_switches.xml
diff --git a/samples/Support7Demos/src/main/res/layout/appcompat_widgets_text_input.xml b/samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_text_input.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/appcompat_widgets_text_input.xml
rename to samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_text_input.xml
diff --git a/samples/Support7Demos/src/main/res/layout/appcompat_widgets_text_spinners.xml b/samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_text_spinners.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/appcompat_widgets_text_spinners.xml
rename to samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_text_spinners.xml
diff --git a/samples/Support7Demos/src/main/res/layout/appcompat_widgets_text_views.xml b/samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_text_views.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/appcompat_widgets_text_views.xml
rename to samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_text_views.xml
diff --git a/samples/Support7Demos/src/main/res/layout/appcompat_widgets_toggle_buttons.xml b/samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_toggle_buttons.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/appcompat_widgets_toggle_buttons.xml
rename to samples/AndroidXDemos/src/main/res/layout/appcompat_widgets_toggle_buttons.xml
diff --git a/samples/Support7Demos/src/main/res/layout/config_view_toggle.xml b/samples/AndroidXDemos/src/main/res/layout/config_view_toggle.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/config_view_toggle.xml
rename to samples/AndroidXDemos/src/main/res/layout/config_view_toggle.xml
diff --git a/samples/Support7Demos/src/main/res/layout/custom_drawable_image.xml b/samples/AndroidXDemos/src/main/res/layout/custom_drawable_image.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/custom_drawable_image.xml
rename to samples/AndroidXDemos/src/main/res/layout/custom_drawable_image.xml
diff --git a/samples/Support7Demos/src/main/res/layout/dialog_content.xml b/samples/AndroidXDemos/src/main/res/layout/dialog_content.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/dialog_content.xml
rename to samples/AndroidXDemos/src/main/res/layout/dialog_content.xml
diff --git a/samples/Support7Demos/src/main/res/layout/dialog_content_buttons.xml b/samples/AndroidXDemos/src/main/res/layout/dialog_content_buttons.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/dialog_content_buttons.xml
rename to samples/AndroidXDemos/src/main/res/layout/dialog_content_buttons.xml
diff --git a/samples/Support7Demos/src/main/res/layout/dialog_usage.xml b/samples/AndroidXDemos/src/main/res/layout/dialog_usage.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/dialog_usage.xml
rename to samples/AndroidXDemos/src/main/res/layout/dialog_usage.xml
diff --git a/samples/Support7Demos/src/main/res/layout/drawer_layout.xml b/samples/AndroidXDemos/src/main/res/layout/drawer_layout.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/drawer_layout.xml
rename to samples/AndroidXDemos/src/main/res/layout/drawer_layout.xml
diff --git a/samples/Support7Demos/src/main/res/layout/grid_layout_1.xml b/samples/AndroidXDemos/src/main/res/layout/grid_layout_1.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/grid_layout_1.xml
rename to samples/AndroidXDemos/src/main/res/layout/grid_layout_1.xml
diff --git a/samples/Support7Demos/src/main/res/layout/grid_layout_2.xml b/samples/AndroidXDemos/src/main/res/layout/grid_layout_2.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/grid_layout_2.xml
rename to samples/AndroidXDemos/src/main/res/layout/grid_layout_2.xml
diff --git a/samples/Support7Demos/src/main/res/layout/list_popup_window_activity.xml b/samples/AndroidXDemos/src/main/res/layout/list_popup_window_activity.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/list_popup_window_activity.xml
rename to samples/AndroidXDemos/src/main/res/layout/list_popup_window_activity.xml
diff --git a/samples/Support7Demos/src/main/res/layout/list_view_activity.xml b/samples/AndroidXDemos/src/main/res/layout/list_view_activity.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/list_view_activity.xml
rename to samples/AndroidXDemos/src/main/res/layout/list_view_activity.xml
diff --git a/samples/Support7Demos/src/main/res/layout/list_view_item.xml b/samples/AndroidXDemos/src/main/res/layout/list_view_item.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/list_view_item.xml
rename to samples/AndroidXDemos/src/main/res/layout/list_view_item.xml
diff --git a/samples/Support7Demos/src/main/res/layout/media_item.xml b/samples/AndroidXDemos/src/main/res/layout/media_item.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/media_item.xml
rename to samples/AndroidXDemos/src/main/res/layout/media_item.xml
diff --git a/samples/Support7Demos/src/main/res/layout/nested_item.xml b/samples/AndroidXDemos/src/main/res/layout/nested_item.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/nested_item.xml
rename to samples/AndroidXDemos/src/main/res/layout/nested_item.xml
diff --git a/samples/Support7Demos/src/main/res/layout/nsv_cl_appbar_activity.xml b/samples/AndroidXDemos/src/main/res/layout/nsv_cl_appbar_activity.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/nsv_cl_appbar_activity.xml
rename to samples/AndroidXDemos/src/main/res/layout/nsv_cl_appbar_activity.xml
diff --git a/samples/Support7Demos/src/main/res/layout/overlay_display_window.xml b/samples/AndroidXDemos/src/main/res/layout/overlay_display_window.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/overlay_display_window.xml
rename to samples/AndroidXDemos/src/main/res/layout/overlay_display_window.xml
diff --git a/samples/Support7Demos/src/main/res/layout/palette_activity_detail.xml b/samples/AndroidXDemos/src/main/res/layout/palette_activity_detail.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/palette_activity_detail.xml
rename to samples/AndroidXDemos/src/main/res/layout/palette_activity_detail.xml
diff --git a/samples/Support7Demos/src/main/res/layout/palette_grid_item.xml b/samples/AndroidXDemos/src/main/res/layout/palette_grid_item.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/palette_grid_item.xml
rename to samples/AndroidXDemos/src/main/res/layout/palette_grid_item.xml
diff --git a/samples/Support7Demos/src/main/res/layout/palette_list_item.xml b/samples/AndroidXDemos/src/main/res/layout/palette_list_item.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/palette_list_item.xml
rename to samples/AndroidXDemos/src/main/res/layout/palette_list_item.xml
diff --git a/samples/Support7Demos/src/main/res/layout/popup_menu_activity.xml b/samples/AndroidXDemos/src/main/res/layout/popup_menu_activity.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/popup_menu_activity.xml
rename to samples/AndroidXDemos/src/main/res/layout/popup_menu_activity.xml
diff --git a/samples/Support7Demos/src/main/res/layout/remove_large_items_demo.xml b/samples/AndroidXDemos/src/main/res/layout/remove_large_items_demo.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/remove_large_items_demo.xml
rename to samples/AndroidXDemos/src/main/res/layout/remove_large_items_demo.xml
diff --git a/samples/Support7Demos/src/main/res/layout/remove_large_items_demo_item.xml b/samples/AndroidXDemos/src/main/res/layout/remove_large_items_demo_item.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/remove_large_items_demo_item.xml
rename to samples/AndroidXDemos/src/main/res/layout/remove_large_items_demo_item.xml
diff --git a/samples/Support7Demos/src/main/res/layout/rv_cl_appbar_activity.xml b/samples/AndroidXDemos/src/main/res/layout/rv_cl_appbar_activity.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/rv_cl_appbar_activity.xml
rename to samples/AndroidXDemos/src/main/res/layout/rv_cl_appbar_activity.xml
diff --git a/samples/Support7Demos/src/main/res/layout/rv_cl_appbar_item.xml b/samples/AndroidXDemos/src/main/res/layout/rv_cl_appbar_item.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/rv_cl_appbar_item.xml
rename to samples/AndroidXDemos/src/main/res/layout/rv_cl_appbar_item.xml
diff --git a/samples/Support7Demos/src/main/res/layout/sample_media_controller.xml b/samples/AndroidXDemos/src/main/res/layout/sample_media_controller.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/sample_media_controller.xml
rename to samples/AndroidXDemos/src/main/res/layout/sample_media_controller.xml
diff --git a/samples/Support7Demos/src/main/res/layout/sample_media_router.xml b/samples/AndroidXDemos/src/main/res/layout/sample_media_router.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/sample_media_router.xml
rename to samples/AndroidXDemos/src/main/res/layout/sample_media_router.xml
diff --git a/samples/Support7Demos/src/main/res/layout/sample_media_router_presentation.xml b/samples/AndroidXDemos/src/main/res/layout/sample_media_router_presentation.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/sample_media_router_presentation.xml
rename to samples/AndroidXDemos/src/main/res/layout/sample_media_router_presentation.xml
diff --git a/samples/Support7Demos/src/main/res/layout/selectable_item.xml b/samples/AndroidXDemos/src/main/res/layout/selectable_item.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/selectable_item.xml
rename to samples/AndroidXDemos/src/main/res/layout/selectable_item.xml
diff --git a/samples/Support7Demos/src/main/res/layout/selection_demo_layout.xml b/samples/AndroidXDemos/src/main/res/layout/selection_demo_layout.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/selection_demo_layout.xml
rename to samples/AndroidXDemos/src/main/res/layout/selection_demo_layout.xml
diff --git a/samples/Support7Demos/src/main/res/layout/selection_demo_list_header.xml b/samples/AndroidXDemos/src/main/res/layout/selection_demo_list_header.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/selection_demo_list_header.xml
rename to samples/AndroidXDemos/src/main/res/layout/selection_demo_list_header.xml
diff --git a/samples/Support7Demos/src/main/res/layout/selection_demo_list_item.xml b/samples/AndroidXDemos/src/main/res/layout/selection_demo_list_item.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/selection_demo_list_item.xml
rename to samples/AndroidXDemos/src/main/res/layout/selection_demo_list_item.xml
diff --git a/samples/Support7Demos/src/main/res/layout/sorted_list_activity.xml b/samples/AndroidXDemos/src/main/res/layout/sorted_list_activity.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/sorted_list_activity.xml
rename to samples/AndroidXDemos/src/main/res/layout/sorted_list_activity.xml
diff --git a/samples/Support7Demos/src/main/res/layout/sorted_list_item_view.xml b/samples/AndroidXDemos/src/main/res/layout/sorted_list_item_view.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/sorted_list_item_view.xml
rename to samples/AndroidXDemos/src/main/res/layout/sorted_list_item_view.xml
diff --git a/samples/Support7Demos/src/main/res/layout/stable_id_item.xml b/samples/AndroidXDemos/src/main/res/layout/stable_id_item.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/stable_id_item.xml
rename to samples/AndroidXDemos/src/main/res/layout/stable_id_item.xml
diff --git a/samples/Support7Demos/src/main/res/layout/system_ui_modes.xml b/samples/AndroidXDemos/src/main/res/layout/system_ui_modes.xml
similarity index 98%
rename from samples/Support7Demos/src/main/res/layout/system_ui_modes.xml
rename to samples/AndroidXDemos/src/main/res/layout/system_ui_modes.xml
index 4408f6f..c4e48b5 100644
--- a/samples/Support7Demos/src/main/res/layout/system_ui_modes.xml
+++ b/samples/AndroidXDemos/src/main/res/layout/system_ui_modes.xml
@@ -20,7 +20,7 @@
 
     <view
         android:id="@+id/image"
-        class="com.example.android.supportv7.view.SystemUIModes$IV"
+        class="com.example.androidx.view.SystemUIModes$IV"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:scaleType="fitXY"
diff --git a/samples/Support7Demos/src/main/res/layout/toolbar_action_mode.xml b/samples/AndroidXDemos/src/main/res/layout/toolbar_action_mode.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/toolbar_action_mode.xml
rename to samples/AndroidXDemos/src/main/res/layout/toolbar_action_mode.xml
diff --git a/samples/Support7Demos/src/main/res/layout/toolbar_background_change.xml b/samples/AndroidXDemos/src/main/res/layout/toolbar_background_change.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/toolbar_background_change.xml
rename to samples/AndroidXDemos/src/main/res/layout/toolbar_background_change.xml
diff --git a/samples/Support7Demos/src/main/res/layout/toolbar_display_options.xml b/samples/AndroidXDemos/src/main/res/layout/toolbar_display_options.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/toolbar_display_options.xml
rename to samples/AndroidXDemos/src/main/res/layout/toolbar_display_options.xml
diff --git a/samples/Support7Demos/src/main/res/layout/toolbar_fragment_pager.xml b/samples/AndroidXDemos/src/main/res/layout/toolbar_fragment_pager.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/toolbar_fragment_pager.xml
rename to samples/AndroidXDemos/src/main/res/layout/toolbar_fragment_pager.xml
diff --git a/samples/Support7Demos/src/main/res/layout/toolbar_tall.xml b/samples/AndroidXDemos/src/main/res/layout/toolbar_tall.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/toolbar_tall.xml
rename to samples/AndroidXDemos/src/main/res/layout/toolbar_tall.xml
diff --git a/samples/Support7Demos/src/main/res/layout/toolbar_usage.xml b/samples/AndroidXDemos/src/main/res/layout/toolbar_usage.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/toolbar_usage.xml
rename to samples/AndroidXDemos/src/main/res/layout/toolbar_usage.xml
diff --git a/samples/Support7Demos/src/main/res/layout/touch_item.xml b/samples/AndroidXDemos/src/main/res/layout/touch_item.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/layout/touch_item.xml
rename to samples/AndroidXDemos/src/main/res/layout/touch_item.xml
diff --git a/samples/Support7Demos/src/main/res/menu/action_bar_settings_action_provider.xml b/samples/AndroidXDemos/src/main/res/menu/action_bar_settings_action_provider.xml
similarity index 80%
rename from samples/Support7Demos/src/main/res/menu/action_bar_settings_action_provider.xml
rename to samples/AndroidXDemos/src/main/res/menu/action_bar_settings_action_provider.xml
index e9bb931..21051b55 100644
--- a/samples/Support7Demos/src/main/res/menu/action_bar_settings_action_provider.xml
+++ b/samples/AndroidXDemos/src/main/res/menu/action_bar_settings_action_provider.xml
@@ -18,10 +18,10 @@
     <item android:id="@+id/menu_item_action_provider_action_bar"
         android:title="@string/action_bar_settings"
         app:showAsAction="ifRoom"
-        app:actionProviderClass="com.example.android.supportv7.app.ActionBarSettingsActionProviderActivity$SettingsActionProvider"/>
+        app:actionProviderClass="com.example.androidx.app.ActionBarSettingsActionProviderActivity$SettingsActionProvider"/>
 
     <item android:id="@+id/menu_item_action_provider_overflow"
         android:title="@string/action_bar_settings"
         app:showAsAction="never"
-        app:actionProviderClass="com.example.android.supportv7.app.ActionBarSettingsActionProviderActivity$SettingsActionProvider"/>
+        app:actionProviderClass="com.example.androidx.app.ActionBarSettingsActionProviderActivity$SettingsActionProvider"/>
 </menu>
diff --git a/samples/Support7Demos/src/main/res/menu/action_bar_share_action_provider.xml b/samples/AndroidXDemos/src/main/res/menu/action_bar_share_action_provider.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/menu/action_bar_share_action_provider.xml
rename to samples/AndroidXDemos/src/main/res/menu/action_bar_share_action_provider.xml
diff --git a/samples/Support7Demos/src/main/res/menu/actions.xml b/samples/AndroidXDemos/src/main/res/menu/actions.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/menu/actions.xml
rename to samples/AndroidXDemos/src/main/res/menu/actions.xml
diff --git a/samples/Support7Demos/src/main/res/menu/content_actions.xml b/samples/AndroidXDemos/src/main/res/menu/content_actions.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/menu/content_actions.xml
rename to samples/AndroidXDemos/src/main/res/menu/content_actions.xml
diff --git a/samples/Support7Demos/src/main/res/menu/display_options_actions.xml b/samples/AndroidXDemos/src/main/res/menu/display_options_actions.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/menu/display_options_actions.xml
rename to samples/AndroidXDemos/src/main/res/menu/display_options_actions.xml
diff --git a/samples/Support7Demos/src/main/res/menu/menu_with_tinted_icons.xml b/samples/AndroidXDemos/src/main/res/menu/menu_with_tinted_icons.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/menu/menu_with_tinted_icons.xml
rename to samples/AndroidXDemos/src/main/res/menu/menu_with_tinted_icons.xml
diff --git a/samples/Support7Demos/src/main/res/menu/popup_menu.xml b/samples/AndroidXDemos/src/main/res/menu/popup_menu.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/menu/popup_menu.xml
rename to samples/AndroidXDemos/src/main/res/menu/popup_menu.xml
diff --git a/samples/Support7Demos/src/main/res/menu/sample_media_router_menu.xml b/samples/AndroidXDemos/src/main/res/menu/sample_media_router_menu.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/menu/sample_media_router_menu.xml
rename to samples/AndroidXDemos/src/main/res/menu/sample_media_router_menu.xml
diff --git a/samples/Support7Demos/src/main/res/menu/sample_palette_actions.xml b/samples/AndroidXDemos/src/main/res/menu/sample_palette_actions.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/menu/sample_palette_actions.xml
rename to samples/AndroidXDemos/src/main/res/menu/sample_palette_actions.xml
diff --git a/samples/Support7Demos/src/main/res/menu/selection_demo_actions.xml b/samples/AndroidXDemos/src/main/res/menu/selection_demo_actions.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/menu/selection_demo_actions.xml
rename to samples/AndroidXDemos/src/main/res/menu/selection_demo_actions.xml
diff --git a/samples/Support7Demos/src/main/res/menu/selection_demo_item_actions.xml b/samples/AndroidXDemos/src/main/res/menu/selection_demo_item_actions.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/menu/selection_demo_item_actions.xml
rename to samples/AndroidXDemos/src/main/res/menu/selection_demo_item_actions.xml
diff --git a/samples/Support7Demos/src/main/res/menu/single_action.xml b/samples/AndroidXDemos/src/main/res/menu/single_action.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/menu/single_action.xml
rename to samples/AndroidXDemos/src/main/res/menu/single_action.xml
diff --git a/samples/Support7Demos/src/main/res/values-land/integers.xml b/samples/AndroidXDemos/src/main/res/values-land/integers.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/values-land/integers.xml
rename to samples/AndroidXDemos/src/main/res/values-land/integers.xml
diff --git a/samples/Support7Demos/src/main/res/values-night/colors.xml b/samples/AndroidXDemos/src/main/res/values-night/colors.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/values-night/colors.xml
rename to samples/AndroidXDemos/src/main/res/values-night/colors.xml
diff --git a/samples/Support7Demos/src/main/res/values-night/strings.xml b/samples/AndroidXDemos/src/main/res/values-night/strings.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/values-night/strings.xml
rename to samples/AndroidXDemos/src/main/res/values-night/strings.xml
diff --git a/samples/Support7Demos/src/main/res/values-v18/bools.xml b/samples/AndroidXDemos/src/main/res/values-v18/bools.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/values-v18/bools.xml
rename to samples/AndroidXDemos/src/main/res/values-v18/bools.xml
diff --git a/samples/Support7Demos/src/main/res/values-v21/styles.xml b/samples/AndroidXDemos/src/main/res/values-v21/styles.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/values-v21/styles.xml
rename to samples/AndroidXDemos/src/main/res/values-v21/styles.xml
diff --git a/samples/Support7Demos/src/main/res/values/arrays.xml b/samples/AndroidXDemos/src/main/res/values/arrays.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/values/arrays.xml
rename to samples/AndroidXDemos/src/main/res/values/arrays.xml
diff --git a/samples/Support7Demos/src/main/res/values/bools.xml b/samples/AndroidXDemos/src/main/res/values/bools.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/values/bools.xml
rename to samples/AndroidXDemos/src/main/res/values/bools.xml
diff --git a/samples/Support7Demos/src/main/res/values/colors.xml b/samples/AndroidXDemos/src/main/res/values/colors.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/values/colors.xml
rename to samples/AndroidXDemos/src/main/res/values/colors.xml
diff --git a/samples/Support7Demos/src/main/res/values/dimens.xml b/samples/AndroidXDemos/src/main/res/values/dimens.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/values/dimens.xml
rename to samples/AndroidXDemos/src/main/res/values/dimens.xml
diff --git a/samples/Support7Demos/src/main/res/values/integers.xml b/samples/AndroidXDemos/src/main/res/values/integers.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/values/integers.xml
rename to samples/AndroidXDemos/src/main/res/values/integers.xml
diff --git a/samples/Support7Demos/src/main/res/values/strings.xml b/samples/AndroidXDemos/src/main/res/values/strings.xml
similarity index 98%
rename from samples/Support7Demos/src/main/res/values/strings.xml
rename to samples/AndroidXDemos/src/main/res/values/strings.xml
index 2f2c722..5844c3d 100644
--- a/samples/Support7Demos/src/main/res/values/strings.xml
+++ b/samples/AndroidXDemos/src/main/res/values/strings.xml
@@ -15,7 +15,7 @@
 -->
 
 <resources>
-    <string name="activity_sample_code">Support v7 Demos</string>
+    <string name="activity_sample_code">AndroidX Demos</string>
 
     <!-- MediaRouter -->
 
@@ -45,7 +45,7 @@
     <string name="variable_volume_session_route_name">Variable Volume (Session) Remote Playback Route</string>
     <string name="variable_volume_route_group_name">Variable Volume Route Group</string>
     <string name="mixed_volume_route_group_name">Mixed Volume Route Group</string>
-    <string name="sample_route_description">Sample route from Support7Demos</string>
+    <string name="sample_route_description">Sample route from AndroidXDemos</string>
 
     <string name="sample_dynamic_group_mrp_service">Media Route Provider Service Support Library Sample (supporting dynamic group)</string>
     <string name="dg_tv_route_name1">Dynamic Route 1 - TV</string>
diff --git a/samples/Support7Demos/src/main/res/values/styles.xml b/samples/AndroidXDemos/src/main/res/values/styles.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/values/styles.xml
rename to samples/AndroidXDemos/src/main/res/values/styles.xml
diff --git a/samples/Support7Demos/src/main/res/xml/preferences.xml b/samples/AndroidXDemos/src/main/res/xml/preferences.xml
similarity index 100%
rename from samples/Support7Demos/src/main/res/xml/preferences.xml
rename to samples/AndroidXDemos/src/main/res/xml/preferences.xml
diff --git a/samples/Support7Demos/src/main/res/xml/searchable.xml b/samples/AndroidXDemos/src/main/res/xml/searchable.xml
similarity index 89%
rename from samples/Support7Demos/src/main/res/xml/searchable.xml
rename to samples/AndroidXDemos/src/main/res/xml/searchable.xml
index 7f0fa74..811fc32 100644
--- a/samples/Support7Demos/src/main/res/xml/searchable.xml
+++ b/samples/AndroidXDemos/src/main/res/xml/searchable.xml
@@ -18,5 +18,5 @@
 <searchable xmlns:android="http://schemas.android.com/apk/res/android"
             android:label="@string/activity_sample_code"
             android:hint="@string/search_hint"
-            android:searchSuggestAuthority="com.example.android.supportv7.RecentSuggestionsProvider"
+            android:searchSuggestAuthority="com.example.androidx.RecentSuggestionsProvider"
             android:searchSuggestSelection=" ?" />
\ No newline at end of file
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoDetailsLookup.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoDetailsLookup.java
deleted file mode 100644
index 51e39c1..0000000
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoDetailsLookup.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.example.android.supportv7.widget.selection.simple;
-
-import android.view.MotionEvent;
-import android.view.View;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.recyclerview.selection.ItemDetailsLookup;
-import androidx.recyclerview.widget.RecyclerView;
-import androidx.recyclerview.widget.RecyclerView.ViewHolder;
-
-/**
- * Access to details of an item associated with a {@link MotionEvent} instance.
- */
-final class DemoDetailsLookup extends ItemDetailsLookup<Long> {
-
-    private final RecyclerView mRecView;
-
-    DemoDetailsLookup(RecyclerView view) {
-        mRecView = view;
-    }
-
-    @Override
-    public ItemDetails<Long> getItemDetails(@NonNull MotionEvent e) {
-        @Nullable View view = mRecView.findChildViewUnder(e.getX(), e.getY());
-        if (view != null) {
-            ViewHolder holder = mRecView.getChildViewHolder(view);
-            if (holder instanceof DemoHolder) {
-                return ((DemoHolder) holder).getItemDetails();
-            }
-        }
-        return null;
-    }
-}
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoHolder.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoHolder.java
deleted file mode 100644
index ab0ffa8..0000000
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoHolder.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.example.android.supportv7.widget.selection.simple;
-
-import android.graphics.Rect;
-import android.view.MotionEvent;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.example.android.supportv7.R;
-
-final class DemoHolder extends RecyclerView.ViewHolder {
-
-    private final LinearLayout mContainer;
-    private final TextView mSelector;
-    private final TextView mLabel;
-    private final ItemDetails<Long> mDetails;
-
-    DemoHolder(LinearLayout layout) {
-        super(layout);
-        mContainer = layout.findViewById(R.id.container);
-        mSelector = layout.findViewById(R.id.selector);
-        mLabel = layout.findViewById(R.id.label);
-        mDetails = new ItemDetails<Long>() {
-            @Override
-            public int getPosition() {
-                return DemoHolder.this.getAbsoluteAdapterPosition();
-            }
-
-            @Override
-            public Long getSelectionKey() {
-                return DemoHolder.this.getItemId();
-            }
-
-            @Override
-            public boolean inDragRegion(@NonNull MotionEvent e) {
-                return DemoHolder.this.inDragRegion(e);
-            }
-
-            @Override
-            public boolean inSelectionHotspot(@NonNull MotionEvent e) {
-                return DemoHolder.this.inSelectRegion(e);
-            }
-        };
-    }
-
-    void update(String label, boolean selected) {
-        mLabel.setText(label);
-        setSelected(selected);
-    }
-
-    private void setSelected(boolean selected) {
-        mContainer.setActivated(selected);
-        mSelector.setActivated(selected);
-    }
-
-    boolean inDragRegion(MotionEvent event) {
-        // If itemView is activated = selected, then whole region is interactive
-        if (itemView.isActivated()) {
-            return true;
-        }
-
-        // Do everything in global coordinates - it makes things simpler.
-        int[] coords = new int[2];
-        mSelector.getLocationOnScreen(coords);
-
-        Rect textBounds = new Rect();
-        mLabel.getPaint().getTextBounds(
-                mLabel.getText().toString(), 0, mLabel.getText().length(), textBounds);
-
-        Rect rect = new Rect(
-                coords[0],
-                coords[1],
-                coords[0] + mSelector.getWidth() + textBounds.width(),
-                coords[1] + Math.max(mSelector.getHeight(), textBounds.height()));
-
-        // If the tap occurred inside icon or the text, these are interactive spots.
-        return rect.contains((int) event.getRawX(), (int) event.getRawY());
-    }
-
-    boolean inSelectRegion(MotionEvent e) {
-        Rect iconRect = new Rect();
-        mSelector.getGlobalVisibleRect(iconRect);
-        return iconRect.contains((int) e.getRawX(), (int) e.getRawY());
-    }
-
-    ItemDetails<Long> getItemDetails() {
-        return mDetails;
-    }
-}
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoAdapter.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoAdapter.java
deleted file mode 100644
index b56858d..0000000
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoAdapter.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.example.android.supportv7.widget.selection.single;
-
-import static androidx.core.util.Preconditions.checkArgument;
-
-import android.content.Context;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.LinearLayout;
-
-import androidx.annotation.NonNull;
-import androidx.recyclerview.selection.SelectionTracker;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.R;
-
-final class DemoAdapter extends RecyclerView.Adapter<DemoHolder> {
-
-    private static final String TAG = "SelectionDemos";
-    private final Context mContext;
-
-    // This should be replaced at "bind" time with a real test that
-    // asks SelectionTracker.
-    private SelectionTest mSelTest;
-
-    DemoAdapter(Context context) {
-        mContext = context;
-        mSelTest = id -> {
-            throw new IllegalStateException(
-                    "Adapter must be initialized with SelectionTracker.");
-        };
-    }
-
-    // Glue together SelectionTracker and the adapter.
-    public void bindSelectionHelper(final SelectionTracker<Long> selectionTracker) {
-        checkArgument(selectionTracker != null);
-        mSelTest = selectionTracker::isSelected;
-    }
-
-    void loadData() {
-        onDataReady();
-    }
-
-    private void onDataReady() {
-        notifyDataSetChanged();
-    }
-
-    @Override
-    public int getItemCount() {
-        return Cheeses.sCheeseStrings.length;
-    }
-
-    @Override
-    public long getItemId(int position) {
-        return position;
-    }
-
-    @Override
-    public void onBindViewHolder(DemoHolder holder, int position) {
-        Long key = getItemId(position);
-        Log.v(TAG, "Just before rendering item position=" + position + ", key=" + key);
-        holder.update(Cheeses.sCheeseStrings[position], mSelTest.isSelected(key));
-    }
-
-    @Override
-    public DemoHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
-        LinearLayout layout = inflateLayout(mContext, parent, R.layout.selection_demo_list_item);
-        return new DemoHolder(layout);
-    }
-
-    @SuppressWarnings("TypeParameterUnusedInFormals")  // Convenience to avoid clumsy cast.
-    private static <V extends View> V inflateLayout(
-            Context context, ViewGroup parent, int layout) {
-
-        return (V) LayoutInflater.from(context).inflate(layout, parent, false);
-    }
-
-    private interface SelectionTest {
-        boolean isSelected(Long id);
-    }
-}
diff --git a/settings.gradle b/settings.gradle
index 8c59bad..06f39d7 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -381,6 +381,7 @@
 includeProject(":autofill:autofill", [BuildType.MAIN])
 includeProject(":benchmark:benchmark-benchmark", "benchmark/benchmark", [BuildType.MAIN, BuildType.COMPOSE])
 includeProject(":benchmark:benchmark-common")
+includeProject(":benchmark:benchmark-darwin", [BuildType.KMP])
 includeProject(":benchmark:benchmark-darwin-core", [BuildType.KMP])
 includeProject(":benchmark:benchmark-gradle-plugin", "benchmark/gradle-plugin", [BuildType.MAIN])
 includeProject(":benchmark:benchmark-junit4")
@@ -450,8 +451,7 @@
 includeProject(":cardview:cardview", [BuildType.MAIN])
 includeProject(":collection:collection", [BuildType.MAIN, BuildType.KMP])
 includeProject(":collection:collection-benchmark", [BuildType.MAIN, BuildType.KMP])
-includeProject(":collection:collection-benchmark-js", [BuildType.MAIN, BuildType.KMP])
-includeProject(":collection:collection-benchmark-native", [BuildType.MAIN, BuildType.KMP])
+includeProject(":collection:collection-benchmark-kmp", [BuildType.MAIN, BuildType.KMP])
 includeProject(":collection:collection-ktx", [BuildType.MAIN, BuildType.KMP])
 includeProject(":collection:integration-tests:testapp", [BuildType.MAIN, BuildType.KMP])
 includeProject(":compose:animation", [BuildType.COMPOSE])
@@ -860,6 +860,7 @@
 includeProject(":transition:transition-ktx", [BuildType.MAIN, BuildType.FLAN])
 includeProject(":tv:tv-foundation", [BuildType.COMPOSE])
 includeProject(":tv:tv-material", [BuildType.COMPOSE])
+includeProject(":tv:tv-material-samples", "tv/tv-material/samples", [BuildType.COMPOSE])
 includeProject(":tvprovider:tvprovider", [BuildType.MAIN])
 includeProject(":vectordrawable:integration-tests:testapp", [BuildType.MAIN])
 includeProject(":vectordrawable:vectordrawable", [BuildType.MAIN])
@@ -952,6 +953,7 @@
 
 // Note: don't add new samples/ apps. Instead, Create
 // <module>/integration-tests/testapp in the "Libraries" section above.
+includeProject(":androidx-demos", new File(samplesRoot, "AndroidXDemos"), [BuildType.MAIN])
 includeProject(":support-animation-demos", new File(samplesRoot, "SupportAnimationDemos"), [BuildType.MAIN])
 includeProject(":support-content-demos", new File(samplesRoot, "SupportContentDemos"), [BuildType.MAIN])
 includeProject(":support-emoji-demos", new File(samplesRoot, "SupportEmojiDemos"), [BuildType.MAIN])
@@ -961,7 +963,6 @@
 includeProject(":support-slices-demos", new File(samplesRoot, "SupportSliceDemos"), [BuildType.MAIN])
 includeProject(":support-transition-demos", new File(samplesRoot, "SupportTransitionDemos"), [BuildType.MAIN])
 includeProject(":support-v4-demos", new File(samplesRoot, "Support4Demos"), [BuildType.MAIN])
-includeProject(":support-v7-demos", new File(samplesRoot, "Support7Demos"), [BuildType.MAIN])
 includeProject(":support-wear-demos", new File(samplesRoot, "SupportWearDemos"), [BuildType.MAIN])
 
 /////////////////////////////
diff --git a/sqlite/integration-tests/inspection-room-testapp/src/androidTest/java/androidx/sqlite/inspection/RoomInvalidationHookTest.kt b/sqlite/integration-tests/inspection-room-testapp/src/androidTest/java/androidx/sqlite/inspection/RoomInvalidationHookTest.kt
index 6c745b8..57ef857 100644
--- a/sqlite/integration-tests/inspection-room-testapp/src/androidTest/java/androidx/sqlite/inspection/RoomInvalidationHookTest.kt
+++ b/sqlite/integration-tests/inspection-room-testapp/src/androidTest/java/androidx/sqlite/inspection/RoomInvalidationHookTest.kt
@@ -132,7 +132,7 @@
     val supportDb = this.openHelper.writableDatabase
     // this runs with defaults so we can extract db from it until inspection supports support
     // instances directly
-    return supportDb::class.java.getDeclaredField("mDelegate").let {
+    return supportDb::class.java.getDeclaredField("delegate").let {
         it.isAccessible = true
         it.get(supportDb)
     } as SQLiteDatabase
diff --git a/sqlite/sqlite-framework/api/current.txt b/sqlite/sqlite-framework/api/current.txt
index 526c565..f7d3aae 100644
--- a/sqlite/sqlite-framework/api/current.txt
+++ b/sqlite/sqlite-framework/api/current.txt
@@ -3,7 +3,7 @@
 
   public final class FrameworkSQLiteOpenHelperFactory implements androidx.sqlite.db.SupportSQLiteOpenHelper.Factory {
     ctor public FrameworkSQLiteOpenHelperFactory();
-    method public androidx.sqlite.db.SupportSQLiteOpenHelper create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration);
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration configuration);
   }
 
 }
diff --git a/sqlite/sqlite-framework/api/public_plus_experimental_current.txt b/sqlite/sqlite-framework/api/public_plus_experimental_current.txt
index 526c565..f7d3aae 100644
--- a/sqlite/sqlite-framework/api/public_plus_experimental_current.txt
+++ b/sqlite/sqlite-framework/api/public_plus_experimental_current.txt
@@ -3,7 +3,7 @@
 
   public final class FrameworkSQLiteOpenHelperFactory implements androidx.sqlite.db.SupportSQLiteOpenHelper.Factory {
     ctor public FrameworkSQLiteOpenHelperFactory();
-    method public androidx.sqlite.db.SupportSQLiteOpenHelper create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration);
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration configuration);
   }
 
 }
diff --git a/sqlite/sqlite-framework/api/restricted_current.txt b/sqlite/sqlite-framework/api/restricted_current.txt
index 526c565..f7d3aae 100644
--- a/sqlite/sqlite-framework/api/restricted_current.txt
+++ b/sqlite/sqlite-framework/api/restricted_current.txt
@@ -3,7 +3,7 @@
 
   public final class FrameworkSQLiteOpenHelperFactory implements androidx.sqlite.db.SupportSQLiteOpenHelper.Factory {
     ctor public FrameworkSQLiteOpenHelperFactory();
-    method public androidx.sqlite.db.SupportSQLiteOpenHelper create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration);
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration configuration);
   }
 
 }
diff --git a/sqlite/sqlite-framework/src/androidTest/java/androidx/sqlite/db/framework/OpenHelperRecoveryTest.kt b/sqlite/sqlite-framework/src/androidTest/java/androidx/sqlite/db/framework/OpenHelperRecoveryTest.kt
index eca7a3b..bd32a62 100644
--- a/sqlite/sqlite-framework/src/androidTest/java/androidx/sqlite/db/framework/OpenHelperRecoveryTest.kt
+++ b/sqlite/sqlite-framework/src/androidTest/java/androidx/sqlite/db/framework/OpenHelperRecoveryTest.kt
@@ -18,6 +18,7 @@
 
 import android.content.Context
 import android.database.sqlite.SQLiteException
+import android.os.Build
 import androidx.sqlite.db.SupportSQLiteDatabase
 import androidx.sqlite.db.SupportSQLiteOpenHelper
 import androidx.test.core.app.ApplicationProvider
@@ -37,6 +38,28 @@
     fun setup() {
         context.deleteDatabase(dbName)
     }
+    @Test
+    fun delegateLaziness() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+            val openHelper = FrameworkSQLiteOpenHelper(
+                context,
+                dbName,
+                EmptyCallback(),
+                false,
+                false
+            )
+            openHelper.setWriteAheadLoggingEnabled(true)
+
+            val dbFileBeforeWritable = context.getDatabasePath(dbName)
+            assertThat(dbFileBeforeWritable.exists()).isFalse()
+
+            val writableDb = openHelper.writableDatabase
+            val dbFileAfterWritable = context.getDatabasePath(dbName)
+
+            assertThat(dbFileAfterWritable.exists()).isTrue()
+            assertThat(writableDb.isWriteAheadLoggingEnabled).isTrue()
+        }
+    }
 
     @Test
     fun writeOver() {
diff --git a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.java b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.java
deleted file mode 100644
index a07a5c7..0000000
--- a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.sqlite.db.framework;
-
-import static android.text.TextUtils.isEmpty;
-
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.database.SQLException;
-import android.database.sqlite.SQLiteCursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteTransactionListener;
-import android.os.Build;
-import android.os.CancellationSignal;
-import android.util.Pair;
-
-import androidx.annotation.DoNotInline;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.sqlite.db.SimpleSQLiteQuery;
-import androidx.sqlite.db.SupportSQLiteCompat;
-import androidx.sqlite.db.SupportSQLiteDatabase;
-import androidx.sqlite.db.SupportSQLiteQuery;
-import androidx.sqlite.db.SupportSQLiteStatement;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * Delegates all calls to an implementation of {@link SQLiteDatabase}.
- */
-@SuppressWarnings("unused")
-class FrameworkSQLiteDatabase implements SupportSQLiteDatabase {
-    private static final String[] CONFLICT_VALUES = new String[]
-            {"", " OR ROLLBACK ", " OR ABORT ", " OR FAIL ", " OR IGNORE ", " OR REPLACE "};
-    private static final String[] EMPTY_STRING_ARRAY = new String[0];
-
-    private final SQLiteDatabase mDelegate;
-
-    /**
-     * Creates a wrapper around {@link SQLiteDatabase}.
-     *
-     * @param delegate The delegate to receive all calls.
-     */
-    FrameworkSQLiteDatabase(SQLiteDatabase delegate) {
-        mDelegate = delegate;
-    }
-
-    @NonNull
-    @Override
-    public SupportSQLiteStatement compileStatement(@NonNull String sql) {
-        return new FrameworkSQLiteStatement(mDelegate.compileStatement(sql));
-    }
-
-    @Override
-    public void beginTransaction() {
-        mDelegate.beginTransaction();
-    }
-
-    @Override
-    public void beginTransactionNonExclusive() {
-        mDelegate.beginTransactionNonExclusive();
-    }
-
-    @Override
-    public void beginTransactionWithListener(
-            @NonNull SQLiteTransactionListener transactionListener) {
-        mDelegate.beginTransactionWithListener(transactionListener);
-    }
-
-    @Override
-    public void beginTransactionWithListenerNonExclusive(
-            @NonNull SQLiteTransactionListener transactionListener) {
-        mDelegate.beginTransactionWithListenerNonExclusive(transactionListener);
-    }
-
-    @Override
-    public void endTransaction() {
-        mDelegate.endTransaction();
-    }
-
-    @Override
-    public void setTransactionSuccessful() {
-        mDelegate.setTransactionSuccessful();
-    }
-
-    @Override
-    public boolean inTransaction() {
-        return mDelegate.inTransaction();
-    }
-
-    @Override
-    public boolean isDbLockedByCurrentThread() {
-        return mDelegate.isDbLockedByCurrentThread();
-    }
-
-    @Override
-    public boolean yieldIfContendedSafely() {
-        return mDelegate.yieldIfContendedSafely();
-    }
-
-    @Override
-    public boolean yieldIfContendedSafely(long sleepAfterYieldDelay) {
-        return mDelegate.yieldIfContendedSafely(sleepAfterYieldDelay);
-    }
-
-    @Override
-    public boolean isExecPerConnectionSQLSupported() {
-        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.R;
-    }
-
-    @Override
-    public void execPerConnectionSQL(@NonNull String sql, @Nullable Object[] bindArgs) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
-            Api30Impl.execPerConnectionSQL(mDelegate, sql, bindArgs);
-        } else {
-            throw new UnsupportedOperationException("execPerConnectionSQL is not supported on a "
-                    + "SDK version lower than 30, current version is: " + Build.VERSION.SDK_INT);
-        }
-    }
-
-    @Override
-    public int getVersion() {
-        return mDelegate.getVersion();
-    }
-
-    @Override
-    public void setVersion(int version) {
-        mDelegate.setVersion(version);
-    }
-
-    @Override
-    public long getMaximumSize() {
-        return mDelegate.getMaximumSize();
-    }
-
-    @Override
-    public long setMaximumSize(long numBytes) {
-        return mDelegate.setMaximumSize(numBytes);
-    }
-
-    @Override
-    public long getPageSize() {
-        return mDelegate.getPageSize();
-    }
-
-    @Override
-    public void setPageSize(long numBytes) {
-        mDelegate.setPageSize(numBytes);
-    }
-
-    @Override
-    public @NonNull Cursor query(@NonNull String query) {
-        return query(new SimpleSQLiteQuery(query));
-    }
-
-    @Override
-    public @NonNull Cursor query(@NonNull String query, @NonNull Object[] bindArgs) {
-        return query(new SimpleSQLiteQuery(query, bindArgs));
-    }
-
-    @Override
-    public @NonNull Cursor query(@NonNull final SupportSQLiteQuery supportQuery) {
-        return mDelegate.rawQueryWithFactory((db, masterQuery, editTable, query) -> {
-            supportQuery.bindTo(new FrameworkSQLiteProgram(query));
-            return new SQLiteCursor(masterQuery, editTable, query);
-        }, supportQuery.getSql(), EMPTY_STRING_ARRAY, null);
-    }
-
-    @Override
-    @RequiresApi(16)
-    public @NonNull Cursor query(@NonNull final SupportSQLiteQuery supportQuery,
-            CancellationSignal cancellationSignal) {
-        return SupportSQLiteCompat.Api16Impl.rawQueryWithFactory(mDelegate, supportQuery.getSql(),
-                EMPTY_STRING_ARRAY, null, cancellationSignal,
-                (db, masterQuery, editTable, query) -> {
-                    supportQuery.bindTo(new FrameworkSQLiteProgram(query));
-                    return new SQLiteCursor(masterQuery, editTable, query);
-                });
-    }
-
-    @Override
-    public long insert(@NonNull String table, int conflictAlgorithm, @NonNull ContentValues values)
-            throws SQLException {
-        return mDelegate.insertWithOnConflict(table, null, values,
-                conflictAlgorithm);
-    }
-
-    @Override
-    public int delete(@NonNull String table, String whereClause, Object[] whereArgs) {
-        String query = "DELETE FROM " + table
-                + (isEmpty(whereClause) ? "" : " WHERE " + whereClause);
-        SupportSQLiteStatement statement = compileStatement(query);
-        SimpleSQLiteQuery.bind(statement, whereArgs);
-        return statement.executeUpdateDelete();
-    }
-
-
-    @Override
-    public int update(@NonNull String table, int conflictAlgorithm, ContentValues values,
-            String whereClause, Object[] whereArgs) {
-        // taken from SQLiteDatabase class.
-        if (values == null || values.size() == 0) {
-            throw new IllegalArgumentException("Empty values");
-        }
-        StringBuilder sql = new StringBuilder(120);
-        sql.append("UPDATE ");
-        sql.append(CONFLICT_VALUES[conflictAlgorithm]);
-        sql.append(table);
-        sql.append(" SET ");
-
-        // move all bind args to one array
-        int setValuesSize = values.size();
-        int bindArgsSize = (whereArgs == null) ? setValuesSize : (setValuesSize + whereArgs.length);
-        Object[] bindArgs = new Object[bindArgsSize];
-        int i = 0;
-        for (String colName : values.keySet()) {
-            sql.append((i > 0) ? "," : "");
-            sql.append(colName);
-            bindArgs[i++] = values.get(colName);
-            sql.append("=?");
-        }
-        if (whereArgs != null) {
-            for (i = setValuesSize; i < bindArgsSize; i++) {
-                bindArgs[i] = whereArgs[i - setValuesSize];
-            }
-        }
-        if (!isEmpty(whereClause)) {
-            sql.append(" WHERE ");
-            sql.append(whereClause);
-        }
-        SupportSQLiteStatement stmt = compileStatement(sql.toString());
-        SimpleSQLiteQuery.bind(stmt, bindArgs);
-        return stmt.executeUpdateDelete();
-    }
-
-    @Override
-    public void execSQL(@NonNull String sql) throws SQLException {
-        mDelegate.execSQL(sql);
-    }
-
-    @Override
-    public void execSQL(@NonNull String sql, Object[] bindArgs) throws SQLException {
-        mDelegate.execSQL(sql, bindArgs);
-    }
-
-    @Override
-    public boolean isReadOnly() {
-        return mDelegate.isReadOnly();
-    }
-
-    @Override
-    public boolean isOpen() {
-        return mDelegate.isOpen();
-    }
-
-    @Override
-    public boolean needUpgrade(int newVersion) {
-        return mDelegate.needUpgrade(newVersion);
-    }
-
-    @Override
-    public String getPath() {
-        return mDelegate.getPath();
-    }
-
-    @Override
-    public void setLocale(@NonNull Locale locale) {
-        mDelegate.setLocale(locale);
-    }
-
-    @Override
-    public void setMaxSqlCacheSize(int cacheSize) {
-        mDelegate.setMaxSqlCacheSize(cacheSize);
-    }
-
-    @Override
-    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
-    public void setForeignKeyConstraintsEnabled(boolean enable) {
-        SupportSQLiteCompat.Api16Impl.setForeignKeyConstraintsEnabled(mDelegate, enable);
-    }
-
-    @Override
-    public boolean enableWriteAheadLogging() {
-        return mDelegate.enableWriteAheadLogging();
-    }
-
-    @Override
-    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
-    public void disableWriteAheadLogging() {
-        SupportSQLiteCompat.Api16Impl.disableWriteAheadLogging(mDelegate);
-    }
-
-    @Override
-    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
-    public boolean isWriteAheadLoggingEnabled() {
-        return SupportSQLiteCompat.Api16Impl.isWriteAheadLoggingEnabled(mDelegate);
-    }
-
-    @Override
-    public List<Pair<String, String>> getAttachedDbs() {
-        return mDelegate.getAttachedDbs();
-    }
-
-    @Override
-    public boolean isDatabaseIntegrityOk() {
-        return mDelegate.isDatabaseIntegrityOk();
-    }
-
-    @Override
-    public void close() throws IOException {
-        mDelegate.close();
-    }
-
-    /**
-     * Checks if this object delegates to the same given database reference.
-     */
-    boolean isDelegate(SQLiteDatabase sqLiteDatabase) {
-        return mDelegate == sqLiteDatabase;
-    }
-
-    @RequiresApi(30)
-    static class Api30Impl {
-        private Api30Impl() {
-            // This class is not instantiable.
-        }
-
-        @DoNotInline
-        static void execPerConnectionSQL(SQLiteDatabase sQLiteDatabase, String sql,
-                Object[] bindArgs) {
-            sQLiteDatabase.execPerConnectionSQL(sql, bindArgs);
-        }
-    }
-}
diff --git a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.kt b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.kt
new file mode 100644
index 0000000..b3e2af9
--- /dev/null
+++ b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.kt
@@ -0,0 +1,337 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.sqlite.db.framework
+
+import android.content.ContentValues
+import android.database.Cursor
+import android.database.SQLException
+import android.database.sqlite.SQLiteCursor
+import android.database.sqlite.SQLiteCursorDriver
+import android.database.sqlite.SQLiteDatabase
+import android.database.sqlite.SQLiteQuery
+import android.database.sqlite.SQLiteTransactionListener
+import android.os.Build
+import android.os.CancellationSignal
+import android.text.TextUtils
+import android.util.Pair
+import androidx.annotation.DoNotInline
+import androidx.annotation.RequiresApi
+import androidx.sqlite.db.SimpleSQLiteQuery
+import androidx.sqlite.db.SupportSQLiteCompat
+import androidx.sqlite.db.SupportSQLiteDatabase
+import androidx.sqlite.db.SupportSQLiteQuery
+import androidx.sqlite.db.SupportSQLiteStatement
+import java.io.IOException
+import java.util.Locale
+
+/**
+ * Delegates all calls to an implementation of [SQLiteDatabase].
+ *
+ * @constructor Creates a wrapper around [SQLiteDatabase].
+ *
+ * @param delegate The delegate to receive all calls.
+ */
+internal class FrameworkSQLiteDatabase(
+    private val delegate: SQLiteDatabase
+) : SupportSQLiteDatabase {
+    override fun compileStatement(sql: String): SupportSQLiteStatement {
+        return FrameworkSQLiteStatement(delegate.compileStatement(sql))
+    }
+
+    override fun beginTransaction() {
+        delegate.beginTransaction()
+    }
+
+    override fun beginTransactionNonExclusive() {
+        delegate.beginTransactionNonExclusive()
+    }
+
+    override fun beginTransactionWithListener(
+        transactionListener: SQLiteTransactionListener
+    ) {
+        delegate.beginTransactionWithListener(transactionListener)
+    }
+
+    override fun beginTransactionWithListenerNonExclusive(
+        transactionListener: SQLiteTransactionListener
+    ) {
+        delegate.beginTransactionWithListenerNonExclusive(transactionListener)
+    }
+
+    override fun endTransaction() {
+        delegate.endTransaction()
+    }
+
+    override fun setTransactionSuccessful() {
+        delegate.setTransactionSuccessful()
+    }
+
+    override fun inTransaction(): Boolean {
+        return delegate.inTransaction()
+    }
+
+    override fun isDbLockedByCurrentThread(): Boolean {
+        return delegate.isDbLockedByCurrentThread
+    }
+
+    override fun yieldIfContendedSafely(): Boolean {
+        return delegate.yieldIfContendedSafely()
+    }
+
+    override fun yieldIfContendedSafely(sleepAfterYieldDelay: Long): Boolean {
+        return delegate.yieldIfContendedSafely(sleepAfterYieldDelay)
+    }
+
+    override fun isExecPerConnectionSQLSupported(): Boolean {
+        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
+    }
+
+    override fun execPerConnectionSQL(sql: String, bindArgs: Array<Any>?) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            Api30Impl.execPerConnectionSQL(delegate, sql, bindArgs)
+        } else {
+            throw UnsupportedOperationException(
+                "execPerConnectionSQL is not supported on a " +
+                    "SDK version lower than 30, current version is: " + Build.VERSION.SDK_INT
+            )
+        }
+    }
+
+    override fun getVersion(): Int {
+        return delegate.version
+    }
+
+    override fun setVersion(version: Int) {
+        delegate.version = version
+    }
+
+    override fun getMaximumSize(): Long {
+        return delegate.maximumSize
+    }
+
+    override fun setMaximumSize(numBytes: Long): Long {
+        return delegate.setMaximumSize(numBytes)
+    }
+
+    override fun getPageSize(): Long {
+        return delegate.pageSize
+    }
+
+    override fun setPageSize(numBytes: Long) {
+        delegate.pageSize = numBytes
+    }
+
+    override fun query(query: String): Cursor {
+        return query(SimpleSQLiteQuery(query))
+    }
+
+    override fun query(query: String, bindArgs: Array<Any?>): Cursor {
+        return query(SimpleSQLiteQuery(query, bindArgs))
+    }
+
+    override fun query(supportQuery: SupportSQLiteQuery): Cursor {
+        val cursorFactory = {
+                _: SQLiteDatabase?,
+                masterQuery: SQLiteCursorDriver?,
+                editTable: String?,
+                query: SQLiteQuery? ->
+            supportQuery.bindTo(
+                FrameworkSQLiteProgram(
+                    query!!
+                )
+            )
+            SQLiteCursor(masterQuery, editTable, query)
+        }
+
+        return delegate.rawQueryWithFactory(
+            cursorFactory, supportQuery.sql, EMPTY_STRING_ARRAY, null)
+    }
+
+    @RequiresApi(16)
+    override fun query(
+        supportQuery: SupportSQLiteQuery,
+        cancellationSignal: CancellationSignal?
+    ): Cursor {
+        return SupportSQLiteCompat.Api16Impl.rawQueryWithFactory(delegate, supportQuery.sql,
+            EMPTY_STRING_ARRAY, null, cancellationSignal!!
+        ) { _: SQLiteDatabase?,
+            masterQuery: SQLiteCursorDriver?,
+            editTable: String?,
+            query: SQLiteQuery? ->
+            supportQuery.bindTo(
+                FrameworkSQLiteProgram(
+                    query!!
+                )
+            )
+            SQLiteCursor(masterQuery, editTable, query)
+        }
+    }
+
+    @Throws(SQLException::class)
+    override fun insert(table: String, conflictAlgorithm: Int, values: ContentValues): Long {
+        return delegate.insertWithOnConflict(table, null, values, conflictAlgorithm)
+    }
+
+    override fun delete(table: String, whereClause: String?, whereArgs: Array<Any?>?): Int {
+        val query = ("DELETE FROM $table ${whereClause?.isEmpty() == true} else WHERE $whereClause")
+        val statement = compileStatement(query)
+        SimpleSQLiteQuery.bind(statement, whereArgs)
+        return statement.executeUpdateDelete()
+    }
+
+    override fun update(
+        table: String,
+        conflictAlgorithm: Int,
+        values: ContentValues,
+        whereClause: String?,
+        whereArgs: Array<Any>?
+    ): Int {
+        // taken from SQLiteDatabase class.
+        require(values.size() != 0) { "Empty values" }
+
+        // move all bind args to one array
+        val setValuesSize = values.size()
+        val bindArgsSize =
+            if (whereArgs == null) setValuesSize else setValuesSize + whereArgs.size
+        val bindArgs = arrayOfNulls<Any>(bindArgsSize)
+        val sql = buildString {
+            append("UPDATE ")
+            append(CONFLICT_VALUES[conflictAlgorithm])
+            append(table)
+            append(" SET ")
+
+            var i = 0
+            for (colName in values.keySet()) {
+                append(if (i > 0) "," else "")
+                append(colName)
+                bindArgs[i++] = values[colName]
+                append("=?")
+            }
+            if (whereArgs != null) {
+                i = setValuesSize
+                while (i < bindArgsSize) {
+                    bindArgs[i] = whereArgs[i - setValuesSize]
+                    i++
+                }
+            }
+            if (!TextUtils.isEmpty(whereClause)) {
+                append(" WHERE ")
+                append(whereClause)
+            }
+        }
+        val stmt = compileStatement(sql)
+        SimpleSQLiteQuery.bind(stmt, bindArgs)
+        return stmt.executeUpdateDelete()
+    }
+
+    @Throws(SQLException::class)
+    override fun execSQL(sql: String) {
+        delegate.execSQL(sql)
+    }
+
+    @Throws(SQLException::class)
+    override fun execSQL(sql: String, bindArgs: Array<Any>) {
+        delegate.execSQL(sql, bindArgs)
+    }
+
+    override fun isReadOnly(): Boolean {
+        return delegate.isReadOnly
+    }
+
+    override fun isOpen(): Boolean {
+        return delegate.isOpen
+    }
+
+    override fun needUpgrade(newVersion: Int): Boolean {
+        return delegate.needUpgrade(newVersion)
+    }
+
+    override fun getPath(): String? {
+        return delegate.path
+    }
+
+    override fun setLocale(locale: Locale) {
+        delegate.setLocale(locale)
+    }
+
+    override fun setMaxSqlCacheSize(cacheSize: Int) {
+        delegate.setMaxSqlCacheSize(cacheSize)
+    }
+
+    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
+    override fun setForeignKeyConstraintsEnabled(enable: Boolean) {
+        SupportSQLiteCompat.Api16Impl.setForeignKeyConstraintsEnabled(delegate, enable)
+    }
+
+    override fun enableWriteAheadLogging(): Boolean {
+        return delegate.enableWriteAheadLogging()
+    }
+
+    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
+    override fun disableWriteAheadLogging() {
+        SupportSQLiteCompat.Api16Impl.disableWriteAheadLogging(delegate)
+    }
+
+    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
+    override fun isWriteAheadLoggingEnabled(): Boolean {
+        return SupportSQLiteCompat.Api16Impl.isWriteAheadLoggingEnabled(delegate)
+    }
+
+    override fun getAttachedDbs(): List<Pair<String, String>>? {
+        return delegate.attachedDbs
+    }
+
+    override fun isDatabaseIntegrityOk(): Boolean {
+        return delegate.isDatabaseIntegrityOk
+    }
+
+    @Throws(IOException::class)
+    override fun close() {
+        delegate.close()
+    }
+
+    /**
+     * Checks if this object delegates to the same given database reference.
+     */
+    fun isDelegate(sqLiteDatabase: SQLiteDatabase): Boolean {
+        return delegate == sqLiteDatabase
+    }
+
+    @RequiresApi(30)
+    internal object Api30Impl {
+        @DoNotInline
+        fun execPerConnectionSQL(
+            sQLiteDatabase: SQLiteDatabase,
+            sql: String,
+            bindArgs: Array<Any>?
+        ) {
+            sQLiteDatabase.execPerConnectionSQL(sql, bindArgs)
+        }
+    }
+
+    companion object {
+        private val CONFLICT_VALUES =
+            arrayOf(
+                "",
+                " OR ROLLBACK ",
+                " OR ABORT ",
+                " OR FAIL ",
+                " OR IGNORE ",
+                " OR REPLACE "
+            )
+        private val EMPTY_STRING_ARRAY = arrayOfNulls<String>(0)
+    }
+}
\ No newline at end of file
diff --git a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelper.java b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelper.java
deleted file mode 100644
index 7a76b70..0000000
--- a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelper.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.sqlite.db.framework;
-
-import android.content.Context;
-import android.database.DatabaseErrorHandler;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteException;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.os.Build;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
-import androidx.sqlite.db.SupportSQLiteCompat;
-import androidx.sqlite.db.SupportSQLiteDatabase;
-import androidx.sqlite.db.SupportSQLiteOpenHelper;
-import androidx.sqlite.util.ProcessLock;
-import androidx.sqlite.util.SneakyThrow;
-
-import java.io.File;
-import java.util.UUID;
-
-class FrameworkSQLiteOpenHelper implements SupportSQLiteOpenHelper {
-
-    private static final String TAG = "SupportSQLite";
-
-    private final Context mContext;
-    private final String mName;
-    private final Callback mCallback;
-    private final boolean mUseNoBackupDirectory;
-    private final boolean mAllowDataLossOnRecovery;
-    private final Object mLock;
-
-    // Delegate is created lazily
-    private OpenHelper mDelegate;
-    private boolean mWriteAheadLoggingEnabled;
-
-    FrameworkSQLiteOpenHelper(
-            Context context,
-            String name,
-            Callback callback) {
-        this(context, name, callback, false);
-    }
-
-    FrameworkSQLiteOpenHelper(
-            Context context,
-            String name,
-            Callback callback,
-            boolean useNoBackupDirectory) {
-        this(context, name, callback, useNoBackupDirectory, false);
-    }
-
-    FrameworkSQLiteOpenHelper(
-            Context context,
-            String name,
-            Callback callback,
-            boolean useNoBackupDirectory,
-            boolean allowDataLossOnRecovery) {
-        mContext = context;
-        mName = name;
-        mCallback = callback;
-        mUseNoBackupDirectory = useNoBackupDirectory;
-        mAllowDataLossOnRecovery = allowDataLossOnRecovery;
-        mLock = new Object();
-    }
-
-    private OpenHelper getDelegate() {
-        // getDelegate() is lazy because we don't want to File I/O until the call to
-        // getReadableDatabase() or getWritableDatabase(). This is better because the call to
-        // a getReadableDatabase() or a getWritableDatabase() happens on a background thread unless
-        // queries are allowed on the main thread.
-
-        // We defer computing the path the database from the constructor to getDelegate()
-        // because context.getNoBackupFilesDir() does File I/O :(
-        synchronized (mLock) {
-            if (mDelegate == null) {
-                final FrameworkSQLiteDatabase[] dbRef = new FrameworkSQLiteDatabase[1];
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
-                        && mName != null
-                        && mUseNoBackupDirectory) {
-                    File file = new File(
-                            SupportSQLiteCompat.Api21Impl.getNoBackupFilesDir(mContext),
-                            mName
-                    );
-                    mDelegate = new OpenHelper(mContext, file.getAbsolutePath(), dbRef, mCallback,
-                            mAllowDataLossOnRecovery);
-                } else {
-                    mDelegate = new OpenHelper(mContext, mName, dbRef, mCallback,
-                            mAllowDataLossOnRecovery);
-                }
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
-                    SupportSQLiteCompat.Api16Impl.setWriteAheadLoggingEnabled(mDelegate,
-                            mWriteAheadLoggingEnabled);
-                }
-            }
-            return mDelegate;
-        }
-    }
-
-    @Override
-    public String getDatabaseName() {
-        return mName;
-    }
-
-    @Override
-    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
-    public void setWriteAheadLoggingEnabled(boolean enabled) {
-        synchronized (mLock) {
-            if (mDelegate != null) {
-                SupportSQLiteCompat.Api16Impl.setWriteAheadLoggingEnabled(mDelegate, enabled);
-            }
-            mWriteAheadLoggingEnabled = enabled;
-        }
-    }
-
-    @Override
-    public SupportSQLiteDatabase getWritableDatabase() {
-        return getDelegate().getSupportDatabase(true);
-    }
-
-    @Override
-    public SupportSQLiteDatabase getReadableDatabase() {
-        return getDelegate().getSupportDatabase(false);
-    }
-
-    @Override
-    public void close() {
-        getDelegate().close();
-    }
-
-    static class OpenHelper extends SQLiteOpenHelper {
-        /**
-         * This is used as an Object reference so that we can access the wrapped database inside
-         * the constructor. SQLiteOpenHelper requires the error handler to be passed in the
-         * constructor.
-         */
-        final FrameworkSQLiteDatabase[] mDbRef;
-        final Context mContext;
-        final Callback mCallback;
-        final boolean mAllowDataLossOnRecovery;
-        // see b/78359448
-        private boolean mMigrated;
-        // see b/193182592
-        private final ProcessLock mLock;
-        private boolean mOpened;
-
-        OpenHelper(Context context, String name, final FrameworkSQLiteDatabase[] dbRef,
-                final Callback callback, boolean allowDataLossOnRecovery) {
-            super(context, name, null, callback.version,
-                    new DatabaseErrorHandler() {
-                        @Override
-                        public void onCorruption(SQLiteDatabase dbObj) {
-                            callback.onCorruption(getWrappedDb(dbRef, dbObj));
-                        }
-                    });
-            mContext = context;
-            mCallback = callback;
-            mDbRef = dbRef;
-            mAllowDataLossOnRecovery = allowDataLossOnRecovery;
-            mLock = new ProcessLock(name == null ? UUID.randomUUID().toString() : name,
-                    context.getCacheDir(), false);
-        }
-
-        SupportSQLiteDatabase getSupportDatabase(boolean writable) {
-            try {
-                mLock.lock(!mOpened && getDatabaseName() != null);
-                mMigrated = false;
-                final SQLiteDatabase db = innerGetDatabase(writable);
-                if (mMigrated) {
-                    // there might be a connection w/ stale structure, we should re-open.
-                    close();
-                    return getSupportDatabase(writable);
-                }
-                return getWrappedDb(db);
-            } finally {
-                mLock.unlock();
-            }
-        }
-
-        private SQLiteDatabase innerGetDatabase(boolean writable) {
-            String name = getDatabaseName();
-            if (name != null) {
-                File databaseFile = mContext.getDatabasePath(name);
-                File parentFile = databaseFile.getParentFile();
-                if (parentFile != null) {
-                    parentFile.mkdirs();
-                    if (!parentFile.isDirectory()) {
-                        Log.w(TAG, "Invalid database parent file, not a directory: " + parentFile);
-                    }
-                }
-            }
-
-            try {
-                return getWritableOrReadableDatabase(writable);
-            } catch (Throwable t) {
-                // No good, just try again...
-                super.close();
-            }
-
-            try {
-                // Wait before trying to open the DB, ideally enough to account for some slow I/O.
-                // Similar to android_database_SQLiteConnection's BUSY_TIMEOUT_MS but not as much.
-                Thread.sleep(500);
-            } catch (InterruptedException e) {
-                // Ignore, and continue
-            }
-
-            final Throwable openRetryError;
-            try {
-                return getWritableOrReadableDatabase(writable);
-            } catch (Throwable t) {
-                super.close();
-                openRetryError = t;
-            }
-            if (openRetryError instanceof CallbackException) {
-                // Callback error (onCreate, onUpgrade, onOpen, etc), possibly user error.
-                final CallbackException callbackException = (CallbackException) openRetryError;
-                final Throwable cause = callbackException.getCause();
-                switch (callbackException.getCallbackName()) {
-                    case ON_CONFIGURE:
-                    case ON_CREATE:
-                    case ON_UPGRADE:
-                    case ON_DOWNGRADE:
-                        SneakyThrow.reThrow(cause);
-                        break;
-                    case ON_OPEN:
-                    default:
-                        break;
-                }
-                // If callback exception is not an SQLiteException, then more certainly it is not
-                // recoverable.
-                if (!(cause instanceof SQLiteException)) {
-                    SneakyThrow.reThrow(cause);
-                }
-            } else if (openRetryError instanceof SQLiteException) {
-                // Ideally we are looking for SQLiteCantOpenDatabaseException and similar, but
-                // corruption can manifest in others forms.
-                if (name == null || !mAllowDataLossOnRecovery) {
-                    SneakyThrow.reThrow(openRetryError);
-                }
-            } else {
-                SneakyThrow.reThrow(openRetryError);
-            }
-
-            // Delete the database and try one last time. (mAllowDataLossOnRecovery == true)
-            mContext.deleteDatabase(name);
-            try {
-                return getWritableOrReadableDatabase(writable);
-            } catch (CallbackException ex) {
-                // Unwrap our exception to avoid disruption with other try-catch in the call stack.
-                SneakyThrow.reThrow(ex.getCause());
-                return null; // Unreachable code, but compiler doesn't know it.
-            }
-        }
-
-        private SQLiteDatabase getWritableOrReadableDatabase(boolean writable) {
-            if (writable) {
-                return super.getWritableDatabase();
-            } else {
-                return super.getReadableDatabase();
-            }
-        }
-
-        FrameworkSQLiteDatabase getWrappedDb(SQLiteDatabase sqLiteDatabase) {
-            return getWrappedDb(mDbRef, sqLiteDatabase);
-        }
-
-        @Override
-        public void onCreate(SQLiteDatabase sqLiteDatabase) {
-            try {
-                mCallback.onCreate(getWrappedDb(sqLiteDatabase));
-            } catch (Throwable t) {
-                throw new CallbackException(CallbackName.ON_CREATE, t);
-            }
-        }
-
-        @Override
-        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
-            mMigrated = true;
-            try {
-                mCallback.onUpgrade(getWrappedDb(sqLiteDatabase), oldVersion, newVersion);
-            } catch (Throwable t) {
-                throw new CallbackException(CallbackName.ON_UPGRADE, t);
-            }
-        }
-
-        @Override
-        public void onConfigure(SQLiteDatabase db) {
-            try {
-                mCallback.onConfigure(getWrappedDb(db));
-            } catch (Throwable t) {
-                throw new CallbackException(CallbackName.ON_CONFIGURE, t);
-            }
-        }
-
-        @Override
-        public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-            mMigrated = true;
-            try {
-                mCallback.onDowngrade(getWrappedDb(db), oldVersion, newVersion);
-            } catch (Throwable t) {
-                throw new CallbackException(CallbackName.ON_DOWNGRADE, t);
-            }
-        }
-
-        @Override
-        public void onOpen(SQLiteDatabase db) {
-            if (!mMigrated) {
-                // if we've migrated, we'll re-open the db so we should not call the callback.
-                try {
-                    mCallback.onOpen(getWrappedDb(db));
-                } catch (Throwable t) {
-                    throw new CallbackException(CallbackName.ON_OPEN, t);
-                }
-            }
-            mOpened = true;
-        }
-
-        @Override
-        @SuppressWarnings("UnsynchronizedOverridesSynchronized") // No need sync due to locks.
-        public void close() {
-            try {
-                mLock.lock();
-                super.close();
-                mDbRef[0] = null;
-                mOpened = false;
-            } finally {
-                mLock.unlock();
-            }
-        }
-
-        static FrameworkSQLiteDatabase getWrappedDb(FrameworkSQLiteDatabase[] refHolder,
-                SQLiteDatabase sqLiteDatabase) {
-            FrameworkSQLiteDatabase dbRef = refHolder[0];
-            if (dbRef == null || !dbRef.isDelegate(sqLiteDatabase)) {
-                refHolder[0] = new FrameworkSQLiteDatabase(sqLiteDatabase);
-            }
-            return refHolder[0];
-        }
-
-        private static final class CallbackException extends RuntimeException {
-
-            private final CallbackName mCallbackName;
-            private final Throwable mCause;
-
-            CallbackException(CallbackName callbackName, Throwable cause) {
-                super(cause);
-                mCallbackName = callbackName;
-                mCause = cause;
-            }
-
-            public CallbackName getCallbackName() {
-                return mCallbackName;
-            }
-
-            @NonNull
-            @Override
-            @SuppressWarnings("UnsynchronizedOverridesSynchronized") // Not needed, cause is final
-            public Throwable getCause() {
-                return mCause;
-            }
-        }
-
-        enum CallbackName {
-            ON_CONFIGURE,
-            ON_CREATE,
-            ON_UPGRADE,
-            ON_DOWNGRADE,
-            ON_OPEN
-        }
-    }
-}
diff --git a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelper.kt b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelper.kt
new file mode 100644
index 0000000..6857ab0
--- /dev/null
+++ b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelper.kt
@@ -0,0 +1,336 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.sqlite.db.framework
+
+import android.content.Context
+import android.database.DatabaseErrorHandler
+import android.database.sqlite.SQLiteDatabase
+import android.database.sqlite.SQLiteException
+import android.database.sqlite.SQLiteOpenHelper
+import android.os.Build
+import android.util.Log
+import androidx.annotation.RequiresApi
+import androidx.sqlite.db.SupportSQLiteCompat
+import androidx.sqlite.db.SupportSQLiteDatabase
+import androidx.sqlite.db.SupportSQLiteOpenHelper
+import androidx.sqlite.util.ProcessLock
+import java.io.File
+import java.util.UUID
+
+internal class FrameworkSQLiteOpenHelper @JvmOverloads constructor(
+    private val context: Context,
+    private val name: String?,
+    private val callback: SupportSQLiteOpenHelper.Callback,
+    private val useNoBackupDirectory: Boolean = false,
+    private val allowDataLossOnRecovery: Boolean = false
+) : SupportSQLiteOpenHelper {
+
+    // Delegate is created lazily
+    private val lazyDelegate = lazy {
+        // OpenHelper initialization code
+        val openHelper: OpenHelper
+
+        if (
+            Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
+                name != null &&
+                useNoBackupDirectory
+        ) {
+            val file = File(
+                SupportSQLiteCompat.Api21Impl.getNoBackupFilesDir(context),
+                name
+            )
+            openHelper = OpenHelper(
+                context = context,
+                name = file.absolutePath,
+                dbRef = DBRefHolder(null),
+                callback = callback,
+                allowDataLossOnRecovery = allowDataLossOnRecovery
+            )
+        } else {
+            openHelper = OpenHelper(
+                context = context,
+                name = name,
+                dbRef = DBRefHolder(null),
+                callback = callback,
+                allowDataLossOnRecovery = allowDataLossOnRecovery
+            )
+        }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+            SupportSQLiteCompat.Api16Impl.setWriteAheadLoggingEnabled(
+                openHelper,
+                writeAheadLoggingEnabled
+            )
+        }
+        return@lazy openHelper
+    }
+
+    private var writeAheadLoggingEnabled = false
+
+    // getDelegate() is lazy because we don't want to File I/O until the call to
+    // getReadableDatabase() or getWritableDatabase(). This is better because the call to
+    // a getReadableDatabase() or a getWritableDatabase() happens on a background thread unless
+    // queries are allowed on the main thread.
+
+    // We defer computing the path the database from the constructor to getDelegate()
+    // because context.getNoBackupFilesDir() does File I/O :(
+    private val delegate: OpenHelper by lazyDelegate
+
+    override fun getDatabaseName(): String? {
+        return name
+    }
+
+    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
+    override fun setWriteAheadLoggingEnabled(enabled: Boolean) {
+        if (lazyDelegate.isInitialized()) {
+            // Use 'delegate', it is already initialized
+            SupportSQLiteCompat.Api16Impl.setWriteAheadLoggingEnabled(delegate, enabled)
+        }
+        writeAheadLoggingEnabled = enabled
+    }
+
+    override fun getWritableDatabase(): SupportSQLiteDatabase {
+        return delegate.getSupportDatabase(true)
+    }
+
+    override fun getReadableDatabase(): SupportSQLiteDatabase {
+        return delegate.getSupportDatabase(false)
+    }
+
+    override fun close() {
+        if (lazyDelegate.isInitialized()) {
+            delegate.close()
+        }
+    }
+
+    private class OpenHelper(
+        val context: Context,
+        name: String?,
+        /**
+         * This is used as an Object reference so that we can access the wrapped database inside
+         * the constructor. SQLiteOpenHelper requires the error handler to be passed in the
+         * constructor.
+         */
+        val dbRef: DBRefHolder,
+        val callback: SupportSQLiteOpenHelper.Callback,
+        val allowDataLossOnRecovery: Boolean
+    ) : SQLiteOpenHelper(
+        context, name, null, callback.version,
+        DatabaseErrorHandler { dbObj ->
+            callback.onCorruption(
+                getWrappedDb(
+                    dbRef,
+                    dbObj
+                )
+            )
+        }) {
+        // see b/78359448
+        private var migrated = false
+
+        // see b/193182592
+        private val lock: ProcessLock = ProcessLock(
+            name = name ?: UUID.randomUUID().toString(),
+            lockDir = context.cacheDir,
+            processLock = false
+        )
+        private var opened = false
+
+        fun getSupportDatabase(writable: Boolean): SupportSQLiteDatabase {
+            return try {
+                lock.lock(!opened && databaseName != null)
+                migrated = false
+                val db = innerGetDatabase(writable)
+                if (migrated) {
+                    // there might be a connection w/ stale structure, we should re-open.
+                    close()
+                    return getSupportDatabase(writable)
+                }
+                getWrappedDb(db)
+            } finally {
+                lock.unlock()
+            }
+        }
+
+        private fun innerGetDatabase(writable: Boolean): SQLiteDatabase {
+            val name = databaseName
+            if (name != null) {
+                val databaseFile = context.getDatabasePath(name)
+                val parentFile = databaseFile.parentFile
+                if (parentFile != null) {
+                    parentFile.mkdirs()
+                    if (!parentFile.isDirectory) {
+                        Log.w(TAG, "Invalid database parent file, not a directory: $parentFile")
+                    }
+                }
+            }
+            try {
+                return getWritableOrReadableDatabase(writable)
+            } catch (t: Throwable) {
+                // No good, just try again...
+                super.close()
+            }
+            try {
+                // Wait before trying to open the DB, ideally enough to account for some slow I/O.
+                // Similar to android_database_SQLiteConnection's BUSY_TIMEOUT_MS but not as much.
+                Thread.sleep(500)
+            } catch (e: InterruptedException) {
+                // Ignore, and continue
+            }
+            val openRetryError: Throwable = try {
+                return getWritableOrReadableDatabase(writable)
+            } catch (t: Throwable) {
+                super.close()
+                t
+            }
+            if (openRetryError is CallbackException) {
+                // Callback error (onCreate, onUpgrade, onOpen, etc), possibly user error.
+                val cause = openRetryError.cause
+                when (openRetryError.callbackName) {
+                    CallbackName.ON_CONFIGURE,
+                    CallbackName.ON_CREATE,
+                    CallbackName.ON_UPGRADE,
+                    CallbackName.ON_DOWNGRADE -> throw cause
+                    CallbackName.ON_OPEN -> {}
+                }
+                // If callback exception is not an SQLiteException, then more certainly it is not
+                // recoverable.
+                if (cause !is SQLiteException) {
+                    throw cause
+                }
+            } else if (openRetryError is SQLiteException) {
+                // Ideally we are looking for SQLiteCantOpenDatabaseException and similar, but
+                // corruption can manifest in others forms.
+                if (name == null || !allowDataLossOnRecovery) {
+                    throw openRetryError
+                }
+            } else {
+                throw openRetryError
+            }
+
+            // Delete the database and try one last time. (mAllowDataLossOnRecovery == true)
+            context.deleteDatabase(name)
+            try {
+                return getWritableOrReadableDatabase(writable)
+            } catch (ex: CallbackException) {
+                // Unwrap our exception to avoid disruption with other try-catch in the call stack.
+                throw ex.cause
+            }
+        }
+
+        private fun getWritableOrReadableDatabase(writable: Boolean): SQLiteDatabase {
+            return if (writable) {
+                super.getWritableDatabase()
+            } else {
+                super.getReadableDatabase()
+            }
+        }
+
+        fun getWrappedDb(sqLiteDatabase: SQLiteDatabase): FrameworkSQLiteDatabase {
+            return getWrappedDb(dbRef, sqLiteDatabase)
+        }
+
+        override fun onCreate(sqLiteDatabase: SQLiteDatabase) {
+            try {
+                callback.onCreate(getWrappedDb(sqLiteDatabase))
+            } catch (t: Throwable) {
+                throw CallbackException(CallbackName.ON_CREATE, t)
+            }
+        }
+
+        override fun onUpgrade(sqLiteDatabase: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
+            migrated = true
+            try {
+                callback.onUpgrade(getWrappedDb(sqLiteDatabase), oldVersion, newVersion)
+            } catch (t: Throwable) {
+                throw CallbackException(CallbackName.ON_UPGRADE, t)
+            }
+        }
+
+        override fun onConfigure(db: SQLiteDatabase) {
+            try {
+                callback.onConfigure(getWrappedDb(db))
+            } catch (t: Throwable) {
+                throw CallbackException(CallbackName.ON_CONFIGURE, t)
+            }
+        }
+
+        override fun onDowngrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
+            migrated = true
+            try {
+                callback.onDowngrade(getWrappedDb(db), oldVersion, newVersion)
+            } catch (t: Throwable) {
+                throw CallbackException(CallbackName.ON_DOWNGRADE, t)
+            }
+        }
+
+        override fun onOpen(db: SQLiteDatabase) {
+            if (!migrated) {
+                // if we've migrated, we'll re-open the db so we should not call the callback.
+                try {
+                    callback.onOpen(getWrappedDb(db))
+                } catch (t: Throwable) {
+                    throw CallbackException(CallbackName.ON_OPEN, t)
+                }
+            }
+            opened = true
+        }
+
+        // No need sync due to locks.
+        override fun close() {
+            try {
+                lock.lock()
+                super.close()
+                dbRef.db = null
+                opened = false
+            } finally {
+                lock.unlock()
+            }
+        }
+
+        private class CallbackException(
+            val callbackName: CallbackName,
+            override val cause: Throwable
+        ) : RuntimeException(cause)
+
+        internal enum class CallbackName {
+            ON_CONFIGURE, ON_CREATE, ON_UPGRADE, ON_DOWNGRADE, ON_OPEN
+        }
+
+        companion object {
+            fun getWrappedDb(
+                refHolder: DBRefHolder,
+                sqLiteDatabase: SQLiteDatabase
+            ): FrameworkSQLiteDatabase {
+                val dbRef = refHolder.db
+                return if (dbRef == null || !dbRef.isDelegate(sqLiteDatabase)) {
+                    FrameworkSQLiteDatabase(sqLiteDatabase).also { refHolder.db = it }
+                } else {
+                    dbRef
+                }
+            }
+        }
+    }
+
+    companion object {
+        private const val TAG = "SupportSQLite"
+    }
+
+    /**
+     * This is used as an Object reference so that we can access the wrapped database inside
+     * the constructor. SQLiteOpenHelper requires the error handler to be passed in the
+     * constructor.
+     */
+    private class DBRefHolder(var db: FrameworkSQLiteDatabase?)
+}
\ No newline at end of file
diff --git a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelperFactory.java b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelperFactory.java
deleted file mode 100644
index 34a0ce0..0000000
--- a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelperFactory.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.sqlite.db.framework;
-
-import androidx.annotation.NonNull;
-import androidx.sqlite.db.SupportSQLiteOpenHelper;
-
-/**
- * Implements {@link SupportSQLiteOpenHelper.Factory} using the SQLite implementation in the
- * framework.
- */
-@SuppressWarnings("unused")
-public final class FrameworkSQLiteOpenHelperFactory implements SupportSQLiteOpenHelper.Factory {
-    @NonNull
-    @Override
-    public SupportSQLiteOpenHelper create(
-            @NonNull SupportSQLiteOpenHelper.Configuration configuration) {
-        return new FrameworkSQLiteOpenHelper(
-                configuration.context,
-                configuration.name,
-                configuration.callback,
-                configuration.useNoBackupDirectory,
-                configuration.allowDataLossOnRecovery);
-    }
-}
diff --git a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelperFactory.kt b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelperFactory.kt
new file mode 100644
index 0000000..a549b04
--- /dev/null
+++ b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelperFactory.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.sqlite.db.framework
+
+import androidx.sqlite.db.SupportSQLiteOpenHelper
+
+/**
+ * Implements [SupportSQLiteOpenHelper.Factory] using the SQLite implementation in the
+ * framework.
+ */
+class FrameworkSQLiteOpenHelperFactory : SupportSQLiteOpenHelper.Factory {
+    override fun create(
+        configuration: SupportSQLiteOpenHelper.Configuration
+    ): SupportSQLiteOpenHelper {
+        return FrameworkSQLiteOpenHelper(
+            configuration.context,
+            configuration.name,
+            configuration.callback,
+            configuration.useNoBackupDirectory,
+            configuration.allowDataLossOnRecovery
+        )
+    }
+}
\ No newline at end of file
diff --git a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteProgram.java b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteProgram.java
deleted file mode 100644
index 051a625..0000000
--- a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteProgram.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.sqlite.db.framework;
-
-import android.database.sqlite.SQLiteProgram;
-
-import androidx.annotation.NonNull;
-import androidx.sqlite.db.SupportSQLiteProgram;
-
-/**
- * An wrapper around {@link SQLiteProgram} to implement {@link SupportSQLiteProgram} API.
- */
-class FrameworkSQLiteProgram implements SupportSQLiteProgram {
-    private final SQLiteProgram mDelegate;
-
-    FrameworkSQLiteProgram(SQLiteProgram delegate) {
-        mDelegate = delegate;
-    }
-
-    @Override
-    public void bindNull(int index) {
-        mDelegate.bindNull(index);
-    }
-
-    @Override
-    public void bindLong(int index, long value) {
-        mDelegate.bindLong(index, value);
-    }
-
-    @Override
-    public void bindDouble(int index, double value) {
-        mDelegate.bindDouble(index, value);
-    }
-
-    @Override
-    public void bindString(int index, @NonNull String value) {
-        mDelegate.bindString(index, value);
-    }
-
-    @Override
-    public void bindBlob(int index, @NonNull byte[] value) {
-        mDelegate.bindBlob(index, value);
-    }
-
-    @Override
-    public void clearBindings() {
-        mDelegate.clearBindings();
-    }
-
-    @Override
-    public void close() {
-        mDelegate.close();
-    }
-}
diff --git a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteProgram.kt b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteProgram.kt
new file mode 100644
index 0000000..3707078
--- /dev/null
+++ b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteProgram.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.sqlite.db.framework
+
+import android.database.sqlite.SQLiteProgram
+import androidx.sqlite.db.SupportSQLiteProgram
+
+/**
+ * An wrapper around [SQLiteProgram] to implement [SupportSQLiteProgram] API.
+ */
+internal open class FrameworkSQLiteProgram(
+    private val delegate: SQLiteProgram
+) : SupportSQLiteProgram {
+    override fun bindNull(index: Int) {
+        delegate.bindNull(index)
+    }
+
+    override fun bindLong(index: Int, value: Long) {
+        delegate.bindLong(index, value)
+    }
+
+    override fun bindDouble(index: Int, value: Double) {
+        delegate.bindDouble(index, value)
+    }
+
+    override fun bindString(index: Int, value: String) {
+        delegate.bindString(index, value)
+    }
+
+    override fun bindBlob(index: Int, value: ByteArray) {
+        delegate.bindBlob(index, value)
+    }
+
+    override fun clearBindings() {
+        delegate.clearBindings()
+    }
+
+    override fun close() {
+        delegate.close()
+    }
+}
\ No newline at end of file
diff --git a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteStatement.java b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteStatement.java
deleted file mode 100644
index 9ef2fa7..0000000
--- a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteStatement.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.sqlite.db.framework;
-
-import android.database.sqlite.SQLiteStatement;
-
-import androidx.sqlite.db.SupportSQLiteStatement;
-
-/**
- * Delegates all calls to a {@link SQLiteStatement}.
- */
-class FrameworkSQLiteStatement extends FrameworkSQLiteProgram implements SupportSQLiteStatement {
-    private final SQLiteStatement mDelegate;
-
-    /**
-     * Creates a wrapper around a framework {@link SQLiteStatement}.
-     *
-     * @param delegate The SQLiteStatement to delegate calls to.
-     */
-    FrameworkSQLiteStatement(SQLiteStatement delegate) {
-        super(delegate);
-        mDelegate = delegate;
-    }
-
-    @Override
-    public void execute() {
-        mDelegate.execute();
-    }
-
-    @Override
-    public int executeUpdateDelete() {
-        return mDelegate.executeUpdateDelete();
-    }
-
-    @Override
-    public long executeInsert() {
-        return mDelegate.executeInsert();
-    }
-
-    @Override
-    public long simpleQueryForLong() {
-        return mDelegate.simpleQueryForLong();
-    }
-
-    @Override
-    public String simpleQueryForString() {
-        return mDelegate.simpleQueryForString();
-    }
-}
diff --git a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteStatement.kt b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteStatement.kt
new file mode 100644
index 0000000..51f726e
--- /dev/null
+++ b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteStatement.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.sqlite.db.framework
+
+import android.database.sqlite.SQLiteStatement
+import androidx.sqlite.db.SupportSQLiteStatement
+
+/**
+ * Delegates all calls to a [SQLiteStatement].
+ *
+ * @constructor Creates a wrapper around a framework [SQLiteStatement].
+ *
+ * @param delegate The SQLiteStatement to delegate calls to.
+ */
+internal class FrameworkSQLiteStatement(
+    private val delegate: SQLiteStatement
+) : FrameworkSQLiteProgram(
+    delegate
+), SupportSQLiteStatement {
+    override fun execute() {
+        delegate.execute()
+    }
+
+    override fun executeUpdateDelete(): Int {
+        return delegate.executeUpdateDelete()
+    }
+
+    override fun executeInsert(): Long {
+        return delegate.executeInsert()
+    }
+
+    override fun simpleQueryForLong(): Long {
+        return delegate.simpleQueryForLong()
+    }
+
+    override fun simpleQueryForString(): String? {
+        return delegate.simpleQueryForString()
+    }
+}
\ No newline at end of file
diff --git a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/util/ProcessLock.java b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/util/ProcessLock.java
deleted file mode 100644
index 4d863a9..0000000
--- a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/util/ProcessLock.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.sqlite.util;
-
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.channels.FileChannel;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-/**
- * Utility class for in-process and multi-process key-based lock mechanism for safely doing
- * synchronized operations.
- * <p>
- * Acquiring the lock will be quick if no other thread or process has a lock with the same key.
- * But if the lock is already held then acquiring it will block, until the other thread or process
- * releases the lock. Note that the key and lock directory must be the same to achieve
- * synchronization.
- * <p>
- * Locking is done via two levels:
- * <ol>
- *   <li>
- *     Thread locking within the same JVM process is done via a map of String key to ReentrantLock
- *     objects.
- *   <li>
- *     Multi-process locking is done via a lock file whose name contains the key and FileLock
- *     objects.
- *
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public final class ProcessLock {
-
-    private static final String TAG = "SupportSQLiteLock";
-
-    // in-process lock map
-    private static final Map<String, Lock> sThreadLocks = new HashMap<>();
-
-    private final File mLockFile;
-    private final Lock mThreadLock;
-    private final boolean mFileLevelLock;
-    private FileChannel mLockChannel;
-
-    /**
-     * Creates a lock with {@code name} and using {@code lockDir} as the directory for the
-     * lock files.
-     * @param name the name of this lock.
-     * @param lockDir the directory where the lock files will be located.
-     * @param processLock whether to use file for process level locking or not by default. The
-     *                    behaviour can be overridden via the {@link #lock(boolean)}} method.
-     */
-    @SuppressWarnings("StreamFiles") // Overloads with FileDescriptor or Stream are invalid.
-    public ProcessLock(@NonNull String name, @NonNull File lockDir, boolean processLock) {
-        mLockFile = new File(lockDir, name + ".lck");
-        mThreadLock = getThreadLock(mLockFile.getAbsolutePath());
-        mFileLevelLock = processLock;
-    }
-
-    /**
-     * Attempts to grab the lock, blocking if already held by another thread or process.
-     */
-    public void lock() {
-        lock(mFileLevelLock);
-    }
-
-    /**
-     * Attempts to grab the lock, blocking if already held by another thread or process.
-     *
-     * @param processLock whether to use file for process level locking or not.
-     */
-    public void lock(boolean processLock) {
-        mThreadLock.lock();
-        if (processLock) {
-            try {
-                // Verify parent dir
-                File parentDir = mLockFile.getParentFile();
-                if (parentDir != null) {
-                    parentDir.mkdirs();
-                }
-                mLockChannel = new FileOutputStream(mLockFile).getChannel();
-                mLockChannel.lock();
-            } catch (IOException e) {
-                mLockChannel = null;
-                Log.w(TAG, "Unable to grab file lock.", e);
-            }
-        }
-    }
-
-    /**
-     * Releases the lock.
-     */
-    public void unlock() {
-        if (mLockChannel != null) {
-            try {
-                mLockChannel.close();
-            } catch (IOException ignored) { }
-        }
-        mThreadLock.unlock();
-    }
-
-    private static Lock getThreadLock(String key) {
-        synchronized (sThreadLocks) {
-            Lock threadLock = sThreadLocks.get(key);
-            if (threadLock == null) {
-                threadLock = new ReentrantLock();
-                sThreadLocks.put(key, threadLock);
-            }
-            return threadLock;
-        }
-    }
-}
diff --git a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/util/ProcessLock.kt b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/util/ProcessLock.kt
new file mode 100644
index 0000000..3b79342
--- /dev/null
+++ b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/util/ProcessLock.kt
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.sqlite.util
+import android.annotation.SuppressLint
+import android.util.Log
+import androidx.annotation.RestrictTo
+import java.io.File
+import java.io.FileOutputStream
+import java.io.IOException
+import java.nio.channels.FileChannel
+import java.util.concurrent.locks.Lock
+import java.util.concurrent.locks.ReentrantLock
+
+/**
+ * Utility class for in-process and multi-process key-based lock mechanism for safely doing
+ * synchronized operations.
+ *
+ * Acquiring the lock will be quick if no other thread or process has a lock with the same key.
+ * But if the lock is already held then acquiring it will block, until the other thread or process
+ * releases the lock. Note that the key and lock directory must be the same to achieve
+ * synchronization.
+ *
+ * Locking is done via two levels:
+ *
+ * 1. Thread locking within the same JVM process is done via a map of String key to ReentrantLock
+ * objects.
+ *
+ * 2. Multi-process locking is done via a lock file whose name contains the key and FileLock
+ * objects.
+ *
+ * Creates a lock with `name` and using `lockDir` as the directory for the
+ * lock files.
+ *
+ * @param name the name of this lock.
+ * @param lockDir the directory where the lock files will be located.
+ * @param processLock whether to use file for process level locking or not by default. The
+ * behaviour can be overridden via the [lock] method.
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+class ProcessLock(
+    name: String,
+    lockDir: File,
+    private val processLock: Boolean
+) {
+    private val lockFile: File = File(lockDir, "$name.lck")
+    @SuppressLint("SyntheticAccessor")
+    private val threadLock: Lock = getThreadLock(lockFile.absolutePath)
+    private var lockChannel: FileChannel? = null
+
+    /**
+     * Attempts to grab the lock, blocking if already held by another thread or process.
+     *
+     * @param [processLock] whether to use file for process level locking or not.
+     */
+    fun lock(processLock: Boolean = this.processLock) {
+        threadLock.lock()
+        if (processLock) {
+            try {
+                // Verify parent dir
+                val parentDir = lockFile.parentFile
+                parentDir?.mkdirs()
+                lockChannel = FileOutputStream(lockFile).channel.apply { lock() }
+            } catch (e: IOException) {
+                lockChannel = null
+                Log.w(TAG, "Unable to grab file lock.", e)
+            }
+        }
+    }
+
+    /**
+     * Releases the lock.
+     */
+    fun unlock() {
+        try {
+            lockChannel?.close()
+        } catch (ignored: IOException) { }
+        threadLock.unlock()
+    }
+
+    companion object {
+        private const val TAG = "SupportSQLiteLock"
+        // in-process lock map
+        private val threadLocksMap: MutableMap<String, Lock> = HashMap()
+        private fun getThreadLock(key: String): Lock = synchronized(threadLocksMap) {
+            return threadLocksMap.getOrPut(key) { ReentrantLock() }
+        }
+    }
+}
\ No newline at end of file
diff --git a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/util/SneakyThrow.java b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/util/SneakyThrow.java
deleted file mode 100644
index e1309b4..0000000
--- a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/util/SneakyThrow.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.sqlite.util;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-
-/**
- * Java 8 Sneaky Throw technique.
- *
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class SneakyThrow {
-
-    /**
-     * Re-throws a throwable as if it was a runtime exception without wrapping it.
-     *
-     * @param t the throwable to re-throw.
-     */
-    public static void reThrow(@NonNull Throwable t) {
-        sneakyThrow(t);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static <E extends Throwable> void sneakyThrow(@NonNull Throwable t) throws E {
-        throw (E) t;
-    }
-
-    private SneakyThrow() {
-
-    }
-}
diff --git a/sqlite/sqlite-inspection/build.gradle b/sqlite/sqlite-inspection/build.gradle
index 8ef5fda..ba9d20e 100644
--- a/sqlite/sqlite-inspection/build.gradle
+++ b/sqlite/sqlite-inspection/build.gradle
@@ -57,10 +57,3 @@
     }
     namespace "androidx.sqlite.inspection"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/BySelectorTests.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/BySelectorTest.java
similarity index 99%
rename from test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/BySelectorTests.java
rename to test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/BySelectorTest.java
index 44cbca1..1bef873 100644
--- a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/BySelectorTests.java
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/BySelectorTest.java
@@ -29,7 +29,7 @@
 
 import java.util.regex.Pattern;
 
-public class BySelectorTests extends BaseTest {
+public class BySelectorTest extends BaseTest {
 
     @Test
     public void testCopy() {
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/MultiWindowTests.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/MultiWindowTest.java
similarity index 98%
rename from test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/MultiWindowTests.java
rename to test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/MultiWindowTest.java
index ff9a7bd..5d92fd9 100644
--- a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/MultiWindowTests.java
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/MultiWindowTest.java
@@ -46,7 +46,7 @@
 
 /** Integration tests for multi-window support. */
 @LargeTest
-public class MultiWindowTests extends BaseTest {
+public class MultiWindowTest extends BaseTest {
 
     private static final long TIMEOUT_MS = 30_000;
     private static final long DELAY_MS = 5_000;
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiDeviceTest.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiDeviceTest.java
index c4e203a..795e746 100644
--- a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiDeviceTest.java
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiDeviceTest.java
@@ -19,7 +19,6 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
-import androidx.test.filters.FlakyTest;
 import androidx.test.filters.LargeTest;
 import androidx.test.uiautomator.By;
 import androidx.test.uiautomator.UiObject2;
@@ -43,7 +42,6 @@
     @Rule
     public TemporaryFolder mTmpDir = new TemporaryFolder();
 
-    @FlakyTest(bugId = 242767707)
     @Test
     public void testClick() {
         launchTestActivity(UiDeviceTestClickActivity.class);
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Tests.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Test.java
similarity index 98%
rename from test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Tests.java
rename to test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Test.java
index fa4f09d..96d56df 100644
--- a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Tests.java
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Test.java
@@ -41,7 +41,7 @@
 import java.util.List;
 import java.util.Set;
 
-public class UiObject2Tests extends BaseTest {
+public class UiObject2Test extends BaseTest {
     private static final int TIMEOUT_MS = 10_000;
     private static final int SPEED_MS = 100;
     private static final int SCROLL_MARGIN = 50;
@@ -633,7 +633,7 @@
 
     @Test
     public void testFling_direction() {
-        launchTestActivity(UiObject2TestFlingActivity.class);
+        launchTestActivity(FlingTestActivity.class);
 
         // Avoid touching too close to the edges.
         UiObject2 flingRegion = mDevice.findObject(By.res(TEST_APP, "fling_region"));
@@ -650,7 +650,7 @@
 
     @Test
     public void testFling_directionAndSpeed() {
-        launchTestActivity(UiObject2TestFlingActivity.class);
+        launchTestActivity(FlingTestActivity.class);
 
         // Avoid touching too close to the edges.
         UiObject2 flingRegion = mDevice.findObject(By.res(TEST_APP, "fling_region"));
@@ -667,7 +667,7 @@
 
     @Test
     public void testFling_throwsIllegalArgumentException() {
-        launchTestActivity(UiObject2TestFlingActivity.class);
+        launchTestActivity(FlingTestActivity.class);
 
         UiObject2 flingRegion = mDevice.findObject(By.res(TEST_APP, "fling_region"));
 
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiScrollableTest.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiScrollableTest.java
new file mode 100644
index 0000000..6c12c5e
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiScrollableTest.java
@@ -0,0 +1,363 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.test.uiautomator.testapp;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+
+import android.widget.TextView;
+
+import androidx.test.uiautomator.UiObject;
+import androidx.test.uiautomator.UiObjectNotFoundException;
+import androidx.test.uiautomator.UiScrollable;
+import androidx.test.uiautomator.UiSelector;
+
+import org.junit.Test;
+
+public class UiScrollableTest extends BaseTest {
+    @Test
+    public void testGetChildByDescription() throws Exception {
+        launchTestActivity(VerticalScrollTestActivity.class);
+
+        UiScrollable relativeLayout = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout"));
+        UiObject target =
+                relativeLayout.getChildByDescription(new UiSelector().className(TextView.class),
+                        "This is the bottom");
+
+        assertEquals("This is the bottom", target.getText());
+        assertThrows(UiObjectNotFoundException.class,
+                () -> relativeLayout.getChildByDescription(
+                        new UiSelector().className(TextView.class),
+                        "This is non-existent"));
+    }
+
+    @Test
+    public void testGetChildByDescription_withoutScrollSearch() throws Exception {
+        launchTestActivity(VerticalScrollTestActivity.class);
+
+        UiScrollable relativeLayout = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout"));
+        UiObject target =
+                relativeLayout.getChildByDescription(new UiSelector().className(TextView.class),
+                        "This is the top", false);
+
+        assertEquals("This is the top", target.getText());
+        assertThrows(UiObjectNotFoundException.class,
+                () -> relativeLayout.getChildByDescription(
+                        new UiSelector().className(TextView.class), "This is the bottom",
+                        false));
+    }
+
+    @Test
+    public void testGetChildByInstance() throws Exception {
+        launchTestActivity(VerticalScrollTestActivity.class);
+
+        // Find the first (0th in 0-based index) instance of `TextView` objects.
+        UiScrollable relativeLayout = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout"));
+        UiObject target =
+                relativeLayout.getChildByInstance(new UiSelector().className(TextView.class), 0);
+
+        // The search in `getChildByInstance` is performed without scrolling.
+        assertEquals("This is the top", target.getText());
+        assertFalse(relativeLayout.getChildByInstance(new UiSelector().className(TextView.class),
+                1).exists());
+    }
+
+    @Test
+    public void testGetChildByText() throws Exception {
+        launchTestActivity(VerticalScrollTestActivity.class);
+
+        UiScrollable relativeLayout = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout"));
+        UiObject target =
+                relativeLayout.getChildByText(new UiSelector().className(TextView.class),
+                        "This is the bottom");
+
+        assertEquals("This is the bottom", target.getText());
+        assertThrows(UiObjectNotFoundException.class,
+                () -> relativeLayout.getChildByText(new UiSelector().className(TextView.class),
+                        "This is non-existent"));
+    }
+
+    @Test
+    public void testGetChildByText_withoutScrollSearch() throws Exception {
+        launchTestActivity(VerticalScrollTestActivity.class);
+
+        UiScrollable relativeLayout = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout"));
+        UiObject target =
+                relativeLayout.getChildByText(new UiSelector().className(TextView.class),
+                        "This is the top", false);
+
+        assertEquals("This is the top", target.getText());
+        assertThrows(UiObjectNotFoundException.class,
+                () -> relativeLayout.getChildByText(new UiSelector().className(TextView.class),
+                        "This is the bottom", false));
+    }
+
+    @Test
+    public void testScrollDescriptionIntoView() throws Exception {
+        launchTestActivity(VerticalScrollTestActivity.class);
+
+        UiScrollable relativeLayout = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout"));
+        UiObject target = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/from_top_15000"));
+
+        assertFalse(target.exists());
+        assertTrue(relativeLayout.scrollDescriptionIntoView("This is 15000px from the top"));
+        assertTrue(target.exists());
+        assertFalse(relativeLayout.scrollDescriptionIntoView("This is non-existent"));
+    }
+
+    @Test
+    public void testScrollIntoView_withUiObject() throws Exception {
+        launchTestActivity(VerticalScrollTestActivity.class);
+
+        UiScrollable relativeLayout = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout"));
+        UiObject target = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/from_top_15000"));
+        UiObject nonExistentTarget = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/not_exist"));
+
+        assertFalse(target.exists());
+        assertTrue(relativeLayout.scrollIntoView(target));
+        assertTrue(target.exists());
+        assertFalse(relativeLayout.scrollIntoView(nonExistentTarget));
+    }
+
+    @Test
+    public void testScrollIntoView_withUiSelector() throws Exception {
+        launchTestActivity(VerticalScrollTestActivity.class);
+
+        UiScrollable relativeLayout = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout"));
+        UiSelector target = new UiSelector().resourceId(TEST_APP + ":id/from_top_15000");
+        UiSelector nonExistentTarget = new UiSelector().resourceId(TEST_APP + ":id/not_exist");
+
+        assertFalse(mDevice.findObject(target).exists());
+        assertTrue(relativeLayout.scrollIntoView(target));
+        assertTrue(mDevice.findObject(target).exists());
+        assertFalse(relativeLayout.scrollIntoView(nonExistentTarget));
+    }
+
+    @Test
+    public void testEnsureFullyVisible() throws Exception {
+        launchTestActivity(VerticalScrollTestActivity.class);
+
+        UiScrollable relativeLayout = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout"));
+        UiObject target = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id/from_top_15000"));
+
+        assertTrue(relativeLayout.scrollIntoView(target));
+        assertTrue(relativeLayout.ensureFullyVisible(target));
+        assertThrows(UiObjectNotFoundException.class,
+                () -> relativeLayout.ensureFullyVisible(
+                        mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id/no_node"))));
+    }
+
+    @Test
+    public void testScrollTextIntoView() throws Exception {
+        launchTestActivity(VerticalScrollTestActivity.class);
+
+        UiScrollable relativeLayout = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout"));
+        UiObject target = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/from_top_15000"));
+
+        assertFalse(target.exists());
+        assertTrue(relativeLayout.scrollTextIntoView("This is 15000px from the top"));
+        assertTrue(target.exists());
+        assertFalse(relativeLayout.scrollTextIntoView("This is non-existent"));
+    }
+
+    @Test
+    public void testSetMaxSearchSwipesAndGetMaxSearchSwipes() {
+        UiScrollable scrollable = new UiScrollable(new UiSelector()).setMaxSearchSwipes(5);
+        assertEquals(5, scrollable.getMaxSearchSwipes());
+    }
+
+    @Test
+    public void testFlingForward() throws Exception {
+        launchTestActivity(FlingTestActivity.class);
+
+        UiScrollable flingRegion = new UiScrollable(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/fling_region")).setAsVerticalList();
+
+        // The `fling_region` won't move (thus return false), but it will receive the fling action.
+        assertFalse(flingRegion.flingForward());
+        assertEquals("fling_down", flingRegion.getText());
+
+        // Assert throwing exception for `scrollForward(int)` and all its related methods.
+        UiScrollable noNode = new UiScrollable(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/no_node"));
+        assertThrows(UiObjectNotFoundException.class, noNode::flingForward);
+    }
+
+    @Test
+    public void testScrollForward_vertical() throws Exception {
+        launchTestActivity(SwipeTestActivity.class);
+
+        UiScrollable scrollRegion = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/swipe_region")).setAsVerticalList();
+
+        assertFalse(scrollRegion.scrollForward());
+        assertEquals("swipe_up", scrollRegion.getText());
+    }
+
+    @Test
+    public void testScrollForward_horizontal() throws Exception {
+        launchTestActivity(SwipeTestActivity.class);
+
+        UiScrollable scrollRegion = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/swipe_region")).setAsHorizontalList();
+
+        assertFalse(scrollRegion.scrollForward(50));
+        assertEquals("swipe_left", scrollRegion.getText());
+    }
+
+    @Test
+    public void testFlingBackward() throws Exception {
+        launchTestActivity(FlingTestActivity.class);
+
+        UiScrollable flingRegion = new UiScrollable(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/fling_region")).setAsVerticalList();
+
+        assertFalse(flingRegion.flingBackward());
+        assertEquals("fling_up", flingRegion.getText());
+
+        UiScrollable noNode = new UiScrollable(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/no_node"));
+        assertThrows(UiObjectNotFoundException.class, noNode::flingBackward);
+    }
+
+    @Test
+    public void testScrollBackward_vertical() throws Exception {
+        launchTestActivity(SwipeTestActivity.class);
+
+        UiScrollable scrollRegion = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/swipe_region")).setAsVerticalList();
+
+        assertFalse(scrollRegion.scrollBackward());
+        assertEquals("swipe_down", scrollRegion.getText());
+    }
+
+    @Test
+    public void testScrollBackward_horizontal() throws Exception {
+        launchTestActivity(SwipeTestActivity.class);
+
+        UiScrollable scrollRegion = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/swipe_region")).setAsHorizontalList();
+
+        assertFalse(scrollRegion.scrollBackward(50));
+        assertEquals("swipe_right", scrollRegion.getText());
+    }
+
+    @Test
+    public void testScrollToBeginning_withSteps() throws Exception {
+        launchTestActivity(VerticalScrollTestActivity.class);
+
+        UiScrollable relativeLayout = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout"));
+        UiObject topText = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/top_text"));
+
+        assertTrue(relativeLayout.scrollTextIntoView("This is 15000px from the top"));
+        assertFalse(topText.exists());
+        assertTrue(relativeLayout.scrollToBeginning(20, 50));
+        assertTrue(topText.exists());
+    }
+
+    @Test
+    public void testScrollToBeginning() throws Exception {
+        launchTestActivity(VerticalScrollTestActivity.class);
+
+        UiScrollable relativeLayout = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout"));
+        UiObject topText = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/top_text"));
+
+        assertTrue(relativeLayout.scrollTextIntoView("This is 15000px from the top"));
+        assertFalse(topText.exists());
+        assertTrue(relativeLayout.scrollToBeginning(20));
+        assertTrue(topText.exists());
+    }
+
+    @Test
+    public void testFlingToBeginning() throws Exception {
+        launchTestActivity(FlingTestActivity.class);
+
+        UiScrollable flingRegion = new UiScrollable(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/fling_region")).setAsVerticalList();
+
+        assertTrue(flingRegion.flingToBeginning(20));
+        assertEquals("fling_up", flingRegion.getText());
+    }
+
+    @Test
+    public void testScrollToEnd_withSteps() throws Exception {
+        launchTestActivity(VerticalScrollTestActivity.class);
+
+        UiScrollable relativeLayout = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout"));
+        UiObject bottomText = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id/bottom_text"));
+
+        assertFalse(bottomText.exists());
+        assertTrue(relativeLayout.scrollToEnd(20, 50));
+        assertTrue(bottomText.exists());
+    }
+
+    @Test
+    public void testScrollToEnd() throws Exception {
+        launchTestActivity(VerticalScrollTestActivity.class);
+        launchTestActivity(VerticalScrollTestActivity.class);
+
+        UiScrollable relativeLayout = new UiScrollable(
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout"));
+        UiObject bottomText = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id/bottom_text"));
+
+        assertFalse(bottomText.exists());
+        assertTrue(relativeLayout.scrollToEnd(20));
+        assertTrue(bottomText.exists());
+    }
+
+    @Test
+    public void testFlingToEnd() throws Exception {
+        launchTestActivity(FlingTestActivity.class);
+
+        UiScrollable flingRegion = new UiScrollable(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/fling_region")).setAsVerticalList();
+
+        assertTrue(flingRegion.flingToEnd(20));
+        assertEquals("fling_down", flingRegion.getText());
+    }
+
+    @Test
+    public void testSetSwipeDeadZonePercentageAndGetSwipeDeadZonePercentage() {
+        UiScrollable scrollable =
+                new UiScrollable(new UiSelector()).setSwipeDeadZonePercentage(0.2);
+        assertEquals(0.2, scrollable.getSwipeDeadZonePercentage(), 0.01);
+    }
+}
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiSelectorTests.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiSelectorTest.java
similarity index 99%
rename from test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiSelectorTests.java
rename to test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiSelectorTest.java
index 6250251..e5e1395 100644
--- a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiSelectorTests.java
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiSelectorTest.java
@@ -28,7 +28,7 @@
 
 import org.junit.Test;
 
-public class UiSelectorTests extends BaseTest {
+public class UiSelectorTest extends BaseTest {
 
     @Test
     public void testText() {
diff --git a/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml b/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml
index 07b71cf..ff87968 100644
--- a/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -76,6 +76,13 @@
                 <action android:name="android.intent.action.MAIN" />
             </intent-filter>
         </activity>
+        <activity android:name=".FlingTestActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.Holo.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
         <activity android:name=".IsEnabledTestActivity"
             android:exported="true"
             android:theme="@android:style/Theme.Holo.NoActionBar">
@@ -164,13 +171,6 @@
                 <action android:name="android.intent.action.MAIN" />
             </intent-filter>
         </activity>
-        <activity android:name=".UiObject2TestFlingActivity"
-            android:exported="true"
-            android:theme="@android:style/Theme.Holo.NoActionBar">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-            </intent-filter>
-        </activity>
         <activity android:name=".UntilTestActivity"
             android:exported="true"
             android:theme="@android:style/Theme.Holo.NoActionBar">
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestFlingActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/FlingTestActivity.java
similarity index 93%
rename from test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestFlingActivity.java
rename to test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/FlingTestActivity.java
index 8408cf4..06b15129 100644
--- a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestFlingActivity.java
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/FlingTestActivity.java
@@ -25,7 +25,7 @@
 
 import androidx.annotation.Nullable;
 
-public class UiObject2TestFlingActivity extends Activity {
+public class FlingTestActivity extends Activity {
 
     private GestureDetector mGestureDetector;
 
@@ -33,7 +33,7 @@
     public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        setContentView(R.layout.uiobject2_testfling_activity);
+        setContentView(R.layout.fling_test_activity);
 
         TextView flingRegion = findViewById(R.id.fling_region);
 
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testfling_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/fling_test_activity.xml
similarity index 95%
rename from test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testfling_activity.xml
rename to test/uiautomator/integration-tests/testapp/src/main/res/layout/fling_test_activity.xml
index 30ef223..5498f7a 100644
--- a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testfling_activity.xml
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/fling_test_activity.xml
@@ -18,7 +18,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
-    tools:context=".UiObject2TestFlingActivity">
+    tools:context=".FlingTestActivity">
 
     <TextView
         android:id="@+id/fling_region"
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/vertical_scroll_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/vertical_scroll_test_activity.xml
index 2708e14..d7d3aee 100644
--- a/test/uiautomator/integration-tests/testapp/src/main/res/layout/vertical_scroll_test_activity.xml
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/vertical_scroll_test_activity.xml
@@ -26,6 +26,7 @@
         android:layout_height="wrap_content">
 
         <RelativeLayout
+            android:id="@+id/relative_layout"
             android:layout_width="fill_parent"
             android:layout_height="20000px">
 
@@ -34,6 +35,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="50px"
                 android:layout_alignParentTop="true"
+                android:contentDescription="This is the top"
                 android:text="This is the top" />
 
             <TextView
@@ -42,6 +44,7 @@
                 android:layout_height="50px"
                 android:layout_alignParentTop="true"
                 android:layout_marginTop="5000px"
+                android:contentDescription="This is 5000px from the top"
                 android:text="This is 5000px from the top" />
 
             <TextView
@@ -50,6 +53,7 @@
                 android:layout_height="50px"
                 android:layout_alignParentTop="true"
                 android:layout_marginTop="10000px"
+                android:contentDescription="This is 10000px from the top"
                 android:text="This is 10000px from the top" />
 
             <TextView
@@ -58,6 +62,7 @@
                 android:layout_height="50px"
                 android:layout_alignParentTop="true"
                 android:layout_marginTop="15000px"
+                android:contentDescription="This is 15000px from the top"
                 android:text="This is 15000px from the top" />
 
             <TextView
@@ -65,6 +70,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_alignParentBottom="true"
+                android:contentDescription="This is the bottom"
                 android:text="This is the bottom" />
 
         </RelativeLayout>
diff --git a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/ByMatcher.java b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/ByMatcher.java
index 07c45f1..99d6228 100644
--- a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/ByMatcher.java
+++ b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/ByMatcher.java
@@ -134,21 +134,6 @@
      */
     private List<AccessibilityNodeInfo> findMatches(AccessibilityNodeInfo node,
             int index, int depth, SinglyLinkedList<PartialMatch> partialMatches) {
-        try {
-            return findMatchesRecursively(node, index, depth, partialMatches);
-        } catch (RuntimeException e) {
-            throw newRecursionError(node, e);
-        } catch (Error e) {
-            throw newRecursionError(node, e);
-        }
-    }
-
-    private IllegalStateException newRecursionError(AccessibilityNodeInfo node, Throwable t) {
-        return new IllegalStateException(String.format("Recursion error for node =%s", node), t);
-    }
-
-    private List<AccessibilityNodeInfo> findMatchesRecursively(AccessibilityNodeInfo node,
-            int index, int depth, SinglyLinkedList<PartialMatch> partialMatches) {
         List<AccessibilityNodeInfo> ret = new ArrayList<AccessibilityNodeInfo>();
 
         // Don't bother searching the subtree if it is not visible
@@ -182,7 +167,7 @@
             }
 
             // Add any matches found under the child subtree
-            ret.addAll(findMatchesRecursively(child, i, depth + 1, partialMatches));
+            ret.addAll(findMatches(child, i, depth + 1, partialMatches));
 
             // We're done with the child
             child.recycle();
diff --git a/testutils/testutils-common/build.gradle b/testutils/testutils-common/build.gradle
index 705f77d..a73524b 100644
--- a/testutils/testutils-common/build.gradle
+++ b/testutils/testutils-common/build.gradle
@@ -31,13 +31,6 @@
     testImplementation(libs.truth)
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 androidx {
     type = LibraryType.INTERNAL_TEST_LIBRARY
 }
diff --git a/testutils/testutils-fonts/src/commonMain/resources/font/sample_font.ttf b/testutils/testutils-fonts/src/commonMain/resources/font/sample_font.ttf
index 6fc6c3e..ec8e206 100644
--- a/testutils/testutils-fonts/src/commonMain/resources/font/sample_font.ttf
+++ b/testutils/testutils-fonts/src/commonMain/resources/font/sample_font.ttf
Binary files differ
diff --git a/testutils/testutils-fonts/src/font_ttx/sample_font.ttx b/testutils/testutils-fonts/src/font_ttx/sample_font.ttx
index bb40268..8f1c64d 100644
--- a/testutils/testutils-fonts/src/font_ttx/sample_font.ttx
+++ b/testutils/testutils-fonts/src/font_ttx/sample_font.ttx
@@ -20,6 +20,7 @@
     <GlyphID id="1" name="1em"/>
     <GlyphID id="2" name="1em_rtl"/>
     <GlyphID id="3" name="space"/>
+    <GlyphID id="3" name="1em_ellipsis"/>
     <GlyphID id="4" name="linefeed"/>
   </GlyphOrder>
 
@@ -131,6 +132,7 @@
     <mtx name="1em" width="1000" lsb="0"/>
     <mtx name="1em_rtl" width="1000" lsb="0"/>
     <mtx name="space" width="1000" lsb="0"/>
+    <mtx name="1em_ellipsis" width="1000" lsb="0"/>
     <mtx name="linefeed" width="500" lsb="0"/>
   </hmtx>
 
@@ -224,7 +226,7 @@
         <map code="0x05E9" name="1em_rtl"/>	<!-- ש Shin -->
         <map code="0x05EA" name="1em_rtl"/>	<!-- ת Tav -->
 
-        <map code="0x2026" name="1em"/> <!-- ELLIPSIS -->
+        <map code="0x2026" name="1em_ellipsis"/> <!-- ELLIPSIS -->
 
         <map code="0x1d11e" name="1em"/><!-- MUSICAL SYMBOL G CLEF -->
         <map code="0x1d11f" name="1em"/><!-- MUSICAL SYMBOL G CLEF OTTAVA ALTA -->
@@ -257,6 +259,15 @@
         </contour>
         <instructions />
     </TTGlyph>
+    <TTGlyph name="1em_ellipsis" xMin="0" yMin="-200" xMax="1000" yMax="800">
+        <contour>
+            <pt x="0" y="-200" on="1"/>
+            <pt x="1000" y="-200" on="1"/>
+            <pt x="1000" y="0" on="1"/>
+            <pt x="0" y="0" on="1"/>
+        </contour>
+        <instructions />
+    </TTGlyph>
     <TTGlyph name="space" xMin="0" yMin="-200" xMax="1000" yMax="800">
         <contour>
             <pt x="0" y="0" on="1"/>
diff --git a/testutils/testutils-ktx/build.gradle b/testutils/testutils-ktx/build.gradle
index bbfc6db..499d1ed 100644
--- a/testutils/testutils-ktx/build.gradle
+++ b/testutils/testutils-ktx/build.gradle
@@ -29,13 +29,6 @@
     api(libs.junit)
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 androidx {
     type = LibraryType.INTERNAL_TEST_LIBRARY
 }
diff --git a/testutils/testutils-navigation/build.gradle b/testutils/testutils-navigation/build.gradle
index c6ab842..a76c992 100644
--- a/testutils/testutils-navigation/build.gradle
+++ b/testutils/testutils-navigation/build.gradle
@@ -47,9 +47,3 @@
 android {
     namespace "androidx.testutils.navigation"
 }
-
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
-    }
-}
diff --git a/testutils/testutils-paging/build.gradle b/testutils/testutils-paging/build.gradle
index 48e0e1f..f2eb353 100644
--- a/testutils/testutils-paging/build.gradle
+++ b/testutils/testutils-paging/build.gradle
@@ -29,13 +29,6 @@
     implementation(libs.kotlinTest)
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 androidx {
     type = LibraryType.INTERNAL_TEST_LIBRARY
 }
diff --git a/text/text/src/androidTest/java/androidx/compose/ui/text/android/TextLayoutIsLineEllipsizedTest.kt b/text/text/src/androidTest/java/androidx/compose/ui/text/android/TextLayoutIsLineEllipsizedTest.kt
new file mode 100644
index 0000000..42f6f2f
--- /dev/null
+++ b/text/text/src/androidTest/java/androidx/compose/ui/text/android/TextLayoutIsLineEllipsizedTest.kt
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.ui.text.android
+
+import android.text.TextPaint
+import android.text.TextUtils.TruncateAt
+import androidx.core.content.res.ResourcesCompat
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.testutils.fonts.R
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+@OptIn(InternalPlatformTextApi::class)
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class TextLayoutIsLineEllipsizedTest {
+    private val sampleTypeface = ResourcesCompat.getFont(
+        InstrumentationRegistry.getInstrumentation().context, R.font.sample_font
+    )!!
+    private val fontSize = 10f
+    private val maxLines = 5
+    private val charsInline = 10
+    private val width = charsInline * fontSize
+    private val ltrText = "a".repeat(charsInline).repeat(maxLines * 2)
+    private val rtlText = "\u05D0".repeat(charsInline).repeat(maxLines * 2)
+
+    @Test
+    fun notEllipsized_ltr() {
+        val textLayout = EllipsizedTextLayout(ltrText, null)
+        textLayout.assertNotEllipsized()
+    }
+
+    @Test
+    fun notEllipsized_rtl() {
+        val textLayout = EllipsizedTextLayout(rtlText, null)
+        textLayout.assertNotEllipsized()
+    }
+
+    @Test
+    fun ellipsizeEnd_end_ltr() {
+        val textLayout = EllipsizedTextLayout(ltrText, TruncateAt.END)
+        textLayout.assertEndEllipsized()
+    }
+
+    @Test
+    fun ellipsizeEnd_end_rtl() {
+        val textLayout = EllipsizedTextLayout(rtlText, TruncateAt.END)
+        textLayout.assertEndEllipsized()
+    }
+
+    @Test
+    fun ellipsizeEnd_start_ltr() {
+        // TruncateAt.START works only for single line
+        val textLayout = EllipsizedTextLayout(ltrText, TruncateAt.START, maxLines = 1)
+        textLayout.assertStartEllipsized()
+    }
+
+    @Test
+    fun ellipsizeEnd_start_rtl() {
+        // TruncateAt.START works only for single line
+        val textLayout = EllipsizedTextLayout(rtlText, TruncateAt.START, maxLines = 1)
+        textLayout.assertStartEllipsized()
+    }
+
+    private fun TextLayout.assertEndEllipsized() {
+        for (line in 0 until this.lineCount) {
+            if (line == maxLines - 1) {
+                assertThat(this.isLineEllipsized(line)).isTrue()
+            } else {
+                assertThat(this.isLineEllipsized(line)).isFalse()
+            }
+        }
+    }
+
+    private fun TextLayout.assertStartEllipsized() {
+        for (line in 0 until this.lineCount) {
+            if (line == 0) {
+                assertThat(this.isLineEllipsized(line)).isTrue()
+            } else {
+                assertThat(this.isLineEllipsized(line)).isFalse()
+            }
+        }
+    }
+
+    private fun TextLayout.assertNotEllipsized() {
+        for (line in 0 until this.lineCount) {
+            assertThat(this.isLineEllipsized(line)).isFalse()
+        }
+    }
+
+    private fun EllipsizedTextLayout(
+        text: CharSequence,
+        truncateAt: TruncateAt?,
+        maxLines: Int = this.maxLines
+    ): TextLayout {
+        val textPaint = TextPaint().apply {
+            this.typeface = sampleTypeface
+            this.textSize = fontSize
+        }
+
+        return TextLayout(
+            charSequence = text,
+            textPaint = textPaint,
+            ellipsize = truncateAt,
+            width = width,
+            maxLines = maxLines
+        )
+    }
+}
\ No newline at end of file
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt b/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt
index 0e8900c..c75e291 100644
--- a/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt
@@ -981,4 +981,4 @@
     return lineHeightStyleSpans
 }
 
-internal fun Layout.isLineEllipsized(lineIndex: Int) = this.getEllipsisStart(lineIndex) != 0
\ No newline at end of file
+internal fun Layout.isLineEllipsized(lineIndex: Int) = this.getEllipsisCount(lineIndex) > 0
\ No newline at end of file
diff --git a/tracing/tracing-perfetto-binary/src/main/cpp/tracing_perfetto.cc b/tracing/tracing-perfetto-binary/src/main/cpp/tracing_perfetto.cc
index 0465a06..589db34 100644
--- a/tracing/tracing-perfetto-binary/src/main/cpp/tracing_perfetto.cc
+++ b/tracing/tracing-perfetto-binary/src/main/cpp/tracing_perfetto.cc
@@ -25,7 +25,7 @@
 // Concept of version useful e.g. for human-readable error messages, and stable once released.
 // Does not replace the need for a binary verification mechanism (e.g. checksum check).
 // TODO: populate using CMake
-#define VERSION "1.0.0-alpha02"
+#define VERSION "1.0.0-alpha03"
 
 namespace tracing_perfetto {
     void RegisterWithPerfetto() {
diff --git a/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/jni/test/PerfettoNativeTest.kt b/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/jni/test/PerfettoNativeTest.kt
index 0231115..49335ed 100644
--- a/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/jni/test/PerfettoNativeTest.kt
+++ b/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/jni/test/PerfettoNativeTest.kt
@@ -30,7 +30,7 @@
         init {
             PerfettoNative.loadLib()
         }
-        const val libraryVersion = "1.0.0-alpha02" // TODO: get using reflection
+        const val libraryVersion = "1.0.0-alpha03" // TODO: get using reflection
     }
 
     @Test
diff --git a/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/jni/PerfettoNative.kt b/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/jni/PerfettoNative.kt
index 120b352..4b55570 100644
--- a/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/jni/PerfettoNative.kt
+++ b/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/jni/PerfettoNative.kt
@@ -23,12 +23,12 @@
 
     // TODO(224510255): load from a file produced at build time
     object Metadata {
-        const val version = "1.0.0-alpha02"
+        const val version = "1.0.0-alpha03"
         val checksums = mapOf(
-            "arm64-v8a" to "d6187ec5bd682c48b50416c0486893cb721a816e3f28cee63bdf5e8af4e2cb36",
-            "armeabi-v7a" to "ccae81fba02dcb139bd567ffd804de444d02b2435eddbd2ecfe597ce824cf3af",
-            "x86" to "a796d80749ce7defc11ad9c0ad89ec783fd13fa52ce42b75ea562d0bfbb51714",
-            "x86_64" to "e9064001c7267bb6a77c5f521a00aef396bb8f64e8fd78b62df23a1bba7b18ce",
+            "arm64-v8a" to "388c9770a0a1690bac0e79e8d90c109b20ad46aa0bdb7ee6d8a7b87cf914474a",
+            "armeabi-v7a" to "062f5b16ab1ae5ff1498d84ceeb6a6b8f1efa98b49350de2c1ff2abb53a7e954",
+            "x86" to "0aeec233848db85805387d37f432db67520cb9f094997df66b0cb82f10d188b6",
+            "x86_64" to "c416fab9db04d323d46fdcfc228fb74b26ab308d91afa3a7c1ee4ed2aa44b7df",
         )
     }
 
diff --git a/tv/tv-foundation/build.gradle b/tv/tv-foundation/build.gradle
index c8dd293..2584bf1 100644
--- a/tv/tv-foundation/build.gradle
+++ b/tv/tv-foundation/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import androidx.build.AndroidXComposePlugin
 import androidx.build.LibraryType
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
@@ -31,24 +30,23 @@
 dependencies {
     api(libs.kotlinStdlib)
 
-    api("androidx.annotation:annotation:1.1.0")
-    api(project(":compose:animation:animation"))
-    api(project(':compose:runtime:runtime'))
-    api(project(":compose:ui:ui"))
+    def composeVersion = '1.2.1'
+
+    api("androidx.annotation:annotation:1.4.0")
+    api("androidx.compose.animation:animation:$composeVersion")
+    api("androidx.compose.runtime:runtime:$composeVersion")
+    api("androidx.compose.ui:ui:$composeVersion")
 
     implementation(libs.kotlinStdlibCommon)
+    implementation("androidx.compose.foundation:foundation:$composeVersion")
     implementation(project(":compose:foundation:foundation"))
-    implementation(project(":compose:foundation:foundation-layout"))
-    implementation(project(":compose:ui:ui-graphics"))
-    implementation(project(":compose:ui:ui-text"))
-    implementation(project(":compose:ui:ui-util"))
-    implementation("androidx.profileinstaller:profileinstaller:1.2.0-alpha02")
+    implementation("androidx.compose.foundation:foundation-layout:$composeVersion")
+    implementation("androidx.compose.ui:ui-graphics:$composeVersion")
+    implementation("androidx.compose.ui:ui-text:$composeVersion")
+    implementation("androidx.compose.ui:ui-util:$composeVersion")
+    implementation("androidx.profileinstaller:profileinstaller:1.2.0")
 
-    testImplementation(libs.testRules)
-    testImplementation(libs.testRunner)
-    testImplementation(libs.junit)
-    implementation(libs.truth)
-
+    androidTestImplementation(libs.truth)
     androidTestImplementation(project(":compose:ui:ui-test"))
     androidTestImplementation(project(":compose:ui:ui-test-junit4"))
     androidTestImplementation(project(":compose:test-utils"))
@@ -58,10 +56,8 @@
 android {
     namespace "androidx.tv.foundation"
     defaultConfig {
-        minSdkVersion 28
+        minSdkVersion 21
     }
-    // Use Robolectric 4.+
-    testOptions.unitTests.includeAndroidResources = true
     lintOptions {
         disable 'IllegalExperimentalApiUsage' // TODO (b/233188423): Address before moving to beta
     }
diff --git a/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazyListState.kt b/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazyListState.kt
index 37862be..3328e28 100644
--- a/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazyListState.kt
+++ b/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazyListState.kt
@@ -95,12 +95,10 @@
      * be recomposed on every change causing potential performance issues.
      *
      * If you want to run some side effects like sending an analytics event or updating a state
-     * based on this value consider using "snapshotFlow":
-     * @sample androidx.compose.foundation.samples.UsingListScrollPositionForSideEffectSample
+     * based on this value consider using "snapshotFlow".
      *
      * If you need to use it in the composition then consider wrapping the calculation into a
-     * derived state in order to only have recompositions when the derived value changes:
-     * @sample androidx.compose.foundation.samples.UsingListScrollPositionInCompositionSample
+     * derived state in order to only have recompositions when the derived value changes.
      */
     val firstVisibleItemIndex: Int get() = scrollPosition.index.value
 
@@ -127,8 +125,7 @@
      * Therefore, avoid using it in the composition.
      *
      * If you want to run some side effects like sending an analytics event or updating a state
-     * based on this value consider using "snapshotFlow":
-     * @sample androidx.compose.foundation.samples.UsingListLayoutInfoForSideEffectSample
+     * based on this value consider using "snapshotFlow"
      */
     val layoutInfo: TvLazyListLayoutInfo get() = layoutInfoState.value
 
diff --git a/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/TvLazyListItemScope.kt b/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/TvLazyListItemScope.kt
index 441895d..59f42ba 100644
--- a/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/TvLazyListItemScope.kt
+++ b/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/TvLazyListItemScope.kt
@@ -83,8 +83,6 @@
      * enable item reordering animations. Aside from item reordering all other position changes
      * caused by events like arrangement or alignment changes will also be animated.
      *
-     * @sample androidx.compose.foundation.samples.ItemPlacementAnimationSample
-     *
      * @param animationSpec a finite animation that will be used to animate the item placement.
      */
     @ExperimentalFoundationApi
diff --git a/tv/tv-material/api/current.txt b/tv/tv-material/api/current.txt
index e6f50d0..0ed6747 100644
--- a/tv/tv-material/api/current.txt
+++ b/tv/tv-material/api/current.txt
@@ -1 +1,18 @@
 // Signature format: 4.0
+package androidx.tv.material.carousel {
+
+  public final class CarouselItemKt {
+  }
+
+  public final class CarouselKt {
+  }
+
+}
+
+package androidx.tv.material.pager {
+
+  public final class PagerKt {
+  }
+
+}
+
diff --git a/tv/tv-material/api/public_plus_experimental_current.txt b/tv/tv-material/api/public_plus_experimental_current.txt
index e6f50d0..4e063ddc4 100644
--- a/tv/tv-material/api/public_plus_experimental_current.txt
+++ b/tv/tv-material/api/public_plus_experimental_current.txt
@@ -1 +1,59 @@
 // Signature format: 4.0
+package androidx.tv.material {
+
+  @kotlin.RequiresOptIn(message="This tv-material API is experimental and likely to change or be removed in the future.") public @interface ExperimentalTvMaterialApi {
+  }
+
+}
+
+package androidx.tv.material.carousel {
+
+  @androidx.tv.material.ExperimentalTvMaterialApi public final class CarouselDefaults {
+    method @androidx.compose.runtime.Composable @androidx.tv.material.ExperimentalTvMaterialApi public void Indicator(androidx.tv.material.carousel.CarouselState carouselState, int slideCount, optional androidx.compose.ui.Modifier modifier);
+    method public androidx.compose.animation.EnterTransition getEnterTransition();
+    method public androidx.compose.animation.ExitTransition getExitTransition();
+    method public long getTimeToDisplaySlideMillis();
+    property public final androidx.compose.animation.EnterTransition EnterTransition;
+    property public final androidx.compose.animation.ExitTransition ExitTransition;
+    property public final long TimeToDisplaySlideMillis;
+    field public static final androidx.tv.material.carousel.CarouselDefaults INSTANCE;
+  }
+
+  @androidx.tv.material.ExperimentalTvMaterialApi public final class CarouselItemDefaults {
+    method public androidx.compose.animation.EnterTransition getOverlayEnterTransition();
+    method public long getOverlayEnterTransitionStartDelayMillis();
+    method public androidx.compose.animation.ExitTransition getOverlayExitTransition();
+    property public final androidx.compose.animation.EnterTransition OverlayEnterTransition;
+    property public final long OverlayEnterTransitionStartDelayMillis;
+    property public final androidx.compose.animation.ExitTransition OverlayExitTransition;
+    field public static final androidx.tv.material.carousel.CarouselItemDefaults INSTANCE;
+  }
+
+  public final class CarouselItemKt {
+    method @androidx.compose.runtime.Composable @androidx.tv.material.ExperimentalTvMaterialApi public static void CarouselItem(kotlin.jvm.functions.Function0<kotlin.Unit> background, optional androidx.compose.ui.Modifier modifier, optional long overlayEnterTransitionStartDelayMillis, optional androidx.compose.animation.EnterTransition overlayEnterTransition, optional androidx.compose.animation.ExitTransition overlayExitTransition, kotlin.jvm.functions.Function0<kotlin.Unit> overlay);
+  }
+
+  public final class CarouselKt {
+    method @androidx.compose.runtime.Composable @androidx.tv.material.ExperimentalTvMaterialApi public static void Carousel(int slideCount, optional androidx.compose.ui.Modifier modifier, optional androidx.tv.material.carousel.CarouselState carouselState, optional long timeToDisplaySlideMillis, optional androidx.compose.animation.EnterTransition enterTransition, optional androidx.compose.animation.ExitTransition exitTransition, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> carouselIndicator, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable @androidx.tv.material.ExperimentalTvMaterialApi public final class CarouselState {
+    ctor public CarouselState(optional int initialSlideIndex);
+    method public int getSlideIndex();
+    method public androidx.tv.material.carousel.ScrollPauseHandle pauseAutoScroll(int slideIndex);
+    property public final int slideIndex;
+  }
+
+  @androidx.tv.material.ExperimentalTvMaterialApi public sealed interface ScrollPauseHandle {
+    method public void resumeAutoScroll();
+  }
+
+}
+
+package androidx.tv.material.pager {
+
+  public final class PagerKt {
+  }
+
+}
+
diff --git a/tv/tv-material/api/restricted_current.txt b/tv/tv-material/api/restricted_current.txt
index e6f50d0..0ed6747 100644
--- a/tv/tv-material/api/restricted_current.txt
+++ b/tv/tv-material/api/restricted_current.txt
@@ -1 +1,18 @@
 // Signature format: 4.0
+package androidx.tv.material.carousel {
+
+  public final class CarouselItemKt {
+  }
+
+  public final class CarouselKt {
+  }
+
+}
+
+package androidx.tv.material.pager {
+
+  public final class PagerKt {
+  }
+
+}
+
diff --git a/tv/tv-material/build.gradle b/tv/tv-material/build.gradle
index 68c20e2..3e5244d 100644
--- a/tv/tv-material/build.gradle
+++ b/tv/tv-material/build.gradle
@@ -15,20 +15,48 @@
  */
 
 import androidx.build.LibraryType
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
     id("AndroidXPlugin")
+    id("AndroidXComposePlugin")
     id("com.android.library")
     id("org.jetbrains.kotlin.android")
 }
 
 dependencies {
     api(libs.kotlinStdlib)
-    // Add dependencies here
+
+    def composeVersion = '1.2.1'
+
+    api("androidx.annotation:annotation:1.4.0")
+    api("androidx.compose.animation:animation:$composeVersion")
+    api("androidx.compose.runtime:runtime:$composeVersion")
+
+    implementation(libs.kotlinStdlibCommon)
+    implementation("androidx.compose.foundation:foundation:$composeVersion")
+    implementation("androidx.compose.foundation:foundation-layout:$composeVersion")
+    implementation(project(":compose:ui:ui"))
+    implementation("androidx.compose.ui:ui-graphics:$composeVersion")
+    implementation("androidx.compose.ui:ui-text:$composeVersion")
+    implementation("androidx.compose.ui:ui-util:$composeVersion")
+    implementation("androidx.profileinstaller:profileinstaller:1.2.0")
+
+    androidTestImplementation(libs.truth)
+
+    androidTestImplementation(project(":compose:ui:ui-test"))
+    androidTestImplementation(project(":compose:ui:ui-test-junit4"))
+    androidTestImplementation(project(":compose:test-utils"))
+    androidTestImplementation(libs.testRunner)
+
+    samples(projectOrArtifact(":tv:tv-material-samples"))
 }
 
 android {
     namespace "androidx.tv.material"
+    defaultConfig {
+        minSdkVersion 21
+    }
 }
 
 androidx {
@@ -37,4 +65,13 @@
     mavenGroup = LibraryGroups.TV
     inceptionYear = "2022"
     description = "build TV applications using controls that adhere to Material Design Language."
+    targetsJavaConsumers = false
+}
+
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += [
+                "-Xjvm-default=all",
+        ]
+    }
 }
diff --git a/tv/tv-material/samples/build.gradle b/tv/tv-material/samples/build.gradle
new file mode 100644
index 0000000..f78e2c8
--- /dev/null
+++ b/tv/tv-material/samples/build.gradle
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import androidx.build.LibraryType
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.application")
+    id("AndroidXComposePlugin")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    implementation(project(":tv:tv-material"))
+    implementation(libs.kotlinStdlib)
+    implementation("androidx.leanback:leanback:1.0.0")
+    implementation(project(":activity:activity"))
+    implementation(project(":compose:material3:material3"))
+    implementation(project(":navigation:navigation-runtime"))
+    implementation("androidx.activity:activity-compose:1.5.1")
+    implementation(project(":tv:tv-foundation"))
+    implementation("androidx.appcompat:appcompat:1.6.0-alpha05")
+}
+
+androidx {
+    name = "TV-Compose Samples"
+    type = LibraryType.SAMPLES
+    mavenGroup = LibraryGroups.TV
+    inceptionYear = "2022"
+    description = "Contains the sample code for the APIs in the androidx.tv:tv-material library"
+}
+
+android {
+    defaultConfig {
+        minSdkVersion 28
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled true
+            shrinkResources true
+            proguardFiles getDefaultProguardFile('proguard-android.txt')
+        }
+    }
+    namespace "androidx.tv.tvmaterial.samples"
+}
diff --git a/tv/tv-material/samples/src/main/AndroidManifest.xml b/tv/tv-material/samples/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..4c801cb
--- /dev/null
+++ b/tv/tv-material/samples/src/main/AndroidManifest.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:supportsRtl="true"
+        android:theme="@style/Theme.Androidx">
+        <activity
+            android:name=".MainActivity"
+            android:banner="@drawable/app_icon_your_company"
+            android:exported="true"
+            android:icon="@drawable/app_icon_your_company"
+            android:label="@string/app_name"
+            android:logo="@drawable/app_icon_your_company"
+            android:screenOrientation="landscape">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+    </application>
+
+    <uses-feature
+        android:name="android.software.leanback"
+        android:required="true" />
+    <uses-feature
+        android:name="android.hardware.touchscreen"
+        android:required="false" />
+
+    <uses-permission android:name="android.permission.INTERNET" />
+
+</manifest>
\ No newline at end of file
diff --git a/tv/tv-material/samples/src/main/java/androidx/tv/tvmaterial/samples/FeaturedCarousel.kt b/tv/tv-material/samples/src/main/java/androidx/tv/tvmaterial/samples/FeaturedCarousel.kt
new file mode 100644
index 0000000..0a19b0c
--- /dev/null
+++ b/tv/tv-material/samples/src/main/java/androidx/tv/tvmaterial/samples/FeaturedCarousel.kt
@@ -0,0 +1,224 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.tv.tvmaterial.samples
+
+import androidx.compose.animation.animateColor
+import androidx.compose.animation.core.LinearEasing
+import androidx.compose.animation.core.RepeatMode
+import androidx.compose.animation.core.infiniteRepeatable
+import androidx.compose.animation.core.rememberInfiniteTransition
+import androidx.compose.animation.core.tween
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
+import androidx.compose.foundation.focusable
+import androidx.compose.foundation.horizontalScroll
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.LazyRow
+import androidx.compose.foundation.lazy.items
+import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Button
+import androidx.compose.material3.Card
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.MaterialTheme
+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.draw.scale
+import androidx.compose.ui.focus.onFocusChanged
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Color.Companion.Cyan
+import androidx.compose.ui.graphics.Color.Companion.Gray
+import androidx.compose.ui.graphics.Color.Companion.Red
+import androidx.compose.ui.graphics.Color.Companion.Yellow
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import androidx.tv.material.ExperimentalTvMaterialApi
+import androidx.tv.material.carousel.Carousel
+import androidx.tv.material.carousel.CarouselItem
+import androidx.tv.material.carousel.CarouselState
+
+@OptIn(ExperimentalTvMaterialApi::class)
+@Composable
+fun FeaturedCarousel() {
+    val carouselState = remember { CarouselState(0) }
+    LazyColumn {
+        item {
+            Carousel(
+                modifier = Modifier
+                    .height(400.dp)
+                    .width(950.dp),
+                carouselState = carouselState,
+                slideCount = 3
+            ) { SampleFrame(it) }
+        }
+
+        items(7) { SampleLazyRow() }
+    }
+}
+
+@OptIn(ExperimentalTvMaterialApi::class)
+@Composable
+fun SampleFrame(idx: Int) {
+    val item = mediaItems[idx]
+
+    CarouselItem(
+        background = {
+            Box(
+                Modifier.background(item.backgroundColor).fillMaxSize()
+            )
+        }) {
+        Box {
+            Column(modifier = Modifier.align(Alignment.BottomStart)) {
+                Text(
+                    text = item.title,
+                    style = MaterialTheme.typography.headlineSmall,
+                    color = Color.Black,
+                    fontWeight = FontWeight.Bold
+                )
+                Text(
+                    text = item.description,
+                    style = MaterialTheme.typography.bodyMedium,
+                    color = Color.Black,
+                    fontWeight = FontWeight.Normal,
+                    modifier = Modifier.padding(0.dp, 8.dp, 0.dp, 0.dp)
+                )
+
+                Row(modifier = Modifier.horizontalScroll(rememberScrollState())) {
+                    SampleButton(text = "PLAY")
+                    SampleButton(text = "INFO")
+                }
+            }
+        }
+    }
+}
+
+@Composable
+fun SampleButton(text: String) {
+    var cardScale
+        by remember { mutableStateOf(0.5f) }
+    val borderGlowColorTransition =
+        rememberInfiniteTransition()
+    var initialValue
+        by remember { mutableStateOf(Color.Transparent) }
+    val glowingColor
+        by borderGlowColorTransition.animateColor(
+            initialValue = initialValue,
+            targetValue = Color.Transparent,
+            animationSpec = infiniteRepeatable(
+                animation = tween(1000, easing = LinearEasing),
+                repeatMode = RepeatMode.Reverse
+            )
+        )
+
+    Button(
+        onClick = {},
+        modifier = Modifier
+            .scale(cardScale)
+            .border(
+                2.dp, glowingColor,
+                RoundedCornerShape(12.dp)
+            )
+            .onFocusChanged { focusState ->
+                if (focusState.isFocused) {
+                    cardScale = 1.0f
+                    initialValue = Color.White
+                } else {
+                    cardScale = 0.5f
+                    initialValue = Color.Transparent
+                }
+            }) {
+        Text(text = text)
+    }
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+fun SampleLazyRow() {
+    LazyRow(
+        state = rememberLazyListState(),
+        contentPadding = PaddingValues(2.dp),
+        horizontalArrangement = Arrangement.spacedBy(4.dp),
+        modifier = Modifier
+            .fillMaxWidth()
+            .height(100.dp)) {
+        items((1..10).map { it.toString() }) {
+            var cardScale by remember { mutableStateOf(0.5f) }
+            val borderGlowColorTransition = rememberInfiniteTransition()
+            var initialValue by remember { mutableStateOf(Color.Transparent) }
+            val glowingColor by borderGlowColorTransition.animateColor(
+                initialValue = initialValue,
+                targetValue = Color.Transparent,
+                animationSpec = infiniteRepeatable(
+                    animation = tween(1000, easing = LinearEasing),
+                    repeatMode = RepeatMode.Reverse
+                )
+            )
+
+            Card(
+                modifier = Modifier
+                    .width(100.dp)
+                    .height(100.dp)
+                    .scale(cardScale)
+                    .border(2.dp, glowingColor, RoundedCornerShape(12.dp))
+                    .onFocusChanged { focusState ->
+                        if (focusState.isFocused) {
+                            cardScale = 1.0f
+                            initialValue = Color.White
+                        } else {
+                            cardScale = 0.5f
+                            initialValue = Color.Transparent
+                        }
+                    }
+                    .focusable()
+            ) {
+                Text(
+                    text = it,
+                    modifier = Modifier
+                        .fillMaxWidth()
+                        .height(100.dp)
+                        .padding(12.dp),
+                    color = Red,
+                    fontWeight = FontWeight.Bold
+
+                )
+            }
+        }
+    }
+}
+
+val mediaItems = listOf(
+    Media(id = "1", title = "Title 1", description = "Description 1", backgroundColor = Gray),
+    Media(id = "2", title = "Title 2", description = "Description 2", backgroundColor = Yellow),
+    Media(id = "3", title = "Title 3", description = "Description 3", backgroundColor = Cyan)
+)
diff --git a/tv/tv-material/samples/src/main/java/androidx/tv/tvmaterial/samples/MainActivity.kt b/tv/tv-material/samples/src/main/java/androidx/tv/tvmaterial/samples/MainActivity.kt
new file mode 100644
index 0000000..c329df0
--- /dev/null
+++ b/tv/tv-material/samples/src/main/java/androidx/tv/tvmaterial/samples/MainActivity.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.tv.tvmaterial.samples
+
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+
+class MainActivity : ComponentActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContent {
+            // A surface container using the 'background' color from the theme
+            Surface(color = MaterialTheme.colorScheme.background) {
+                FeaturedCarousel()
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt b/tv/tv-material/samples/src/main/java/androidx/tv/tvmaterial/samples/Media.kt
similarity index 74%
copy from privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt
copy to tv/tv-material/samples/src/main/java/androidx/tv/tvmaterial/samples/Media.kt
index c4940c5b..dfb2685 100644
--- a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt
+++ b/tv/tv-material/samples/src/main/java/androidx/tv/tvmaterial/samples/Media.kt
@@ -14,4 +14,13 @@
  * limitations under the License.
  */
 
-package androidx.privacysandbox.tools.apigenerator
\ No newline at end of file
+package androidx.tv.tvmaterial.samples
+
+import androidx.compose.ui.graphics.Color
+
+data class Media(
+    val id: String,
+    val title: String,
+    val description: String,
+    val backgroundColor: Color
+)
diff --git a/tv/tv-material/samples/src/main/res/drawable/app_icon_your_company.png b/tv/tv-material/samples/src/main/res/drawable/app_icon_your_company.png
new file mode 100644
index 0000000..0a47b01
--- /dev/null
+++ b/tv/tv-material/samples/src/main/res/drawable/app_icon_your_company.png
Binary files differ
diff --git a/activity/activity-compose/src/main/res/values/ids.xml b/tv/tv-material/samples/src/main/res/layout/activity_main.xml
similarity index 64%
copy from activity/activity-compose/src/main/res/values/ids.xml
copy to tv/tv-material/samples/src/main/res/layout/activity_main.xml
index 7a4e2ae..2a1b45b 100644
--- a/activity/activity-compose/src/main/res/values/ids.xml
+++ b/tv/tv-material/samples/src/main/res/layout/activity_main.xml
@@ -14,6 +14,12 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-<resources>
-    <item type="id" name="report_loaded_composition"/>
-</resources>
\ No newline at end of file
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/main_browse_fragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".MainActivity"
+    tools:deviceIds="tv"
+    tools:ignore="MergeRootFrame" />
\ No newline at end of file
diff --git a/tv/tv-material/samples/src/main/res/mipmap-hdpi/ic_launcher.webp b/tv/tv-material/samples/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
--- /dev/null
+++ b/tv/tv-material/samples/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
diff --git a/tv/tv-material/samples/src/main/res/mipmap-mdpi/ic_launcher.webp b/tv/tv-material/samples/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000..4f0f1d6
--- /dev/null
+++ b/tv/tv-material/samples/src/main/res/mipmap-mdpi/ic_launcher.webp
Binary files differ
diff --git a/tv/tv-material/samples/src/main/res/mipmap-xhdpi/ic_launcher.webp b/tv/tv-material/samples/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000..948a307
--- /dev/null
+++ b/tv/tv-material/samples/src/main/res/mipmap-xhdpi/ic_launcher.webp
Binary files differ
diff --git a/tv/tv-material/samples/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/tv/tv-material/samples/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..28d4b77
--- /dev/null
+++ b/tv/tv-material/samples/src/main/res/mipmap-xxhdpi/ic_launcher.webp
Binary files differ
diff --git a/tv/tv-material/samples/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/tv/tv-material/samples/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..aa7d642
--- /dev/null
+++ b/tv/tv-material/samples/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
Binary files differ
diff --git a/tv/tv-material/samples/src/main/res/values/colors.xml b/tv/tv-material/samples/src/main/res/values/colors.xml
new file mode 100644
index 0000000..733f3f5
--- /dev/null
+++ b/tv/tv-material/samples/src/main/res/values/colors.xml
@@ -0,0 +1,8 @@
+<resources>
+    <color name="background_gradient_start">#000000</color>
+    <color name="background_gradient_end">#DDDDDD</color>
+    <color name="fastlane_background">#0096a6</color>
+    <color name="search_opaque">#ffaa3f</color>
+    <color name="selected_background">#ffaa3f</color>
+    <color name="default_background">#3d3d3d</color>
+</resources>
\ No newline at end of file
diff --git a/tv/tv-material/samples/src/main/res/values/strings.xml b/tv/tv-material/samples/src/main/res/values/strings.xml
new file mode 100644
index 0000000..2d22ec3
--- /dev/null
+++ b/tv/tv-material/samples/src/main/res/values/strings.xml
@@ -0,0 +1,35 @@
+<!--
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<resources>
+    <string name="app_name">Samples</string>
+    <string name="browse_title">Videos by Your Company</string>
+    <string name="related_movies">Related Videos</string>
+    <string name="grid_view">Grid View</string>
+    <string name="error_fragment">Error Fragment</string>
+    <string name="personal_settings">Personal Settings</string>
+    <string name="watch_trailer_1">Watch trailer</string>
+    <string name="watch_trailer_2">FREE</string>
+    <string name="rent_1">Rent By Day</string>
+    <string name="rent_2">From $1.99</string>
+    <string name="buy_1">Buy and Own</string>
+    <string name="buy_2">AT $9.99</string>
+    <string name="movie">Movie</string>
+
+    <!-- Error messages -->
+    <string name="error_fragment_message">An error occurred</string>
+    <string name="dismiss_error">Dismiss</string>
+</resources>
\ No newline at end of file
diff --git a/activity/activity-compose/src/main/res/values/ids.xml b/tv/tv-material/samples/src/main/res/values/themes.xml
similarity index 86%
rename from activity/activity-compose/src/main/res/values/ids.xml
rename to tv/tv-material/samples/src/main/res/values/themes.xml
index 7a4e2ae..402d3ea 100644
--- a/activity/activity-compose/src/main/res/values/ids.xml
+++ b/tv/tv-material/samples/src/main/res/values/themes.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
   Copyright 2022 The Android Open Source Project
 
@@ -14,6 +13,7 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
+
 <resources>
-    <item type="id" name="report_loaded_composition"/>
+    <style name="Theme.Androidx" parent="@style/Theme.AppCompat" />
 </resources>
\ No newline at end of file
diff --git a/tv/tv-material/src/androidTest/java/androidx/tv/material/carousel/CarouselItemTest.kt b/tv/tv-material/src/androidTest/java/androidx/tv/material/carousel/CarouselItemTest.kt
new file mode 100644
index 0000000..25d05ef
--- /dev/null
+++ b/tv/tv-material/src/androidTest/java/androidx/tv/material/carousel/CarouselItemTest.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.tv.material.carousel
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.size
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.unit.dp
+import androidx.tv.material.ExperimentalTvMaterialApi
+import org.junit.Rule
+import org.junit.Test
+
+class CarouselItemTest {
+    @get:Rule
+    val rule = createComposeRule()
+
+    @OptIn(ExperimentalTvMaterialApi::class)
+    @Test
+    fun carouselItem_overlayVisibleAfterRenderTime() {
+        val overlayEnterTransitionStartDelay: Long = 2000
+        val overlayTag = "overlay"
+        val backgroundTag = "background"
+        rule.setContent {
+            CarouselItem(
+                overlayEnterTransitionStartDelayMillis = overlayEnterTransitionStartDelay,
+                background = {
+                    Box(
+                        Modifier
+                            .testTag(backgroundTag)
+                            .size(200.dp)
+                            .background(Color.Blue)) }) {
+                Box(
+                    Modifier
+                        .testTag(overlayTag)
+                        .size(50.dp)
+                        .background(Color.Red))
+            }
+        }
+
+        // only background is visible
+        rule.onNodeWithTag(backgroundTag).assertExists()
+        rule.onNodeWithTag(overlayTag).assertDoesNotExist()
+
+        // advance clock by `overlayEnterTransitionStartDelay`
+        rule.mainClock.advanceTimeBy(overlayEnterTransitionStartDelay)
+
+        rule.onNodeWithTag(backgroundTag).assertExists()
+        rule.onNodeWithTag(overlayTag).assertExists()
+    }
+}
diff --git a/tv/tv-material/src/androidTest/java/androidx/tv/material/carousel/CarouselTest.kt b/tv/tv-material/src/androidTest/java/androidx/tv/material/carousel/CarouselTest.kt
new file mode 100644
index 0000000..00d4043
--- /dev/null
+++ b/tv/tv-material/src/androidTest/java/androidx/tv/material/carousel/CarouselTest.kt
@@ -0,0 +1,484 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.tv.material.carousel
+
+import androidx.compose.animation.animateColor
+import androidx.compose.animation.core.LinearEasing
+import androidx.compose.animation.core.RepeatMode
+import androidx.compose.animation.core.infiniteRepeatable
+import androidx.compose.animation.core.rememberInfiniteTransition
+import androidx.compose.animation.core.tween
+import androidx.compose.foundation.border
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.focusable
+import androidx.compose.foundation.horizontalScroll
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.text.BasicText
+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.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.scale
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.focus.onFocusChanged
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.SemanticsActions
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.assertIsFocused
+import androidx.compose.ui.test.assertIsNotFocused
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.test.onParent
+import androidx.compose.ui.test.performSemanticsAction
+import androidx.compose.ui.unit.dp
+import androidx.tv.material.ExperimentalTvMaterialApi
+import org.junit.Rule
+import org.junit.Test
+
+@OptIn(ExperimentalTvMaterialApi::class)
+class CarouselTest {
+
+    private val delayBetweenSlides = 2500L
+    private val animationTime = 900L
+    private val overlayRenderWaitTime = 1500L
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun carousel_autoScrolls() {
+
+        rule.setContent {
+            Content()
+        }
+
+        rule.onNodeWithText("Text 1").assertIsDisplayed()
+
+        rule.mainClock.advanceTimeBy(delayBetweenSlides)
+        rule.mainClock.advanceTimeBy(animationTime)
+        rule.onNodeWithText("Text 2").assertIsDisplayed()
+
+        rule.mainClock.advanceTimeBy(delayBetweenSlides)
+        rule.mainClock.advanceTimeBy(animationTime)
+        rule.onNodeWithText("Text 3").assertIsDisplayed()
+    }
+
+    @Test
+    fun carousel_onFocus_stopsScroll() {
+
+        rule.setContent {
+            Content()
+        }
+
+        rule.onNodeWithText("Text 1").assertIsDisplayed()
+        rule.onNodeWithText("Text 1").onParent().assertIsNotFocused()
+
+        rule.onNodeWithText("Text 1")
+            .onParent()
+            .performSemanticsAction(SemanticsActions.RequestFocus)
+
+        rule.mainClock.advanceTimeBy(delayBetweenSlides)
+        rule.mainClock.advanceTimeBy(animationTime)
+
+        rule.onNodeWithText("Text 2").assertDoesNotExist()
+        rule.onNodeWithText("Text 1").onParent().assertIsFocused()
+    }
+
+    @Test
+    fun carousel_onUserTriggeredPause_stopsScroll() {
+        var carouselState: CarouselState?
+        rule.setContent {
+            carouselState = remember { CarouselState() }
+            Content(
+                carouselState = carouselState!!,
+                content = {
+                    BasicText(text = "Text ${it + 1}")
+                    LaunchedEffect(carouselState) { carouselState?.pauseAutoScroll(it) }
+                })
+        }
+
+        rule.onNodeWithText("Text 1").assertIsDisplayed()
+        rule.onNodeWithText("Text 1").onParent().assertIsNotFocused()
+
+        rule.mainClock.advanceTimeBy(delayBetweenSlides)
+        rule.mainClock.advanceTimeBy(animationTime)
+
+        rule.onNodeWithText("Text 2").assertDoesNotExist()
+        rule.onNodeWithText("Text 1").assertIsDisplayed()
+    }
+
+    @Test
+    fun carousel_onUserTriggeredPauseAndResume_resumeScroll() {
+        var carouselState: CarouselState?
+        var pauseHandle: ScrollPauseHandle? = null
+        rule.setContent {
+            carouselState = remember { CarouselState() }
+            Content(
+                carouselState = carouselState!!,
+                content = {
+                    BasicText(text = "Text ${it + 1}")
+                    LaunchedEffect(carouselState) {
+                        pauseHandle = carouselState?.pauseAutoScroll(it)
+                    }
+                })
+        }
+
+        rule.mainClock.autoAdvance = false
+
+        rule.onNodeWithText("Text 1").assertIsDisplayed()
+        rule.onNodeWithText("Text 1").onParent().assertIsNotFocused()
+
+        rule.mainClock.advanceTimeBy(delayBetweenSlides)
+        rule.mainClock.advanceTimeBy(animationTime)
+
+        // pause handle has not been resumed, so Text 1 should still be on the screen.
+        rule.onNodeWithText("Text 2").assertDoesNotExist()
+        rule.onNodeWithText("Text 1").assertIsDisplayed()
+
+        rule.runOnIdle { pauseHandle?.resumeAutoScroll() }
+        rule.mainClock.advanceTimeBy(delayBetweenSlides)
+        rule.mainClock.advanceTimeBy(animationTime)
+
+        // pause handle has been resumed, so Text 2 should be on the screen after
+        // delayBetweenSlides + animationTime
+        rule.onNodeWithText("Text 1").assertDoesNotExist()
+        rule.onNodeWithText("Text 2").assertIsDisplayed()
+    }
+
+    @Test
+    fun carousel_onMultipleUserTriggeredPauseAndResume_resumesScroll() {
+        var carouselState: CarouselState?
+        var pauseHandle1: ScrollPauseHandle? = null
+        var pauseHandle2: ScrollPauseHandle? = null
+        rule.setContent {
+            carouselState = remember { CarouselState() }
+            Content(
+                carouselState = carouselState!!,
+                content = {
+                    BasicText(text = "Text ${it + 1}")
+                    LaunchedEffect(carouselState) {
+                        if (pauseHandle1 == null) {
+                            pauseHandle1 = carouselState?.pauseAutoScroll(it)
+                        }
+                        if (pauseHandle2 == null) {
+                            pauseHandle2 = carouselState?.pauseAutoScroll(it)
+                        }
+                    }
+                })
+        }
+
+        rule.mainClock.autoAdvance = false
+        rule.onNodeWithText("Text 1").assertIsDisplayed()
+        rule.onNodeWithText("Text 1").onParent().assertIsNotFocused()
+
+        rule.mainClock.advanceTimeBy(delayBetweenSlides)
+        rule.mainClock.advanceTimeBy(animationTime)
+
+        // pause handles have not been resumed, so Text 1 should still be on the screen.
+        rule.onNodeWithText("Text 2").assertDoesNotExist()
+        rule.onNodeWithText("Text 1").assertIsDisplayed()
+
+        rule.runOnIdle { pauseHandle1?.resumeAutoScroll() }
+        rule.mainClock.advanceTimeBy(delayBetweenSlides)
+        rule.mainClock.advanceTimeBy(animationTime)
+
+        // Second pause handle has not been resumed, so Text 1 should still be on the screen.
+        rule.onNodeWithText("Text 2").assertDoesNotExist()
+        rule.onNodeWithText("Text 1").assertIsDisplayed()
+
+        rule.runOnIdle { pauseHandle2?.resumeAutoScroll() }
+        rule.mainClock.advanceTimeBy(delayBetweenSlides)
+        rule.mainClock.advanceTimeBy(animationTime)
+        // All pause handles have been resumed, so Text 2 should be on the screen after
+        // delayBetweenSlides + animationTime
+        rule.onNodeWithText("Text 1").assertDoesNotExist()
+        rule.onNodeWithText("Text 2").assertIsDisplayed()
+    }
+
+    @Test
+    fun carousel_onRepeatedResumesOnSamePauseHandle_ignoresSubsequentResumeCalls() {
+        var carouselState: CarouselState?
+        var pauseHandle1: ScrollPauseHandle? = null
+        var pauseHandle2: ScrollPauseHandle? = null
+        rule.setContent {
+            carouselState = remember { CarouselState() }
+            Content(
+                carouselState = carouselState!!,
+                content = {
+                    BasicText(text = "Text ${it + 1}")
+                    LaunchedEffect(carouselState) {
+                        if (pauseHandle1 == null) {
+                            pauseHandle1 = carouselState?.pauseAutoScroll(it)
+                        }
+                        if (pauseHandle2 == null) {
+                            pauseHandle2 = carouselState?.pauseAutoScroll(it)
+                        }
+                    }
+                })
+        }
+
+        rule.mainClock.autoAdvance = false
+        rule.onNodeWithText("Text 1").assertIsDisplayed()
+        rule.onNodeWithText("Text 1").onParent().assertIsNotFocused()
+
+        rule.mainClock.advanceTimeBy(delayBetweenSlides)
+        rule.mainClock.advanceTimeBy(animationTime)
+
+        // pause handles have not been resumed, so Text 1 should still be on the screen.
+        rule.onNodeWithText("Text 2").assertDoesNotExist()
+        rule.onNodeWithText("Text 1").assertIsDisplayed()
+
+        rule.runOnIdle { pauseHandle1?.resumeAutoScroll() }
+        // subsequent call to resume should be ignored
+        rule.runOnIdle { pauseHandle1?.resumeAutoScroll() }
+        rule.mainClock.advanceTimeBy(delayBetweenSlides)
+        rule.mainClock.advanceTimeBy(animationTime)
+
+        // Second pause handle has not been resumed, so Text 1 should still be on the screen.
+        rule.onNodeWithText("Text 2").assertDoesNotExist()
+        rule.onNodeWithText("Text 1").assertIsDisplayed()
+    }
+
+    @Test
+    fun carousel_outOfFocus_resumesScroll() {
+        rule.setContent {
+            Content()
+        }
+
+        rule.onNodeWithText("Text 1")
+            .onParent()
+            .performSemanticsAction(SemanticsActions.RequestFocus)
+
+        rule.onNodeWithText("Card").performSemanticsAction(SemanticsActions.RequestFocus)
+        rule.onNodeWithText("Card").assertIsFocused()
+
+        rule.mainClock.advanceTimeBy(delayBetweenSlides)
+        rule.mainClock.advanceTimeBy(animationTime)
+        rule.onNodeWithText("Text 1").assertDoesNotExist()
+        rule.onNodeWithText("Text 2").assertIsDisplayed()
+    }
+
+    @Test
+    fun carousel_pagerIndicatorDisplayed() {
+        rule.setContent {
+            Content()
+        }
+
+        rule.onNodeWithTag("indicator").assertIsDisplayed()
+    }
+
+    @Test
+    fun carousel_withAnimatedContent_successfulTransition() {
+        rule.setContent {
+            AnimatedContent()
+        }
+
+        rule.onNodeWithText("Text 1").assertDoesNotExist()
+
+        rule.mainClock.advanceTimeBy(overlayRenderWaitTime + animationTime, true)
+        rule.mainClock.advanceTimeByFrame()
+
+        rule.onNodeWithText("Text 1").assertIsDisplayed()
+        rule.onNodeWithText("PLAY").assertIsDisplayed()
+    }
+
+    @Test
+    fun carousel_withAnimatedContent_successfulFocusIn() {
+        rule.setContent {
+            AnimatedContent()
+        }
+
+        rule.mainClock.autoAdvance = false
+        rule.onNodeWithTag("pager")
+            .performSemanticsAction(SemanticsActions.RequestFocus)
+
+        // current slide overlay render delay
+        rule.mainClock.advanceTimeBy(animationTime + overlayRenderWaitTime, false)
+        rule.mainClock.advanceTimeBy(animationTime, false)
+        rule.mainClock.advanceTimeByFrame()
+
+        rule.onNodeWithText("PLAY").assertIsDisplayed()
+        rule.onNodeWithText("PLAY").assertIsFocused()
+    }
+
+    @Composable
+    fun Content(
+        carouselState: CarouselState = remember { CarouselState() },
+        content: @Composable (index: Int) -> Unit = { BasicText(text = "Text ${it + 1}")
+        }
+    ) {
+        val slideCount = 3
+        LazyColumn {
+            item {
+                Carousel(
+                    modifier = Modifier.fillMaxSize(),
+                    carouselState = carouselState,
+                    slideCount = slideCount,
+                    timeToDisplaySlideMillis = delayBetweenSlides,
+                    carouselIndicator = {
+                        CarouselDefaults.Indicator(modifier = Modifier
+                            .align(Alignment.BottomEnd)
+                            .padding(16.dp)
+                            .testTag("indicator"),
+                            carouselState = carouselState,
+                            slideCount = slideCount)
+                    },
+                    content = content
+                )
+            }
+            item {
+                Box(modifier = Modifier.focusable()
+                ) {
+                    BasicText(
+                        text = "Card",
+                        modifier = Modifier
+                            .fillMaxWidth()
+                            .height(100.dp)
+                            .padding(12.dp)
+                            .focusable()
+                    )
+                }
+            }
+        }
+    }
+
+    @Composable
+    fun AnimatedContent(carouselState: CarouselState = remember { CarouselState() }) {
+        LazyColumn {
+            item {
+                Carousel(
+                    modifier = Modifier
+                        .fillMaxSize()
+                        .testTag("pager"),
+                    slideCount = 3,
+                    timeToDisplaySlideMillis = delayBetweenSlides,
+                    carouselState = carouselState
+                ) { Frame(text = "Text ${it + 1}") }
+            }
+            item {
+                Box(modifier = Modifier.focusable()
+                ) {
+                    BasicText(
+                        text = "Card",
+                        modifier = Modifier
+                            .fillMaxWidth()
+                            .height(100.dp)
+                            .padding(12.dp)
+                            .focusable()
+                    )
+                }
+            }
+        }
+    }
+
+    @Composable
+    fun Frame(text: String) {
+        val focusRequester = FocusRequester()
+        CarouselItem(
+            overlayEnterTransitionStartDelayMillis = overlayRenderWaitTime,
+            background = {}) {
+            Column(modifier = Modifier
+                .onFocusChanged {
+                    if (it.isFocused) {
+                        focusRequester.requestFocus()
+                    }
+                }
+                .focusable()) {
+                BasicText(text = text)
+                Row(modifier = Modifier
+                    .horizontalScroll(rememberScrollState())
+                    .onFocusChanged {
+                        if (it.isFocused) {
+                            focusRequester.requestFocus()
+                        }
+                    }
+                    .focusable()) {
+                    TestButton(text = "PLAY", focusRequester)
+                }
+            }
+        }
+    }
+
+    @Composable
+    fun TestButton(text: String, focusRequester: FocusRequester? = null) {
+        var cardScale
+            by remember { mutableStateOf(0.5f) }
+        val borderGlowColorTransition =
+            rememberInfiniteTransition()
+        var initialValue
+            by remember { mutableStateOf(Color.Transparent) }
+        val glowingColor
+            by borderGlowColorTransition.animateColor(
+                initialValue = initialValue,
+                targetValue = Color.Transparent,
+                animationSpec = infiniteRepeatable(
+                    animation = tween(1000,
+                        easing = LinearEasing),
+                    repeatMode = RepeatMode.Reverse
+                )
+            )
+
+        val baseModifier =
+            if (focusRequester == null) Modifier else Modifier.focusRequester(focusRequester)
+
+        Box(
+            modifier = baseModifier
+                .scale(cardScale)
+                .border(
+                    2.dp, glowingColor,
+                    RoundedCornerShape(12.dp)
+                )
+                .onFocusChanged { focusState ->
+                    if (focusState.isFocused) {
+                        cardScale = 1.0f
+                        initialValue = Color.White
+                    } else {
+                        cardScale = 0.5f
+                        initialValue = Color.Transparent
+                    }
+                }
+                .clickable(onClick = {})) {
+            BasicText(text = text)
+        }
+    }
+
+    @Test
+    fun carousel_zeroSlideCount_drawsSomething() {
+        val testTag = "emptyCarousel"
+        rule.setContent {
+            Carousel(slideCount = 0, modifier = Modifier.testTag(testTag)) {}
+        }
+
+        rule.onNodeWithTag(testTag).assertExists()
+    }
+}
diff --git a/tv/tv-material/src/androidTest/java/androidx/tv/material/pager/PagerTest.kt b/tv/tv-material/src/androidTest/java/androidx/tv/material/pager/PagerTest.kt
new file mode 100644
index 0000000..23df054
--- /dev/null
+++ b/tv/tv-material/src/androidTest/java/androidx/tv/material/pager/PagerTest.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.tv.material.pager
+
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.tv.material.ExperimentalTvMaterialApi
+import org.junit.Rule
+import org.junit.Test
+
+class PagerTest {
+    @get:Rule
+    val rule = createComposeRule()
+
+    @OptIn(ExperimentalTvMaterialApi::class)
+    @Test
+    fun pager_zeroSlideCount_drawsSomething() {
+        val testTag = "pager"
+        rule.setContent {
+            Pager(slideCount = 0, modifier = Modifier.testTag(testTag)) {}
+        }
+
+        rule.onNodeWithTag(testTag).assertExists()
+    }
+}
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt b/tv/tv-material/src/main/java/androidx/tv/material/ExperimentalTvMaterialApi.kt
similarity index 76%
copy from privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt
copy to tv/tv-material/src/main/java/androidx/tv/material/ExperimentalTvMaterialApi.kt
index c4940c5b..b0e19e2 100644
--- a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt
+++ b/tv/tv-material/src/main/java/androidx/tv/material/ExperimentalTvMaterialApi.kt
@@ -14,4 +14,9 @@
  * limitations under the License.
  */
 
-package androidx.privacysandbox.tools.apigenerator
\ No newline at end of file
+package androidx.tv.material
+
+@RequiresOptIn(
+    "This tv-material API is experimental and likely to change or be removed in the future."
+)
+annotation class ExperimentalTvMaterialApi
\ No newline at end of file
diff --git a/tv/tv-material/src/main/java/androidx/tv/material/carousel/Carousel.kt b/tv/tv-material/src/main/java/androidx/tv/material/carousel/Carousel.kt
new file mode 100644
index 0000000..ebd71f6
--- /dev/null
+++ b/tv/tv-material/src/main/java/androidx/tv/material/carousel/Carousel.kt
@@ -0,0 +1,291 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.tv.material.carousel
+
+import androidx.compose.animation.EnterTransition
+import androidx.compose.animation.ExitTransition
+import androidx.compose.animation.core.tween
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
+import androidx.compose.foundation.background
+import androidx.compose.foundation.focusable
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.BoxScope
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberUpdatedState
+import androidx.compose.runtime.setValue
+import androidx.compose.runtime.snapshotFlow
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusDirection
+import androidx.compose.ui.focus.FocusState
+import androidx.compose.ui.focus.onFocusChanged
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalFocusManager
+import androidx.compose.ui.unit.dp
+import androidx.tv.material.ExperimentalTvMaterialApi
+import androidx.tv.material.pager.Pager
+import java.lang.Math.floorMod
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.yield
+
+/**
+ * Composes a hero card rotator to highlight a piece of content.
+ *
+ * @param slideCount total number of slides present in the carousel.
+ * @param carouselState state associated with this carousel.
+ * @param timeToDisplaySlideMillis duration for which slide should be visible before moving to
+ * the next slide.
+ * @param enterTransition transition used to bring a slide into view.
+ * @param exitTransition transition used to remove a slide from view.
+ * @param carouselIndicator indicator showing the position of the current slide among all slides.
+ * @param content defines the slides for a given index.
+ */
+
+@Suppress("IllegalExperimentalApiUsage")
+@OptIn(ExperimentalComposeUiApi::class)
+@ExperimentalTvMaterialApi
+@Composable
+fun Carousel(
+    slideCount: Int,
+    modifier: Modifier = Modifier,
+    carouselState: CarouselState = remember { CarouselState() },
+    timeToDisplaySlideMillis: Long = CarouselDefaults.TimeToDisplaySlideMillis,
+    enterTransition: EnterTransition = CarouselDefaults.EnterTransition,
+    exitTransition: ExitTransition = CarouselDefaults.ExitTransition,
+    carouselIndicator:
+    @Composable BoxScope.() -> Unit = {
+        CarouselDefaults.Indicator(
+            modifier = Modifier.align(Alignment.BottomEnd).padding(16.dp),
+            carouselState = carouselState,
+            slideCount = slideCount)
+    },
+    content: @Composable (index: Int) -> Unit
+) {
+    CarouselStateUpdater(carouselState, slideCount)
+    var focusState: FocusState? by remember { mutableStateOf(null) }
+    val focusManager = LocalFocusManager.current
+
+    AutoScrollSideEffect(
+        timeToDisplaySlideMillis,
+        slideCount,
+        carouselState,
+        focusState)
+    Box(modifier = modifier
+        .onFocusChanged {
+            focusState = it
+            if (it.isFocused) {
+                focusManager.moveFocus(FocusDirection.Enter)
+            }
+        }
+        .focusable()) {
+        Pager(
+            enterTransition = enterTransition,
+            exitTransition = exitTransition,
+            currentSlide = carouselState.slideIndex,
+            slideCount = slideCount
+        ) { content.invoke(it) }
+
+        this.carouselIndicator()
+    }
+}
+
+@OptIn(ExperimentalTvMaterialApi::class)
+@Composable
+private fun AutoScrollSideEffect(
+    timeToDisplaySlideMillis: Long,
+    slideCount: Int,
+    carouselState: CarouselState,
+    focusState: FocusState?
+) {
+    val currentTimeToDisplaySlideMillis by rememberUpdatedState(timeToDisplaySlideMillis)
+    val currentSlideCount by rememberUpdatedState(slideCount)
+    val carouselIsFocused = focusState?.isFocused ?: false
+    val carouselHasFocus = focusState?.hasFocus ?: false
+
+    if (!(carouselIsFocused || carouselHasFocus)) {
+        LaunchedEffect(carouselState) {
+            while (true) {
+                yield()
+                delay(currentTimeToDisplaySlideMillis)
+                if (carouselState.activePauseHandlesCount > 0) {
+                    snapshotFlow { carouselState.activePauseHandlesCount }
+                        .first { pauseHandleCount -> pauseHandleCount == 0 }
+                }
+                carouselState.nextSlide(currentSlideCount)
+            }
+        }
+    }
+}
+
+@OptIn(ExperimentalTvMaterialApi::class)
+@Composable
+private fun CarouselStateUpdater(carouselState: CarouselState, slideCount: Int) {
+    LaunchedEffect(carouselState, slideCount) {
+        if (slideCount != 0) {
+            carouselState.slideIndex = floorMod(carouselState.slideIndex, slideCount)
+        }
+    }
+}
+
+/**
+ * State of the Carousel which allows the user to specify the first slide that is shown when the
+ * Carousel is instantiated in the constructor.
+ *
+ * It also provides the user with support to pause and resume the auto-scroll behaviour of the
+ * Carousel.
+ * @param initialSlideIndex the index of the first slide that is displayed.
+ */
+@Stable
+@ExperimentalTvMaterialApi
+class CarouselState(initialSlideIndex: Int = 0) {
+    internal var activePauseHandlesCount by mutableStateOf(0)
+
+    /**
+     * The index of the slide that is currently displayed by the carousel
+     */
+    var slideIndex by mutableStateOf(initialSlideIndex)
+        internal set
+
+    /**
+     * Pauses the auto-scrolling behaviour of Carousel.
+     * The pause request is ignored if [slideIndex] is not the current slide that is visible.
+     * Returns a [ScrollPauseHandle] that can be used to resume
+     */
+    fun pauseAutoScroll(slideIndex: Int): ScrollPauseHandle {
+        if (this.slideIndex != slideIndex) {
+            return NoOpScrollPauseHandle
+        }
+        return ScrollPauseHandleImpl(this)
+    }
+
+    internal fun nextSlide(slideCount: Int) {
+        if (slideCount != 0) {
+            slideIndex = floorMod(slideIndex + 1, slideCount)
+        }
+    }
+}
+
+@ExperimentalTvMaterialApi
+/**
+ * Handle returned by [CarouselState.pauseAutoScroll] that can be used to resume auto-scroll.
+ */
+sealed interface ScrollPauseHandle {
+    /**
+     * Resumes the auto-scroll behaviour if there are no other active [ScrollPauseHandle]s.
+     */
+    fun resumeAutoScroll()
+}
+
+@OptIn(ExperimentalTvMaterialApi::class)
+internal object NoOpScrollPauseHandle : ScrollPauseHandle {
+    /**
+     * Resumes the auto-scroll behaviour if there are no other active [ScrollPauseHandle]s.
+     */
+    override fun resumeAutoScroll() {}
+}
+
+@OptIn(ExperimentalTvMaterialApi::class)
+internal class ScrollPauseHandleImpl(private val carouselState: CarouselState) : ScrollPauseHandle {
+    private var active by mutableStateOf(true)
+    init {
+        carouselState.activePauseHandlesCount += 1
+    }
+    /**
+     * Resumes the auto-scroll behaviour if there are no other active [ScrollPauseHandle]s.
+     */
+    override fun resumeAutoScroll() {
+        if (active) {
+            active = false
+            carouselState.activePauseHandlesCount -= 1
+        }
+    }
+}
+
+@ExperimentalTvMaterialApi
+object CarouselDefaults {
+    /**
+     * Default time for which the slide is visible to the user.
+     */
+    val TimeToDisplaySlideMillis: Long = 5000
+
+    /**
+     * Default transition used to bring the slide into view
+     */
+    val EnterTransition: EnterTransition = fadeIn(animationSpec = tween(900))
+
+    /**
+     * Default transition used to remove the slide from view
+     */
+    val ExitTransition: ExitTransition = fadeOut(animationSpec = tween(900))
+
+    /**
+     * An indicator showing the position of the current slide among the slides of the carousel.
+     *
+     * @param carouselState is the state associated with the carousel of which this indicator is a
+     * part.
+     * @param slideCount total number of slides in the carousel
+     */
+    @ExperimentalTvMaterialApi
+    @Composable
+    fun Indicator(
+        carouselState: CarouselState,
+        slideCount: Int,
+        modifier: Modifier = Modifier
+    ) {
+        if (slideCount <= 0) {
+            Box(modifier = modifier)
+        } else {
+            val defaultSize = 8.dp
+            val inactiveColor = Color.LightGray
+            val activeColor = Color.White
+            val shape = CircleShape
+            val indicatorModifier = Modifier.size(defaultSize)
+
+            Box(modifier = modifier) {
+                Row(
+                    horizontalArrangement = Arrangement.spacedBy(defaultSize),
+                    verticalAlignment = Alignment.CenterVertically,
+                ) {
+                    repeat(slideCount) {
+                        Box(indicatorModifier.background(
+                            color =
+                              if (it == carouselState.slideIndex) {
+                                  activeColor
+                              } else {
+                                  inactiveColor
+                              },
+                            shape = shape
+                        ))
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/tv/tv-material/src/main/java/androidx/tv/material/carousel/CarouselItem.kt b/tv/tv-material/src/main/java/androidx/tv/material/carousel/CarouselItem.kt
new file mode 100644
index 0000000..0a58e20
--- /dev/null
+++ b/tv/tv-material/src/main/java/androidx/tv/material/carousel/CarouselItem.kt
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.tv.material.carousel
+
+import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.EnterTransition
+import androidx.compose.animation.ExitTransition
+import androidx.compose.animation.core.MutableTransitionState
+import androidx.compose.animation.slideInHorizontally
+import androidx.compose.animation.slideOutHorizontally
+import androidx.compose.foundation.focusable
+import androidx.compose.foundation.layout.Box
+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.snapshotFlow
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusDirection
+import androidx.compose.ui.focus.FocusState
+import androidx.compose.ui.focus.onFocusChanged
+import androidx.compose.ui.platform.LocalFocusManager
+import androidx.tv.material.ExperimentalTvMaterialApi
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.first
+
+/**
+ * This composable is intended for use in Carousel.
+ * A composable that has
+ * - a [background] layer that is rendered as soon as the composable is visible.
+ * - an [overlay] layer that is rendered after a delay of
+ *   [overlayEnterTransitionStartDelayMillis].
+ *
+ * @param overlayEnterTransitionStartDelayMillis time between the rendering of the
+ * background and the overlay.
+ * @param overlayEnterTransition animation used to bring the overlay into view.
+ * @param overlayExitTransition animation used to remove the overlay from view.
+ * @param background composable defining the background of the slide.
+ * @param overlay composable defining the content overlaid on the background.
+ */
+@Suppress("IllegalExperimentalApiUsage")
+@OptIn(ExperimentalComposeUiApi::class)
+@ExperimentalTvMaterialApi
+@Composable
+fun CarouselItem(
+    background: @Composable () -> Unit,
+    modifier: Modifier = Modifier,
+    overlayEnterTransitionStartDelayMillis: Long =
+        CarouselItemDefaults.OverlayEnterTransitionStartDelayMillis,
+    overlayEnterTransition: EnterTransition = CarouselItemDefaults.OverlayEnterTransition,
+    overlayExitTransition: ExitTransition = CarouselItemDefaults.OverlayExitTransition,
+    overlay: @Composable () -> Unit
+) {
+    val overlayVisible = remember { MutableTransitionState(initialState = false) }
+    var focusState: FocusState? by remember { mutableStateOf(null) }
+    val focusManager = LocalFocusManager.current
+
+    LaunchedEffect(overlayVisible) {
+        snapshotFlow { overlayVisible.isIdle && overlayVisible.currentState }.first { it }
+        // slide has loaded completely.
+        if (focusState?.isFocused == true) {
+	    focusManager.moveFocus(FocusDirection.Enter)
+        }
+    }
+
+    Box(modifier = modifier
+            .onFocusChanged {
+                focusState = it
+                if (it.isFocused && overlayVisible.isIdle && overlayVisible.currentState) {
+                    focusManager.moveFocus(FocusDirection.Enter)
+                }
+             }.focusable()) {
+        background()
+
+        LaunchedEffect(overlayVisible) {
+            // After the delay, set overlay-visibility to true and trigger the animation to show the
+            // overlay.
+            delay(overlayEnterTransitionStartDelayMillis)
+            overlayVisible.targetState = true
+        }
+
+        AnimatedVisibility(
+            modifier = Modifier
+                .align(Alignment.BottomStart)
+                .onFocusChanged {
+                    if (it.isFocused) { focusManager.moveFocus(FocusDirection.Enter) }
+                }
+                .focusable(),
+            visibleState = overlayVisible,
+            enter = overlayEnterTransition,
+            exit = overlayExitTransition
+        ) {
+            overlay.invoke()
+        }
+    }
+}
+
+@ExperimentalTvMaterialApi
+object CarouselItemDefaults {
+    /**
+     * Default delay between the background being rendered and the overlay being rendered.
+     */
+    val OverlayEnterTransitionStartDelayMillis: Long = 1500
+
+    /**
+     * Default transition to bring the overlay into view.
+     */
+    val OverlayEnterTransition: EnterTransition = slideInHorizontally(initialOffsetX = { it * 4 })
+
+    /**
+     * Default transition to remove overlay from view.
+     */
+    val OverlayExitTransition: ExitTransition = slideOutHorizontally()
+}
diff --git a/tv/tv-material/src/main/java/androidx/tv/material/pager/Pager.kt b/tv/tv-material/src/main/java/androidx/tv/material/pager/Pager.kt
new file mode 100644
index 0000000..24f88ed
--- /dev/null
+++ b/tv/tv-material/src/main/java/androidx/tv/material/pager/Pager.kt
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.tv.material.pager
+
+import androidx.compose.animation.AnimatedContent
+import androidx.compose.animation.EnterTransition
+import androidx.compose.animation.ExitTransition
+import androidx.compose.animation.ExperimentalAnimationApi
+import androidx.compose.animation.core.tween
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
+import androidx.compose.animation.with
+import androidx.compose.foundation.layout.Box
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.tv.material.ExperimentalTvMaterialApi
+
+/**
+ * Composable that accepts a lambda that generates the slides based on the index provided and
+ * displays the slide associated with the index [currentSlide].
+ *
+ * @param modifier the modifier to apply to this component.
+ * @param enterTransition defines how the slide is animated into view.
+ * @param exitTransition defines how the slide is animated out of view.
+ * @param currentSlide the slide that is currently displayed by the pager.
+ * @param slideCount the total number of slides.
+ * @param content defines the slide composable for a given index.
+ */
+@Suppress("IllegalExperimentalApiUsage")
+@OptIn(ExperimentalAnimationApi::class)
+@ExperimentalTvMaterialApi
+@Composable
+internal fun Pager(
+    slideCount: Int,
+    modifier: Modifier = Modifier,
+    enterTransition: EnterTransition = PagerDefaults.EnterTransition,
+    exitTransition: ExitTransition = PagerDefaults.ExitTransition,
+    currentSlide: Int = 0,
+    content: @Composable (index: Int) -> Unit
+) {
+    if (slideCount <= 0) {
+        Box(modifier)
+    } else {
+        AnimatedContent(
+            modifier = modifier,
+            targetState = currentSlide.coerceIn(0, slideCount - 1),
+            transitionSpec = { enterTransition.with(exitTransition) }
+        ) {
+            content(it)
+        }
+    }
+}
+
+@ExperimentalTvMaterialApi
+private object PagerDefaults {
+    /**
+     * Default transition used to bring a slide into view
+     */
+    val EnterTransition: EnterTransition = fadeIn(animationSpec = tween(900))
+
+    /**
+     * Default transition used to remove a slide from view
+     */
+    val ExitTransition: ExitTransition = fadeOut(animationSpec = tween(900))
+}
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Scaffold.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Scaffold.kt
index 2e65aeb..e9a468b 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Scaffold.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Scaffold.kt
@@ -63,9 +63,9 @@
 ) {
     Box(modifier = modifier) {
         content()
+        vignette?.invoke()
         positionIndicator?.invoke()
         pageIndicator?.invoke()
-        vignette?.invoke()
         timeText?.invoke()
     }
 }
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Slider.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Slider.kt
index f1aa82f..91d9d63 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Slider.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Slider.kt
@@ -45,6 +45,7 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
 import androidx.wear.compose.material.RangeDefaults.calculateCurrentStepValue
@@ -425,9 +426,14 @@
     content: @Composable () -> Unit
 ) {
     Box(
-        modifier = Modifier.width(InlineSliderDefaults.ControlSize)
+        modifier = Modifier
+            .width(InlineSliderDefaults.ControlSize)
             .fillMaxHeight()
-            .clickable(enabled = enabled, onClick = onClick)
+            .clickable(
+                enabled = enabled,
+                onClick = onClick,
+                role = Role.Button
+            )
             .then(modifier),
         contentAlignment = contentAlignment
     ) {
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Stepper.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Stepper.kt
index 544421d..b9f03b2 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Stepper.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Stepper.kt
@@ -40,6 +40,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.unit.dp
 import androidx.wear.compose.material.RangeDefaults.calculateCurrentStepValue
 import androidx.wear.compose.material.RangeDefaults.snapValueToStep
@@ -237,7 +238,13 @@
         modifier = Modifier
             .fillMaxWidth()
             .weight(StepperDefaults.ButtonWeight)
-            .clickable(interactionSource, null, onClick = onClick, enabled = enabled)
+            .clickable(
+                interactionSource,
+                null,
+                onClick = onClick,
+                enabled = enabled,
+                role = Role.Button
+            )
             .wrapContentWidth()
             .indication(interactionSource, rememberRipple(bounded = false))
             .padding(paddingValues),
diff --git a/wear/compose/integration-tests/macrobenchmark/build.gradle b/wear/compose/integration-tests/macrobenchmark/build.gradle
index 80b553f..c5dc76c 100644
--- a/wear/compose/integration-tests/macrobenchmark/build.gradle
+++ b/wear/compose/integration-tests/macrobenchmark/build.gradle
@@ -40,13 +40,6 @@
     androidTestImplementation(libs.testUiautomator)
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += [ '-opt-in=kotlin.RequiresOptIn' ]
-    }
-}
-
 // Define a task dependency so the app is installed before we run macro benchmarks.
 tasks.getByPath(":wear:compose:integration-tests:macrobenchmark:connectedCheck")
  .dependsOn(tasks.getByPath(":wear:compose:integration-tests:macrobenchmark-target:installRelease"))
diff --git a/wear/tiles/tiles-renderer/build.gradle b/wear/tiles/tiles-renderer/build.gradle
index 1f8a366..bd54c58 100644
--- a/wear/tiles/tiles-renderer/build.gradle
+++ b/wear/tiles/tiles-renderer/build.gradle
@@ -85,13 +85,6 @@
     namespace "androidx.wear.tiles.renderer"
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 protobuf {
     protoc {
         artifact = libs.protobufCompiler.get()
diff --git a/wear/watchface/watchface-client-guava/api/current.txt b/wear/watchface/watchface-client-guava/api/current.txt
index 61dce26..a6423d7 100644
--- a/wear/watchface/watchface-client-guava/api/current.txt
+++ b/wear/watchface/watchface-client-guava/api/current.txt
@@ -10,9 +10,9 @@
     method @Deprecated public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType> getDefaultComplicationDataSourcePoliciesAndType(android.content.ComponentName watchFaceName);
     method public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient();
     method public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId);
-    method public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
+    method @Deprecated public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
     method public suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.wear.watchface.client.WatchFaceControlClient.PreviewImageUpdateRequestedListener previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
+    method @Deprecated public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.wear.watchface.client.WatchFaceControlClient.PreviewImageUpdateRequestedListener previewImageUpdateRequestedListener);
     field public static final androidx.wear.watchface.client.ListenableWatchFaceControlClient.Companion Companion;
   }
diff --git a/wear/watchface/watchface-client-guava/api/public_plus_experimental_current.txt b/wear/watchface/watchface-client-guava/api/public_plus_experimental_current.txt
index 61dce26..a6423d7 100644
--- a/wear/watchface/watchface-client-guava/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-client-guava/api/public_plus_experimental_current.txt
@@ -10,9 +10,9 @@
     method @Deprecated public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType> getDefaultComplicationDataSourcePoliciesAndType(android.content.ComponentName watchFaceName);
     method public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient();
     method public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId);
-    method public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
+    method @Deprecated public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
     method public suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.wear.watchface.client.WatchFaceControlClient.PreviewImageUpdateRequestedListener previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
+    method @Deprecated public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.wear.watchface.client.WatchFaceControlClient.PreviewImageUpdateRequestedListener previewImageUpdateRequestedListener);
     field public static final androidx.wear.watchface.client.ListenableWatchFaceControlClient.Companion Companion;
   }
diff --git a/wear/watchface/watchface-client-guava/api/restricted_current.txt b/wear/watchface/watchface-client-guava/api/restricted_current.txt
index 61dce26..a6423d7 100644
--- a/wear/watchface/watchface-client-guava/api/restricted_current.txt
+++ b/wear/watchface/watchface-client-guava/api/restricted_current.txt
@@ -10,9 +10,9 @@
     method @Deprecated public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType> getDefaultComplicationDataSourcePoliciesAndType(android.content.ComponentName watchFaceName);
     method public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient();
     method public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId);
-    method public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
+    method @Deprecated public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
     method public suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.wear.watchface.client.WatchFaceControlClient.PreviewImageUpdateRequestedListener previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
+    method @Deprecated public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
     method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.wear.watchface.client.WatchFaceControlClient.PreviewImageUpdateRequestedListener previewImageUpdateRequestedListener);
     field public static final androidx.wear.watchface.client.ListenableWatchFaceControlClient.Companion Companion;
   }
diff --git a/wear/watchface/watchface-client-guava/build.gradle b/wear/watchface/watchface-client-guava/build.gradle
index 223221a..3f920aa 100644
--- a/wear/watchface/watchface-client-guava/build.gradle
+++ b/wear/watchface/watchface-client-guava/build.gradle
@@ -39,13 +39,6 @@
     androidTestImplementation(libs.truth)
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 androidx {
     name = "Android Wear Watchface Client Guava"
     type = LibraryType.PUBLISHED_LIBRARY
diff --git a/wear/watchface/watchface-client-guava/src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceControlClientTest.kt b/wear/watchface/watchface-client-guava/src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceControlClientTest.kt
index ef8b6366..bdd322c 100644
--- a/wear/watchface/watchface-client-guava/src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceControlClientTest.kt
+++ b/wear/watchface/watchface-client-guava/src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceControlClientTest.kt
@@ -136,6 +136,7 @@
             context.packageName
         ).get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
 
+        @Suppress("deprecation")
         val interactiveInstanceFuture =
             client.listenableGetOrCreateInteractiveWatchFaceClient(
                 "listenableTestId",
@@ -235,6 +236,7 @@
             context.packageName
         ).get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
 
+        @Suppress("deprecation")
         val interactiveInstanceFuture =
             client.listenableGetOrCreateInteractiveWatchFaceClient(
                 "listenableTestId",
@@ -313,6 +315,7 @@
             context.packageName
         ).get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
 
+        @Suppress("deprecation")
         client.listenableGetOrCreateInteractiveWatchFaceClient(
             "listenableTestId",
             DeviceConfig(
@@ -327,6 +330,7 @@
         ).cancel(true)
 
         // Canceling should not prevent a subsequent listenableGetOrCreateInteractiveWatchFaceClient
+        @Suppress("deprecation")
         val interactiveInstanceFuture =
             client.listenableGetOrCreateInteractiveWatchFaceClient(
                 "listenableTestId",
@@ -395,7 +399,7 @@
         )
 
         val interactiveInstance = interactiveInstanceFuture.get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
-        Assert.assertTrue(service.rendererCreatedLatch.await(500, TimeUnit.MILLISECONDS))
+        Assert.assertTrue(service.rendererInitializedLatch.await(500, TimeUnit.MILLISECONDS))
 
         assertThat(lastPreviewImageUpdateRequestedId).isEmpty()
         service.triggerPreviewImageUpdateRequest()
@@ -409,7 +413,7 @@
     testContext: Context,
     private var surfaceHolderOverride: SurfaceHolder,
 ) : WatchFaceService() {
-    val rendererCreatedLatch = CountDownLatch(1)
+    val rendererInitializedLatch = CountDownLatch(1)
 
     init {
         attachBaseContext(testContext)
@@ -438,6 +442,10 @@
             CanvasType.HARDWARE,
             16
         ) {
+            override suspend fun init() {
+                rendererInitializedLatch.countDown()
+            }
+
             override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
 
             override fun renderHighlightLayer(
@@ -446,7 +454,6 @@
                 zonedDateTime: ZonedDateTime
             ) {}
         }
-        rendererCreatedLatch.countDown()
         return WatchFace(WatchFaceType.DIGITAL, renderer)
     }
 }
\ No newline at end of file
diff --git a/wear/watchface/watchface-client-guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceControlClient.kt b/wear/watchface/watchface-client-guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceControlClient.kt
index d77e676..38d07eb 100644
--- a/wear/watchface/watchface-client-guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceControlClient.kt
+++ b/wear/watchface/watchface-client-guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceControlClient.kt
@@ -166,6 +166,14 @@
      * @return a [ListenableFuture] for the [InteractiveWatchFaceClient].
      */
     @Suppress("AsyncSuffixFuture")
+    @Deprecated(
+        "Use an overload that specifies PreviewImageUpdateRequestedListener",
+        ReplaceWith(
+            "listenableGetOrCreateInteractiveWatchFaceClient(" +
+                "String, DeviceConfig, WatchUiState, UserStyleData?, Map<Int, ComplicationData>?," +
+                " Executor, PreviewImageUpdateRequestedListener)"
+        )
+    )
     public open fun listenableGetOrCreateInteractiveWatchFaceClient(
         id: String,
         deviceConfig: DeviceConfig,
@@ -176,6 +184,7 @@
         launchFutureCoroutine(
             "ListenableWatchFaceControlClient.listenableGetOrCreateInteractiveWatchFaceClient",
         ) {
+            @Suppress("Deprecation")
             watchFaceControlClient.getOrCreateInteractiveWatchFaceClient(
                 id,
                 deviceConfig,
@@ -229,6 +238,14 @@
             )
         }
 
+    @Deprecated(
+        "Use an overload that specifies PreviewImageUpdateRequestedListener",
+        replaceWith = ReplaceWith(
+            "getOrCreateInteractiveWatchFaceClient(String, DeviceConfig, WatchUiState," +
+                " UserStyleData?, Map<Int, ComplicationData>?, Executor, " +
+                "PreviewImageUpdateRequestedListener)")
+    )
+    @Suppress("deprecation")
     override suspend fun getOrCreateInteractiveWatchFaceClient(
         id: String,
         deviceConfig: DeviceConfig,
diff --git a/wear/watchface/watchface-client/api/current.txt b/wear/watchface/watchface-client/api/current.txt
index ebdc426..d45b0ec2 100644
--- a/wear/watchface/watchface-client/api/current.txt
+++ b/wear/watchface/watchface-client/api/current.txt
@@ -193,7 +193,7 @@
     method @Deprecated @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType> getDefaultComplicationDataSourcePoliciesAndType(android.content.ComponentName watchFaceName) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient() throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId) throws android.os.RemoteException;
-    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
+    method @Deprecated @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.wear.watchface.client.WatchFaceControlClient.PreviewImageUpdateRequestedListener previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
     method public default boolean hasComplicationDataCache();
     field public static final androidx.wear.watchface.client.WatchFaceControlClient.Companion Companion;
diff --git a/wear/watchface/watchface-client/api/public_plus_experimental_current.txt b/wear/watchface/watchface-client/api/public_plus_experimental_current.txt
index 7fc32be..422874d 100644
--- a/wear/watchface/watchface-client/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-client/api/public_plus_experimental_current.txt
@@ -200,7 +200,7 @@
     method @Deprecated @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType> getDefaultComplicationDataSourcePoliciesAndType(android.content.ComponentName watchFaceName) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient() throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId) throws android.os.RemoteException;
-    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
+    method @Deprecated @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.wear.watchface.client.WatchFaceControlClient.PreviewImageUpdateRequestedListener previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
     method public default boolean hasComplicationDataCache();
     field public static final androidx.wear.watchface.client.WatchFaceControlClient.Companion Companion;
diff --git a/wear/watchface/watchface-client/api/restricted_current.txt b/wear/watchface/watchface-client/api/restricted_current.txt
index ebdc426..d45b0ec2 100644
--- a/wear/watchface/watchface-client/api/restricted_current.txt
+++ b/wear/watchface/watchface-client/api/restricted_current.txt
@@ -193,7 +193,7 @@
     method @Deprecated @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType> getDefaultComplicationDataSourcePoliciesAndType(android.content.ComponentName watchFaceName) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient() throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId) throws android.os.RemoteException;
-    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
+    method @Deprecated @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.wear.watchface.client.WatchFaceControlClient.PreviewImageUpdateRequestedListener previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
     method public default boolean hasComplicationDataCache();
     field public static final androidx.wear.watchface.client.WatchFaceControlClient.Companion Companion;
diff --git a/wear/watchface/watchface-client/build.gradle b/wear/watchface/watchface-client/build.gradle
index 91ba78a..a5c8e08 100644
--- a/wear/watchface/watchface-client/build.gradle
+++ b/wear/watchface/watchface-client/build.gradle
@@ -52,13 +52,6 @@
     implementation("androidx.core:core:1.1.0")
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 android {
     defaultConfig {
         minSdkVersion 26
@@ -77,11 +70,4 @@
     mavenGroup = LibraryGroups.WEAR_WATCHFACE
     inceptionYear = "2020"
     description = "Client library for controlling androidx watchfaces"
-}
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
 }
\ No newline at end of file
diff --git a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
index cfcee51..5c10c64 100644
--- a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
+++ b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
@@ -503,6 +503,7 @@
             surfaceHolder
         )
         val deferredInteractiveInstance = handlerCoroutineScope.async {
+            @Suppress("deprecation")
             service.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 deviceConfig,
@@ -859,6 +860,7 @@
         assumeTrue("Requires Android R", Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
 
         val deferredInteractiveInstance = handlerCoroutineScope.async {
+            @Suppress("deprecation")
             service.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 deviceConfig,
@@ -1871,6 +1873,7 @@
     @Test
     fun watchFaceColors() {
         val deferredInteractiveInstance = handlerCoroutineScope.async {
+            @Suppress("deprecation")
             service.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 deviceConfig,
@@ -1974,7 +1977,7 @@
         val interactiveInstance = awaitWithTimeout(deferredInteractiveInstance)
 
         assertTrue(
-            wallpaperService.rendererCreatedLatch.await(
+            wallpaperService.rendererInitializedLatch.await(
                 UPDATE_TIMEOUT_MILLIS,
                 TimeUnit.MILLISECONDS
             )
@@ -2464,7 +2467,7 @@
     testContext: Context,
     private var surfaceHolderOverride: SurfaceHolder,
 ) : WatchFaceService() {
-    val rendererCreatedLatch = CountDownLatch(1)
+    val rendererInitializedLatch = CountDownLatch(1)
 
     init {
         attachBaseContext(testContext)
@@ -2493,6 +2496,10 @@
             CanvasType.HARDWARE,
             16
         ) {
+            override suspend fun init() {
+                rendererInitializedLatch.countDown()
+            }
+
             override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
 
             override fun renderHighlightLayer(
@@ -2501,7 +2508,6 @@
                 zonedDateTime: ZonedDateTime
             ) {}
         }
-        rendererCreatedLatch.countDown()
         return WatchFace(WatchFaceType.DIGITAL, renderer)
     }
 }
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
index c0bff94..1bbabb6 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
@@ -214,6 +214,14 @@
      * @throws [ServiceStartFailureException] if the watchface dies during startup.
      */
     @Throws(RemoteException::class)
+    @Deprecated(
+        "Use an overload that specifies PreviewImageUpdateRequestedListener",
+        ReplaceWith(
+            "getOrCreateInteractiveWatchFaceClient(" +
+                "String, DeviceConfig, WatchUiState, UserStyleData?, Map<Int, ComplicationData>?," +
+                " Executor, PreviewImageUpdateRequestedListener)"
+        )
+    )
     public suspend fun getOrCreateInteractiveWatchFaceClient(
         id: String,
         deviceConfig: DeviceConfig,
@@ -265,6 +273,7 @@
      * @throws [ServiceStartFailureException] if the watchface dies during startup.
      */
     @Throws(RemoteException::class)
+    @Suppress("deprecation")
     public suspend fun getOrCreateInteractiveWatchFaceClient(
         instanceId: String,
         deviceConfig: DeviceConfig,
@@ -415,6 +424,13 @@
         }
     }
 
+    @Deprecated(
+        "Use an overload that specifies PreviewImageUpdateRequestedListener",
+        replaceWith = ReplaceWith(
+            "getOrCreateInteractiveWatchFaceClient(String, DeviceConfig, WatchUiState, " +
+                "UserStyleData?, Map<Int, ComplicationData>?, Executor, " +
+                "PreviewImageUpdateRequestedListener)")
+    )
     override suspend fun getOrCreateInteractiveWatchFaceClient(
         id: String,
         deviceConfig: DeviceConfig,
diff --git a/wear/watchface/watchface-complications-data/build.gradle b/wear/watchface/watchface-complications-data/build.gradle
index 838601e..52572f0 100644
--- a/wear/watchface/watchface-complications-data/build.gradle
+++ b/wear/watchface/watchface-complications-data/build.gradle
@@ -45,13 +45,6 @@
     annotationProcessor(project(":versionedparcelable:versionedparcelable-compiler"))
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 android {
     buildFeatures {
         aidl = true
diff --git a/wear/watchface/watchface-editor/build.gradle b/wear/watchface/watchface-editor/build.gradle
index dcebb43..eb5993b 100644
--- a/wear/watchface/watchface-editor/build.gradle
+++ b/wear/watchface/watchface-editor/build.gradle
@@ -50,13 +50,6 @@
     samples(project(":wear:watchface:watchface-samples"))
 }
 
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
-
 android {
     defaultConfig {
         minSdkVersion 26
diff --git a/wear/watchface/watchface-editor/samples/build.gradle b/wear/watchface/watchface-editor/samples/build.gradle
index 613a974..bde520f 100644
--- a/wear/watchface/watchface-editor/samples/build.gradle
+++ b/wear/watchface/watchface-editor/samples/build.gradle
@@ -44,11 +44,4 @@
         minSdkVersion 26
     }
     namespace "androidx.wear.watchface.editor.samples"
-}
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
 }
\ No newline at end of file
diff --git a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRenderer2Test.kt b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRenderer2Test.kt
index 076e074..580847e 100644
--- a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRenderer2Test.kt
+++ b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRenderer2Test.kt
@@ -135,6 +135,7 @@
         )
 
         val deferredClient = handlerCoroutineScope.async {
+            @Suppress("deprecation")
             watchFaceControlClientService.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 DeviceConfig(
diff --git a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRendererTest.kt b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRendererTest.kt
index 9cfb6cd..2581dbc 100644
--- a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRendererTest.kt
+++ b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRendererTest.kt
@@ -108,6 +108,7 @@
             TestAsyncCanvasRenderInitWatchFaceService(context, surfaceHolder, initFuture)
 
         val deferredClient = handlerCoroutineScope.async {
+            @Suppress("deprecation")
             watchFaceControlClientService.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 DeviceConfig(
diff --git a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRenderer2Test.kt b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRenderer2Test.kt
index 5a4c7a2..68b7879 100644
--- a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRenderer2Test.kt
+++ b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRenderer2Test.kt
@@ -126,6 +126,7 @@
         )
 
         val deferredClient = handlerCoroutineScope.async {
+            @Suppress("deprecation")
             watchFaceControlClientService.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 DeviceConfig(
diff --git a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRendererTest.kt b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRendererTest.kt
index f1c1053..429b07c 100644
--- a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRendererTest.kt
+++ b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRendererTest.kt
@@ -112,6 +112,7 @@
         )
 
         val deferredClient = handlerCoroutineScope.async {
+            @Suppress("deprecation")
             watchFaceControlClientService.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 DeviceConfig(
diff --git a/wear/watchface/watchface-style/build.gradle b/wear/watchface/watchface-style/build.gradle
index 45839a9..36c56da 100644
--- a/wear/watchface/watchface-style/build.gradle
+++ b/wear/watchface/watchface-style/build.gradle
@@ -63,11 +63,4 @@
     mavenGroup = LibraryGroups.WEAR_WATCHFACE
     inceptionYear = "2020"
     description = "Android Wear Watchface Style"
-}
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
 }
\ No newline at end of file
diff --git a/wear/watchface/watchface/build.gradle b/wear/watchface/watchface/build.gradle
index ccdc3b9..f7bcec2 100644
--- a/wear/watchface/watchface/build.gradle
+++ b/wear/watchface/watchface/build.gradle
@@ -78,11 +78,4 @@
     mavenGroup = LibraryGroups.WEAR_WATCHFACE
     inceptionYear = "2020"
     description = "Android Wear Watchface"
-}
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
 }
\ No newline at end of file
diff --git a/wear/watchface/watchface/samples/build.gradle b/wear/watchface/watchface/samples/build.gradle
index 28c5a96..d5f3596 100644
--- a/wear/watchface/watchface/samples/build.gradle
+++ b/wear/watchface/watchface/samples/build.gradle
@@ -46,10 +46,3 @@
     }
     namespace "androidx.wear.watchface.samples"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
index 6b6a24b..c92c78b 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
@@ -440,12 +440,14 @@
     }
 
     internal fun dump(writer: IndentingPrintWriter) {
-        writer.println("WatchFaceEngine:")
+        writer.println("InteractiveWatchFaceImpl:")
         writer.increaseIndent()
         synchronized(lock) {
-            writer.print("engine = $engine")
-            writer.print("pendingPreviewImageUpdateRequested = $pendingPreviewImageUpdateRequested")
-            writer.print(
+            writer.println("engine = $engine")
+            writer.println(
+                "pendingPreviewImageUpdateRequested = $pendingPreviewImageUpdateRequested"
+            )
+            writer.println(
                 "complications = " + complications.map {
                     "{id = ${it.key}, value = ${it.value}}"
                 }.joinToString(",")
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt
index ecbfbec..11ef49f 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt
@@ -201,28 +201,33 @@
     ): IInteractiveWatchFace? {
         val asyncTraceEvent =
             AsyncTraceEvent("IWatchFaceInstanceServiceStub.getOrCreateInteractiveWatchFaceWCS")
-        return InteractiveInstanceManager
-            .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
-                InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
-                    params,
-                    // Wrapped IPendingInteractiveWatchFace to support tracing.
-                    object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() = callback.apiVersion
+        return try {
+            InteractiveInstanceManager
+                .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
+                    InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
+                        params,
+                        // Wrapped IPendingInteractiveWatchFace to support tracing.
+                        object : IPendingInteractiveWatchFace.Stub() {
+                            override fun getApiVersion() = callback.apiVersion
 
-                        override fun onInteractiveWatchFaceCreated(
-                            iInteractiveWatchFaceWcs: IInteractiveWatchFace?
-                        ) {
-                            asyncTraceEvent.close()
-                            callback.onInteractiveWatchFaceCreated(iInteractiveWatchFaceWcs)
-                        }
+                            override fun onInteractiveWatchFaceCreated(
+                                iInteractiveWatchFaceWcs: IInteractiveWatchFace?
+                            ) {
+                                asyncTraceEvent.close()
+                                callback.onInteractiveWatchFaceCreated(iInteractiveWatchFaceWcs)
+                            }
 
-                        override fun onInteractiveWatchFaceCrashed(exception: CrashInfoParcel) {
-                            asyncTraceEvent.close()
-                            callback.onInteractiveWatchFaceCrashed(exception)
+                            override fun onInteractiveWatchFaceCrashed(exception: CrashInfoParcel) {
+                                asyncTraceEvent.close()
+                                callback.onInteractiveWatchFaceCrashed(exception)
+                            }
                         }
-                    }
+                    )
                 )
-            )
+        } catch (e: Exception) {
+            Log.e(TAG, "getOrCreateInteractiveWatchFace failed ", e)
+            throw e
+        }
     }
 
     override fun getEditorService(): EditorService = EditorService.globalEditorService
diff --git a/webkit/integration-tests/testapp/src/main/AndroidManifest.xml b/webkit/integration-tests/testapp/src/main/AndroidManifest.xml
index 503de45..81641f3 100644
--- a/webkit/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/webkit/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -122,5 +122,7 @@
             android:exported="true" />
         <activity android:name=".RequestedWithHeaderActivity"
             android:exported="true" />
+        <activity android:name=".ProcessGlobalConfigActivity"
+            android:exported="true" />
     </application>
 </manifest>
diff --git a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/MainActivity.java b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/MainActivity.java
index 5df0d20..b42ab87 100644
--- a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/MainActivity.java
+++ b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/MainActivity.java
@@ -78,6 +78,9 @@
                 new MenuListView.MenuItem(
                         getResources().getString(R.string.requested_with_activity_title),
                         new Intent(activityContext, RequestedWithHeaderActivity.class)),
+                new MenuListView.MenuItem(
+                        getResources().getString(R.string.process_global_config_activity_title),
+                        new Intent(activityContext, ProcessGlobalConfigActivity.class)),
 
         };
         listView.setItems(menuItems);
diff --git a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/ProcessGlobalConfigActivity.java b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/ProcessGlobalConfigActivity.java
new file mode 100644
index 0000000..bb5e58b
--- /dev/null
+++ b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/ProcessGlobalConfigActivity.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.webkit;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.webkit.ProcessGlobalConfig;
+
+
+/**
+ * An {@link Activity} which makes use of {@link androidx.webkit.ProcessGlobalConfig} to set up
+ * process global configuration prior to loading WebView.
+ */
+public class ProcessGlobalConfigActivity extends AppCompatActivity {
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        ProcessGlobalConfig.createInstance()
+                .setDataDirectorySuffix("per_process_webview_data_0")
+                .apply();
+        WebView wv = new WebView(this);
+        setContentView(wv);
+        wv.setWebViewClient(new WebViewClient());
+        wv.loadUrl("www.google.com");
+    }
+}
diff --git a/webkit/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml b/webkit/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
index 81b2dd2..6cc880e 100644
--- a/webkit/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
+++ b/webkit/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
@@ -98,4 +98,7 @@
     <string name="requested_with_no_header">No Header</string>
     <string name="requested_with_app_package_name">App Package Name</string>
 
+    <!-- Process Global Config -->
+    <string name="process_global_config_activity_title">Process Global Config</string>
+
 </resources>
diff --git a/webkit/webkit/proguard-rules.pro b/webkit/webkit/proguard-rules.pro
index f172b8c..8d6acfa 100644
--- a/webkit/webkit/proguard-rules.pro
+++ b/webkit/webkit/proguard-rules.pro
@@ -14,3 +14,9 @@
 
 # Prevent WebViewClientCompat from being renamed, since chromium depends on this name.
 -keepnames public class androidx.webkit.WebViewClientCompat
+
+# Prevent ProcessGlobalConfig and member sProcessGlobalConfig from being renamed, since chromium
+# depends on this name.
+-keepnames public class androidx.webkit.ProcessGlobalConfig {
+    private static final * sProcessGlobalConfig;
+}
\ No newline at end of file
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatForceDarkTest.java b/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatForceDarkTest.java
index e495f13..01ca7fc 100644
--- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatForceDarkTest.java
+++ b/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatForceDarkTest.java
@@ -66,7 +66,7 @@
      * should be reflected in that test as necessary. See http://go/modifying-webview-cts.
      */
     @SuppressWarnings("deprecation")
-    @FlakyTest(bugId = 230480958)
+    @Ignore("Disabled due to b/230480958")
     @Test
     public void testForceDark_rendersDark() throws Throwable {
         WebkitUtils.checkFeature(WebViewFeature.FORCE_DARK);
@@ -101,7 +101,7 @@
      * i.e. web contents are always darkened by a user agent.
      */
     @SuppressWarnings("deprecation")
-    @FlakyTest(bugId = 240432254)
+    @Ignore("Disabled due to b/240432254")
     @Test
     public void testForceDark_userAgentDarkeningOnly() {
         WebkitUtils.checkFeature(WebViewFeature.FORCE_DARK);
diff --git a/webkit/webkit/src/main/java/androidx/webkit/ProcessGlobalConfig.java b/webkit/webkit/src/main/java/androidx/webkit/ProcessGlobalConfig.java
new file mode 100644
index 0000000..eebef97
--- /dev/null
+++ b/webkit/webkit/src/main/java/androidx/webkit/ProcessGlobalConfig.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.webkit;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresFeature;
+import androidx.annotation.RestrictTo;
+import androidx.webkit.internal.ApiFeature;
+import androidx.webkit.internal.WebViewFeatureInternal;
+
+import org.chromium.support_lib_boundary.ProcessGlobalConfigConstants;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Process Global Configuration for WebView.
+ *
+ * WebView has some process-global configuration parameters that cannot be changed once WebView has
+ * been loaded. This class allows apps to set these parameters.
+ * <p>
+ * If it is used, the configuration should be set and {@link #apply()} should be called prior to
+ * loading WebView into the calling process. Most of the methods in
+ * {@link android.webkit} and {@link androidx.webkit} packages load WebView, so the
+ * configuration should be applied before calling any of these methods.
+ * <p>
+ * The following code configures the data directory suffix that WebView
+ * uses and then applies the configuration. WebView uses this configuration when it is loaded.
+ * <pre class="prettyprint">
+ * ProcessGlobalConfig.createInstance()
+ *                    .setDataDirectorySuffix("random_suffix")
+ *                    .apply();
+ * </pre>
+ * <p>
+ * Restrictions are in place to ensure that {@link #createInstance()} can only be called once.
+ * The setters and {@link #apply()} can also only be called once.
+ * <p>
+ * Only a single thread should access this class at a given time.
+ * <p>
+ * The configuration should be set up as early as possible during application startup, to ensure
+ * that it happens before any other thread can call a method that loads WebView.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+public class ProcessGlobalConfig {
+    private static final AtomicReference<HashMap<String, Object>> sProcessGlobalConfig =
+            new AtomicReference<HashMap<String, Object>>();
+    private static AtomicBoolean sInstanceCreated = new AtomicBoolean(false);
+    private boolean mApplyCalled = false;
+    private String mDataDirectorySuffix;
+
+    private ProcessGlobalConfig() {
+    }
+
+    /**
+     * Creates instance of {@link ProcessGlobalConfig}.
+     *
+     * This method can only be called once.
+     *
+     * @return {@link ProcessGlobalConfig} object where configuration can be set and applied
+     *
+     * @throws IllegalStateException if this method was called before
+     */
+    @NonNull
+    public static ProcessGlobalConfig createInstance() {
+        if (!sInstanceCreated.compareAndSet(false, true)) {
+            throw new IllegalStateException("ProcessGlobalConfig#createInstance() was already "
+                    + "called before");
+        }
+        return new ProcessGlobalConfig();
+    }
+
+    /**
+     * Applies the configuration to be used by WebView on loading.
+     *
+     * If this method is not called, the configuration that is set will not be applied.
+     * This method can only be called once.
+     * <p>
+     * Calling this method will not cause WebView to be loaded and will not block the calling
+     * thread.
+     *
+     * @throws IllegalStateException if WebView has already been initialized
+     *                               in the current process or if this method was called before
+     */
+    public void apply() {
+        // TODO(crbug.com/1355297): We can check if we are storing the config in the place that
+        //  WebView is going to look for it, and throw if they are not the same.
+        //  For this, we would need to reflect into Android Framework internals to get
+        //  ActivityThread.currentApplication().getClassLoader() and see if it is the same as
+        //  this.getClass().getClassLoader(). This would add reflection that we might not add a
+        //  framework API for. Once we know what framework path we will take for
+        //  ProcessGlobalConfig, revisit this.
+        HashMap<String, Object> configMap = new HashMap<String, Object>();
+        if (mApplyCalled) {
+            throw new IllegalStateException("ProcessGlobalConfig#apply() was already called "
+                    + "before");
+        }
+        mApplyCalled = true;
+        if (webViewCurrentlyLoaded()) {
+            throw new IllegalStateException(
+                    "WebView has already been initialized in the current process");
+        }
+        final ApiFeature.P feature = WebViewFeatureInternal.SET_DATA_DIRECTORY_SUFFIX;
+        if (feature.isSupportedByFramework()) {
+            androidx.webkit.internal.ApiHelperForP.setDataDirectorySuffix(mDataDirectorySuffix);
+        } else {
+            configMap.put(ProcessGlobalConfigConstants.DATA_DIRECTORY_SUFFIX, mDataDirectorySuffix);
+        }
+        if (!sProcessGlobalConfig.compareAndSet(null, configMap)) {
+            throw new RuntimeException("Attempting to set ProcessGlobalConfig"
+                    + "#sProcessGlobalConfig when it was already set");
+        }
+    }
+
+    /**
+     * Define the directory used to store WebView data for the current process.
+     *
+     * The provided suffix will be used when constructing data and cache
+     * directory paths. If this API is not called, no suffix will be used.
+     * Each directory can be used by only one process in the application. If more
+     * than one process in an app wishes to use WebView, only one process can use
+     * the default directory, and other processes must call this API to define
+     * a unique suffix.
+     * <p>
+     * This means that different processes in the same application cannot directly
+     * share WebView-related data, since the data directories must be distinct.
+     * Applications that use this API may have to explicitly pass data between
+     * processes. For example, login cookies may have to be copied from one
+     * process's cookie jar to the other using {@link android.webkit.CookieManager} if both
+     * processes' WebViews are intended to be logged in.
+     * <p>
+     * Most applications should simply ensure that all components of the app
+     * that rely on WebView are in the same process, to avoid needing multiple
+     * data directories. The {@link android.webkit.WebView#disableWebView} method can be used to
+     * ensure that the other processes do not use WebView by accident in this case.
+     * <p>
+     * This is a compatibility method for
+     * {@link android.webkit.WebView#setDataDirectorySuffix(String)}
+     *
+     * @param suffix The directory name suffix to be used for the current
+     *               process. Must not contain a path separator and should not be empty.
+     * @throws IllegalStateException if WebView has already been initialized
+     *                               in the current process or if this method was called before
+     * @throws IllegalArgumentException if the suffix contains a path separator or is empty.
+     */
+    @RequiresFeature(name = WebViewFeature.SET_DATA_DIRECTORY_SUFFIX,
+            enforcement =
+                    "androidx.webkit.WebViewFeature#isFeatureSupported")
+    @NonNull
+    public ProcessGlobalConfig setDataDirectorySuffix(@NonNull String suffix) {
+        if (mDataDirectorySuffix != null) {
+            throw new IllegalStateException(
+                    "ProcessGlobalConfig#setDataDirectorySuffix(String) was already "
+                            + "called");
+        }
+        final ApiFeature.P feature = WebViewFeatureInternal.SET_DATA_DIRECTORY_SUFFIX;
+        if (!feature.isSupported()) {
+            throw WebViewFeatureInternal.getUnsupportedOperationException();
+        }
+        if (suffix.equals("")) {
+            throw new IllegalArgumentException("Suffix cannot be an empty string");
+        }
+        if (suffix.indexOf(File.separatorChar) >= 0) {
+            throw new IllegalArgumentException("Suffix " + suffix
+                    + " contains a path separator");
+        }
+        mDataDirectorySuffix = suffix;
+        return this;
+    }
+
+    private boolean webViewCurrentlyLoaded() {
+        // TODO(crbug.com/1355297): This is racy but it is the best we can do for now since we can't
+        //  access the lock for sProviderInstance in WebView. Evaluate a framework path for
+        //  ProcessGlobalConfig.
+        try {
+            Class<?> webViewFactoryClass = Class.forName("android.webkit.WebViewFactory");
+            Field providerInstanceField =
+                    webViewFactoryClass.getDeclaredField("sProviderInstance");
+            providerInstanceField.setAccessible(true);
+            return providerInstanceField.get(null) != null;
+        } catch (Exception e) {
+            // This means WebViewFactory was not found or sProviderInstance was not found within
+            // the class. If that is true, WebView doesn't seem to be loaded.
+            return false;
+        }
+    }
+}
diff --git a/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java b/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
index ef39f1d..691f465 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
@@ -101,6 +101,7 @@
             REQUESTED_WITH_HEADER_CONTROL,
             ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY,
             GET_COOKIE_INFO,
+            SET_DATA_DIRECTORY_SUFFIX,
     })
     @Retention(RetentionPolicy.SOURCE)
     @Target({ElementType.PARAMETER, ElementType.METHOD})
@@ -514,6 +515,15 @@
     public static final String GET_COOKIE_INFO = "GET_COOKIE_INFO";
 
     /**
+     * Feature for {@link #isFeatureSupported(String)}.
+     * This feature covers
+     * {@link androidx.webkit.ProcessGlobalConfig#setDataDirectorySuffix(String)}.
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public static final String SET_DATA_DIRECTORY_SUFFIX = "SET_DATA_DIRECTORY_SUFFIX";
+
+    /**
      * Return whether a feature is supported at run-time. On devices running Android version {@link
      * android.os.Build.VERSION_CODES#LOLLIPOP} and higher, this will check whether a feature is
      * supported, depending on the combination of the desired feature, the Android version of
diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/ApiFeature.java b/webkit/webkit/src/main/java/androidx/webkit/internal/ApiFeature.java
index 7760609..3e99b09 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/ApiFeature.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/internal/ApiFeature.java
@@ -118,14 +118,14 @@
     /**
      * Represents a feature that has no framework support.
      */
-    public static final class NoFramework extends ApiFeature {
+    public static class NoFramework extends ApiFeature {
 
         NoFramework(@NonNull String publicFeatureValue, @NonNull String internalFeatureValue) {
             super(publicFeatureValue, internalFeatureValue);
         }
 
         @Override
-        public boolean isSupportedByFramework() {
+        public final boolean isSupportedByFramework() {
             return false;
         }
     }
@@ -133,14 +133,14 @@
     /**
      * Represents a feature that was added in M.
      */
-    public static final class M extends ApiFeature {
+    public static class M extends ApiFeature {
 
         M(@NonNull String publicFeatureValue, @NonNull String internalFeatureValue) {
             super(publicFeatureValue, internalFeatureValue);
         }
 
         @Override
-        public boolean isSupportedByFramework() {
+        public final boolean isSupportedByFramework() {
             return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
         }
     }
@@ -148,14 +148,14 @@
     /**
      * Represents a feature that was added in N.
      */
-    public static final class N extends ApiFeature {
+    public static class N extends ApiFeature {
 
         N(@NonNull String publicFeatureValue, @NonNull String internalFeatureValue) {
             super(publicFeatureValue, internalFeatureValue);
         }
 
         @Override
-        public boolean isSupportedByFramework() {
+        public final boolean isSupportedByFramework() {
             return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N;
         }
     }
@@ -163,14 +163,14 @@
     /**
      * Represents a feature that was added in O.
      */
-    public static final class O extends ApiFeature {
+    public static class O extends ApiFeature {
 
         O(@NonNull String publicFeatureValue, @NonNull String internalFeatureValue) {
             super(publicFeatureValue, internalFeatureValue);
         }
 
         @Override
-        public boolean isSupportedByFramework() {
+        public final boolean isSupportedByFramework() {
             return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
         }
     }
@@ -178,14 +178,14 @@
     /**
      * Represents a feature that was added in O_MR1.
      */
-    public static final class O_MR1 extends ApiFeature {
+    public static class O_MR1 extends ApiFeature {
 
         O_MR1(@NonNull String publicFeatureValue, @NonNull String internalFeatureValue) {
             super(publicFeatureValue, internalFeatureValue);
         }
 
         @Override
-        public boolean isSupportedByFramework() {
+        public final boolean isSupportedByFramework() {
             return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1;
         }
     }
@@ -193,14 +193,14 @@
     /**
      * Represents a feature that was added in P.
      */
-    public static final class P extends ApiFeature {
+    public static class P extends ApiFeature {
 
         P(@NonNull String publicFeatureValue, @NonNull String internalFeatureValue) {
             super(publicFeatureValue, internalFeatureValue);
         }
 
         @Override
-        public boolean isSupportedByFramework() {
+        public final boolean isSupportedByFramework() {
             return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P;
         }
     }
@@ -208,14 +208,14 @@
     /**
      * Represents a feature that was added in Q.
      */
-    public static final class Q extends ApiFeature {
+    public static class Q extends ApiFeature {
 
         Q(@NonNull String publicFeatureValue, @NonNull String internalFeatureValue) {
             super(publicFeatureValue, internalFeatureValue);
         }
 
         @Override
-        public boolean isSupportedByFramework() {
+        public final boolean isSupportedByFramework() {
             return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q;
         }
     }
diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/ApiHelperForP.java b/webkit/webkit/src/main/java/androidx/webkit/internal/ApiHelperForP.java
index ed57a83..a495e22 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/ApiHelperForP.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/internal/ApiHelperForP.java
@@ -100,4 +100,13 @@
     public static Looper getWebViewLooper(@NonNull WebView webView) {
         return webView.getWebViewLooper();
     }
+
+
+    /**
+     * @see WebView#setDataDirectorySuffix(String)
+     */
+    @DoNotInline
+    public static void setDataDirectorySuffix(@NonNull String suffix) {
+        WebView.setDataDirectorySuffix(suffix);
+    }
 }
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 c2c16cd..e3bd44e 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
@@ -54,6 +54,23 @@
  * feature is supported by the current framework and/or WebView APK.
  */
 public class WebViewFeatureInternal {
+
+    /**
+     * WebView APK feature that is used in cases where the standard feature detection
+     * mechanism of querying for the flag in the WebView APK is not used.
+     *
+     * The non-standard feature detection mechanism can be provided by overriding the
+     * {@link ApiFeature#isSupportedByWebView()} method of the framework dependant subclass. If
+     * it is not overridden, {@link ApiFeature#isSupportedByWebView()} would return {@code false}.
+     *
+     * The value should not coincide with any other actual feature names in the WebView APK. The
+     * extra '_'s prefixing the value is added to reduce the chance of collision.
+     *
+     * One of the main reason for using a non-standard feature detection is to check whether a
+     * feature is present in the WebView APK without loading WebView into the calling process.
+     */
+    private static final String NONSTANDARD_FEATURE_DETECTION = "__NONSTANDARD_FEATURE_DETECTION";
+
     /**
      * This feature covers
      * {@link androidx.webkit.WebViewCompat#postVisualStateCallback(android.webkit.WebView, long,
@@ -367,6 +384,21 @@
 
     /**
      * This feature covers
+     * {@link androidx.webkit.ProcessGlobalConfig#setDataDirectorySuffix(String)}.
+     */
+    public static final ApiFeature.P SET_DATA_DIRECTORY_SUFFIX =
+            new ApiFeature.P(WebViewFeature.SET_DATA_DIRECTORY_SUFFIX,
+                    NONSTANDARD_FEATURE_DETECTION) {
+                @Override
+                public boolean isSupportedByWebView() {
+                    // TODO(crbug.com/1355297): Change it to version check once the support is
+                    //  added to WebView.
+                    return false;
+                }
+            };
+
+    /**
+     * This feature covers
      * {@link WebViewCompat#getWebViewRenderProcessClient()},
      * {@link WebViewCompat#setWebViewRenderProcessClient(WebViewRenderProcessClient)},
      * {@link WebViewRenderProcessClient#onRenderProcessUnresponsive(WebView, WebViewRenderProcess)},
diff --git a/window/integration-tests/configuration-change-tests/build.gradle b/window/integration-tests/configuration-change-tests/build.gradle
index 5c5493d..1b756f9 100644
--- a/window/integration-tests/configuration-change-tests/build.gradle
+++ b/window/integration-tests/configuration-change-tests/build.gradle
@@ -41,10 +41,3 @@
     implementation("androidx.core:core:1.8.0-rc01")
     implementation("androidx.activity:activity:1.5.0-beta01")
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/window/window-java/build.gradle b/window/window-java/build.gradle
index 410c635..eab48f6 100644
--- a/window/window-java/build.gradle
+++ b/window/window-java/build.gradle
@@ -49,10 +49,3 @@
 android {
     namespace "androidx.window.java"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/window/window-rxjava2/build.gradle b/window/window-rxjava2/build.gradle
index b232189..0fee52f 100644
--- a/window/window-rxjava2/build.gradle
+++ b/window/window-rxjava2/build.gradle
@@ -56,10 +56,3 @@
     inceptionYear = "2021"
     description = "WindowManager RxJava 2"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/window/window-rxjava3/build.gradle b/window/window-rxjava3/build.gradle
index e25989d..3c2706b 100644
--- a/window/window-rxjava3/build.gradle
+++ b/window/window-rxjava3/build.gradle
@@ -54,10 +54,3 @@
     inceptionYear = "2021"
     description = "WindowManager RxJava 3 Support"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/window/window-samples/build.gradle b/window/window-samples/build.gradle
index 0312e03..909ad1e 100644
--- a/window/window-samples/build.gradle
+++ b/window/window-samples/build.gradle
@@ -64,10 +64,3 @@
     inceptionYear = "2020"
     description = "Demo of Jetpack WindowManager library APIs"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityBase.java b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityBase.java
index bd46884..5810e48 100644
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityBase.java
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityBase.java
@@ -207,7 +207,7 @@
         for (EmbeddingRule rule : currentRules) {
             if (rule instanceof SplitPlaceholderRule) {
                 for (ActivityFilter filter : ((SplitPlaceholderRule) rule).getFilters()) {
-                    if (filter.getComponentName().getClassName().equals(a.getName())) {
+                    if (filter.matchesClassName(a)) {
                         return (SplitPlaceholderRule) rule;
                     }
                 }
@@ -248,14 +248,12 @@
     }
 
     /** Whether the given rule is for splitting the given activity with another. */
-    private boolean isRuleFor(Class<? extends Activity> a, ActivityRule config) {
-        return isRuleFor(a != null ? a.getName() : "*", config);
-    }
-
-    /** Whether the given rule is for splitting the given activity with another. */
-    private boolean isRuleFor(String activityName, ActivityRule config) {
+    private boolean isRuleFor(
+            @Nullable Class<? extends Activity> a,
+            @NonNull ActivityRule config
+    ) {
         for (ActivityFilter filter : config.getFilters()) {
-            if (filter.getComponentName().getClassName().contains(activityName)) {
+            if (filter.matchesClassNameOrWildCard(a)) {
                 return true;
             }
         }
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityBase.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityBase.kt
index cfd8064..2b278a0 100644
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityBase.kt
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityBase.kt
@@ -225,7 +225,7 @@
             return false
         }
         for (filter in rule.filters) {
-            if (filter.componentName.className == SplitPipActivityB::class.java.name) {
+            if (filter.matchesClassName(SplitPipActivityB::class.java)) {
                 return true
             }
         }
diff --git a/window/window-testing/build.gradle b/window/window-testing/build.gradle
index 8138a13..3631174 100644
--- a/window/window-testing/build.gradle
+++ b/window/window-testing/build.gradle
@@ -51,11 +51,4 @@
     mavenGroup = LibraryGroups.WINDOW
     inceptionYear = "2021"
     description = "WindowManager Test Library"
-}
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
 }
\ No newline at end of file
diff --git a/window/window/api/public_plus_experimental_current.txt b/window/window/api/public_plus_experimental_current.txt
index 2e665d12..b1b5c15 100644
--- a/window/window/api/public_plus_experimental_current.txt
+++ b/window/window/api/public_plus_experimental_current.txt
@@ -19,12 +19,10 @@
 
   @androidx.window.core.ExperimentalWindowApi public final class ActivityFilter {
     ctor public ActivityFilter(android.content.ComponentName componentName, String? intentAction);
-    method public android.content.ComponentName getComponentName();
-    method public String? getIntentAction();
     method public boolean matchesActivity(android.app.Activity activity);
+    method public <T extends android.app.Activity> boolean matchesClassName(Class<T> clazz);
+    method public <T extends android.app.Activity> boolean matchesClassNameOrWildCard(Class<T>? clazz);
     method public boolean matchesIntent(android.content.Intent intent);
-    property public final android.content.ComponentName componentName;
-    property public final String? intentAction;
   }
 
   @androidx.window.core.ExperimentalWindowApi public final class ActivityRule extends androidx.window.embedding.EmbeddingRule {
diff --git a/window/window/build.gradle b/window/window/build.gradle
index eb44810..8cde8eb 100644
--- a/window/window/build.gradle
+++ b/window/window/build.gradle
@@ -91,10 +91,3 @@
     // Sidecar interface.
     failOnDeprecationWarnings = false
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/core/ActivityComponentInfoTest.kt b/window/window/src/androidTest/java/androidx/window/core/ActivityComponentInfoTest.kt
new file mode 100644
index 0000000..267f7df
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/core/ActivityComponentInfoTest.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.core
+
+import android.content.ComponentName
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+/**
+ * Test for [ActivityComponentInfo] that run against Android classes.
+ */
+class ActivityComponentInfoTest {
+
+    @Test
+    fun idempotenceFromComponentName() {
+        val componentName = ComponentName("package", "class")
+        val activityComponentInfo = ActivityComponentInfo(componentName)
+
+        assertEquals(componentName.packageName, activityComponentInfo.packageName)
+        assertEquals(componentName.className, activityComponentInfo.className)
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/androidTest/java/androidx/window/embedding/ActivityFilterTest.kt b/window/window/src/androidTest/java/androidx/window/embedding/ActivityFilterTest.kt
index 0ebd08a..3aa1026 100644
--- a/window/window/src/androidTest/java/androidx/window/embedding/ActivityFilterTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/embedding/ActivityFilterTest.kt
@@ -24,41 +24,48 @@
 import com.nhaarman.mockitokotlin2.doReturn
 import com.nhaarman.mockitokotlin2.mock
 import com.nhaarman.mockitokotlin2.whenever
+import org.junit.Assert.assertEquals
 import org.junit.Before
 import org.junit.Test
 
-private const val ACTION = "action.test"
-
+/**
+ * Integration test for [ActivityFilter] to test construction from [ComponentName].
+ */
 @OptIn(ExperimentalWindowApi::class)
 class ActivityFilterTest {
-    private val component1 = ComponentName("a.b.c", "a.b.c.TestActivity")
-    private val component2 = ComponentName("d.e.f", "d.e.f.TestActivity")
-    private val wildcard = ComponentName("*", "*")
-    private val classWildcard = ComponentName("a.b.c", "*")
+
     private val intent = Intent()
     private val activity = mock<Activity> {
         on { intent } doReturn intent
-        on { componentName } doReturn component2
+        on { componentName } doReturn COMPONENT_2
     }
 
     @Before
     fun setUp() {
-        intent.component = component1
+        intent.component = COMPONENT_1
+    }
+
+    @Test
+    fun idempotenceFromComponentName() {
+        val filter = ActivityFilter(COMPONENT_1, ACTION)
+
+        assertEquals(COMPONENT_1.packageName, filter.activityComponentInfo.packageName)
+        assertEquals(COMPONENT_1.className, filter.activityComponentInfo.className)
     }
 
     @Test
     fun testMatchActivity_MatchIntentWithoutAction() {
-        val filter = ActivityFilter(component1, null /* intentAction */)
+        val filter = ActivityFilter(COMPONENT_1, null /* intentAction */)
 
         assertWithMessage("#matchActivity must be true because intent.component matches")
             .that(filter.matchesActivity(activity)).isTrue()
 
-        intent.component = component2
+        intent.component = COMPONENT_2
 
         assertWithMessage("#matchActivity must be false because component mismatches")
             .that(filter.matchesActivity(activity)).isFalse()
 
-        doReturn(component1).whenever(activity).componentName
+        doReturn(COMPONENT_1).whenever(activity).componentName
 
         assertWithMessage("#matchActivity must be true because activity.componentName matches")
             .that(filter.matchesActivity(activity)).isTrue()
@@ -66,7 +73,7 @@
 
     @Test
     fun testMatchActivity_MatchIntentWithAction() {
-        val filter = ActivityFilter(component1, ACTION)
+        val filter = ActivityFilter(COMPONENT_1, ACTION)
 
         assertWithMessage("#matchActivity must be false because intent has no action")
             .that(filter.matchesActivity(activity)).isFalse()
@@ -79,7 +86,7 @@
 
     @Test
     fun testMatchActivity_MatchWildcardWithAction() {
-        val filter = ActivityFilter(wildcard, ACTION)
+        val filter = ActivityFilter(WILDCARD, ACTION)
 
         assertWithMessage("#matchActivity must be false because intent has no action")
             .that(filter.matchesActivity(activity)).isFalse()
@@ -91,19 +98,28 @@
 
         intent.component = null
 
-        assertWithMessage("#matchActivity must be true because intent.action matches regardless " +
-            "of null component")
+        assertWithMessage(
+            "#matchActivity must be true because intent.action matches regardless " +
+                "of null component"
+        )
             .that(filter.matchesActivity(activity)).isTrue()
     }
 
     @Test
     fun testMatchActivity_MatchIntentWithPackage() {
-        val filter = ActivityFilter(classWildcard, null /* intentAction */)
+        val filter = ActivityFilter(WILDCARD, null /* intentAction */)
 
         intent.component = null
-        intent.`package` = classWildcard.packageName
+        intent.`package` = WILDCARD.packageName
 
         assertWithMessage("#matchActivity must be true because intent.package matches")
             .that(filter.matchesActivity(activity)).isTrue()
     }
-}
\ No newline at end of file
+
+    companion object {
+        private const val ACTION = "action.test"
+        private val COMPONENT_1 = ComponentName("a.b.c", "a.b.c.TestActivity")
+        private val COMPONENT_2 = ComponentName("d.e.f", "d.e.f.TestActivity")
+        private val WILDCARD = ComponentName("*", "*")
+    }
+}
diff --git a/window/window/src/main/java/androidx/window/core/ActivityComponentInfo.kt b/window/window/src/main/java/androidx/window/core/ActivityComponentInfo.kt
new file mode 100644
index 0000000..b2e1745
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/core/ActivityComponentInfo.kt
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.core
+
+import android.content.ComponentName
+
+/**
+ * A class to hold simple information from [android.content.ComponentName] like the package and
+ * the class name.
+ */
+internal class ActivityComponentInfo(
+    val packageName: String,
+    val className: String
+) {
+
+    constructor(componentName: ComponentName) : this(
+        componentName.packageName,
+        componentName.className
+    )
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as ActivityComponentInfo
+
+        if (packageName != other.packageName) return false
+        if (className != other.className) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = packageName.hashCode()
+        result = 31 * result + className.hashCode()
+        return result
+    }
+
+    override fun toString(): String {
+        return "ClassInfo { packageName: $packageName, className: $className }"
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt b/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt
index fd3d828..9014a3d 100644
--- a/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt
+++ b/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt
@@ -19,7 +19,10 @@
 import android.content.ComponentName
 import android.content.Intent
 import android.util.Log
+import androidx.window.core.ActivityComponentInfo
 import androidx.window.core.ExperimentalWindowApi
+import androidx.window.embedding.MatcherUtils.isActivityOrIntentMatching
+import androidx.window.embedding.MatcherUtils.isIntentMatching
 import androidx.window.embedding.MatcherUtils.sDebugMatchers
 import androidx.window.embedding.MatcherUtils.sMatchersTag
 
@@ -29,7 +32,7 @@
  * name.
  */
 @ExperimentalWindowApi
-class ActivityFilter(
+class ActivityFilter internal constructor(
     /**
      * Component name in the intent for the activity. Must be non-empty. Can contain a single
      * wildcard at the end. Supported formats:
@@ -38,18 +41,36 @@
      *   - `package/suffix.*`
      *   - `*/*`
      */
-    val componentName: ComponentName,
+    internal val activityComponentInfo: ActivityComponentInfo,
     /**
      * Action used for activity launch intent.
      *
      * To match with intents based only on the [Intent.getAction], use a wildcard (&#42/&#42) with
-     * [componentName].
+     * [activityComponentInfo].
      */
-    val intentAction: String?
+    internal val intentAction: String?
 ) {
+
+    /**
+     * Constructs a new [ActivityFilter] using a [ComponentName] and an [Intent] action.
+     *
+     * @param componentName Component name in the intent for the activity. Must be non-empty. Can
+     * contain a single wildcard at the end. Supported formats:
+     *   - package/class
+     *   - `package/*`
+     *   - `package/suffix.*`
+     *   - `*/*`
+     * @param intentAction Action used for activity launch intent. To match with intents based only
+     * on the [Intent.getAction], use a wildcard (&#42/&#42) with [componentName].
+     */
+    constructor(componentName: ComponentName, intentAction: String?) : this(
+        ActivityComponentInfo(componentName),
+        intentAction
+    )
+
     init {
-        val packageName = componentName.packageName
-        val className = componentName.className
+        val packageName = activityComponentInfo.packageName
+        val className = activityComponentInfo.className
         require(
             packageName.isNotEmpty()
         ) { "Package name must not be empty" }
@@ -71,8 +92,7 @@
     }
 
     fun matchesIntent(intent: Intent): Boolean {
-        val match =
-            if (!MatcherUtils.isIntentMatching(intent, componentName)) {
+        val match = if (!isIntentMatching(intent, activityComponentInfo)) {
                 false
             } else {
                 intentAction == null || intentAction == intent.action
@@ -89,7 +109,7 @@
 
     fun matchesActivity(activity: Activity): Boolean {
         val match =
-            MatcherUtils.isActivityOrIntentMatching(activity, componentName) &&
+            isActivityOrIntentMatching(activity, activityComponentInfo) &&
                 (intentAction == null || intentAction == activity.intent?.action)
         if (sDebugMatchers) {
             val matchString = if (match) "MATCH" else "NO MATCH"
@@ -101,23 +121,31 @@
         return match
     }
 
+    fun <T : Activity> matchesClassName(clazz: Class<T>): Boolean {
+        return activityComponentInfo.className == clazz.name
+    }
+
+    fun <T : Activity> matchesClassNameOrWildCard(clazz: Class<T>?): Boolean {
+        return clazz?.let(::matchesClassName) ?: activityComponentInfo.className.contains("*")
+    }
+
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is ActivityFilter) return false
 
-        if (componentName != other.componentName) return false
+        if (activityComponentInfo != other.activityComponentInfo) return false
         if (intentAction != other.intentAction) return false
 
         return true
     }
 
     override fun hashCode(): Int {
-        var result = componentName.hashCode()
+        var result = activityComponentInfo.hashCode()
         result = 31 * result + (intentAction?.hashCode() ?: 0)
         return result
     }
 
     override fun toString(): String {
-        return "ActivityFilter(componentName=$componentName, intentAction=$intentAction)"
+        return "ActivityFilter(componentName=$activityComponentInfo, intentAction=$intentAction)"
     }
-}
\ No newline at end of file
+}
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 0ceb16b..4116482 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
@@ -20,8 +20,6 @@
 import android.app.Activity
 import android.content.Intent
 import android.view.WindowMetrics
-import androidx.window.core.ExperimentalWindowApi
-import androidx.window.core.PredicateAdapter
 import androidx.window.extensions.embedding.ActivityRule as OEMActivityRule
 import androidx.window.extensions.embedding.ActivityRule.Builder as ActivityRuleBuilder
 import androidx.window.extensions.embedding.EmbeddingRule as OEMEmbeddingRule
@@ -30,6 +28,8 @@
 import androidx.window.extensions.embedding.SplitPairRule.Builder as SplitPairRuleBuilder
 import androidx.window.extensions.embedding.SplitPlaceholderRule as OEMSplitPlaceholderRule
 import androidx.window.extensions.embedding.SplitPlaceholderRule.Builder as SplitPlaceholderRuleBuilder
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.core.PredicateAdapter
 import androidx.window.extensions.WindowExtensionsProvider
 
 /**
diff --git a/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt b/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt
index 2574912..71cace1 100644
--- a/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt
+++ b/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt
@@ -19,6 +19,7 @@
 import android.content.ComponentName
 import android.content.Intent
 import android.util.Log
+import androidx.window.core.ActivityComponentInfo
 import androidx.window.core.ExperimentalWindowApi
 
 /**
@@ -31,6 +32,18 @@
         activityComponent: ComponentName?,
         ruleComponent: ComponentName
     ): Boolean {
+        val activityActivityComponentInfo = activityComponent?.let(::ActivityComponentInfo)
+        return areComponentsMatching(
+            activityActivityComponentInfo,
+            ActivityComponentInfo(ruleComponent)
+        )
+    }
+
+    /** Checks component match allowing wildcard patterns. */
+    internal fun areComponentsMatching(
+        activityComponent: ActivityComponentInfo?,
+        ruleComponent: ActivityComponentInfo
+    ): Boolean {
         if (activityComponent == null) {
             return ruleComponent.packageName == "*" && ruleComponent.className == "*"
         }
@@ -60,9 +73,9 @@
      */
     internal fun isActivityOrIntentMatching(
         activity: Activity,
-        ruleComponent: ComponentName
+        ruleComponent: ActivityComponentInfo
     ): Boolean {
-        if (areComponentsMatching(activity.componentName, ruleComponent)) {
+        if (areComponentsMatching(ActivityComponentInfo(activity.componentName), ruleComponent)) {
             return true
         }
         // Returns false if activity's intent doesn't exist or its intent doesn't match.
@@ -75,16 +88,20 @@
      */
     internal fun isIntentMatching(
         intent: Intent,
-        ruleComponent: ComponentName
+        ruleActivityComponentInfo: ActivityComponentInfo
     ): Boolean {
         if (intent.component != null) {
             // Compare the component if set.
-            return areComponentsMatching(intent.component, ruleComponent)
+            return areComponentsMatching(
+                intent.component?.let(::ActivityComponentInfo),
+                ruleActivityComponentInfo
+            )
         }
         // Check if there is wildcard match for Intent that only specifies the packageName.
         val packageName = intent.`package` ?: return false
-        return (packageName == ruleComponent.packageName ||
-            wildcardMatch(packageName, ruleComponent.packageName)) && ruleComponent.className == "*"
+        return (packageName == ruleActivityComponentInfo.packageName ||
+            wildcardMatch(packageName, ruleActivityComponentInfo.packageName)) &&
+            ruleActivityComponentInfo.className == "*"
     }
 
     /**
@@ -110,4 +127,4 @@
 
     internal const val sDebugMatchers = SplitController.sDebug
     internal const val sMatchersTag = "SplitRuleResolution"
-}
\ No newline at end of file
+}
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitPairFilter.kt b/window/window/src/main/java/androidx/window/embedding/SplitPairFilter.kt
index f13ddd5..4e09377 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitPairFilter.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitPairFilter.kt
@@ -19,6 +19,7 @@
 import android.content.ComponentName
 import android.content.Intent
 import android.util.Log
+import androidx.window.core.ActivityComponentInfo
 import androidx.window.core.ExperimentalWindowApi
 import androidx.window.embedding.MatcherUtils.areComponentsMatching
 import androidx.window.embedding.MatcherUtils.isIntentMatching
@@ -56,6 +57,10 @@
      */
     val secondaryActivityIntentAction: String?
 ) {
+
+    private val secondaryActivityInfo: ActivityComponentInfo
+        get() = ActivityComponentInfo(secondaryActivityName)
+
     fun matchesActivityPair(primaryActivity: Activity, secondaryActivity: Activity): Boolean {
         // Check if the activity component names match
         var match = areComponentsMatching(primaryActivity.componentName, primaryActivityName) &&
@@ -86,7 +91,7 @@
         ) {
             false
         } else if (
-            !isIntentMatching(secondaryActivityIntent, secondaryActivityName)
+            !isIntentMatching(secondaryActivityIntent, secondaryActivityInfo)
         ) {
             false
         } else {
diff --git a/window/window/src/test/java/androidx/window/core/ActivityComponentInfoTest.kt b/window/window/src/test/java/androidx/window/core/ActivityComponentInfoTest.kt
new file mode 100644
index 0000000..64823b7
--- /dev/null
+++ b/window/window/src/test/java/androidx/window/core/ActivityComponentInfoTest.kt
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.core
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+/**
+ * Unit test for [ActivityComponentInfo] to check [Object.equals] and [Object.hashCode].
+ */
+class ActivityComponentInfoTest {
+
+    @Test
+    fun equalsImpliesSameHashCode() {
+        val first = ActivityComponentInfo(PACKAGE_NAME, CLASS_NAME)
+        val second = ActivityComponentInfo(PACKAGE_NAME, CLASS_NAME)
+
+        assertEquals(first, second)
+        assertEquals(first.hashCode(), second.hashCode())
+    }
+
+    companion object {
+        const val PACKAGE_NAME = "package"
+        const val CLASS_NAME = "ClassName"
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/test/java/androidx/window/embedding/ActivityFilterTest.kt b/window/window/src/test/java/androidx/window/embedding/ActivityFilterTest.kt
index 8d9987a..c54e6f3 100644
--- a/window/window/src/test/java/androidx/window/embedding/ActivityFilterTest.kt
+++ b/window/window/src/test/java/androidx/window/embedding/ActivityFilterTest.kt
@@ -16,10 +16,12 @@
 
 package androidx.window.embedding
 
-import android.content.ComponentName
+import android.app.Activity
+import androidx.window.core.ActivityComponentInfo
 import androidx.window.core.ExperimentalWindowApi
-import com.nhaarman.mockitokotlin2.mock
-import com.nhaarman.mockitokotlin2.whenever
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
 import org.junit.Test
 
 /**
@@ -30,32 +32,66 @@
 
     @Test(expected = IllegalArgumentException::class)
     fun packageNameMustNotBeEmpty() {
-        val component = componentName("", "class")
-        ActivityFilter(component, null)
+        val activityComponentInfo = ActivityComponentInfo(EMPTY, FAKE_CLASS)
+        ActivityFilter(activityComponentInfo, null)
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun classNameMustNotBeEmpty() {
-        val component = componentName("package", "")
-        ActivityFilter(component, null)
+        val activityComponentInfo = ActivityComponentInfo(FAKE_PACKAGE, EMPTY)
+        ActivityFilter(activityComponentInfo, null)
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun packageNameCannotContainWildcard() {
-        val component = componentName("fake.*.package", "class")
-        ActivityFilter(component, null)
+        val activityComponentInfo = ActivityComponentInfo(FAKE_PACKAGE_WILDCARD_INSIDE, FAKE_CLASS)
+        ActivityFilter(activityComponentInfo, null)
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun classNameCannotContainWildcard() {
-        val component = componentName("package", "fake.*.class")
-        ActivityFilter(component, null)
+        val activityComponentInfo = ActivityComponentInfo(FAKE_PACKAGE, FAKE_CLASS_WILDCARD_INSIDE)
+        ActivityFilter(activityComponentInfo, null)
     }
 
-    private fun componentName(pkg: String, cls: String?): ComponentName {
-        return mock<ComponentName>().apply {
-            whenever(this.packageName).thenReturn(pkg)
-            whenever(this.className).thenReturn(cls)
-        }
+    @Test
+    fun equalsImpliesSameHashCode() {
+        val first = ActivityFilter(ActivityComponentInfo(FAKE_PACKAGE, FAKE_CLASS), null)
+        val second = ActivityFilter(ActivityComponentInfo(FAKE_PACKAGE, FAKE_CLASS), null)
+
+        assertEquals(first, second)
+        assertEquals(first.hashCode(), second.hashCode())
     }
-}
\ No newline at end of file
+
+    @Test
+    fun matchesClassName() {
+        val filter = ActivityFilter(
+            ActivityComponentInfo(FAKE_PACKAGE, Activity::class.java.name),
+            null
+        )
+        assertTrue(filter.matchesClassName(Activity::class.java))
+        assertFalse(filter.matchesClassName(FakeClass::class.java))
+    }
+
+    @Test
+    fun matchesWildCard() {
+        val filter = ActivityFilter(
+            ActivityComponentInfo(FAKE_PACKAGE, FAKE_CLASS_WILDCARD_VALID),
+            null
+        )
+
+        assertTrue(filter.matchesClassNameOrWildCard<Activity>(null))
+        assertFalse(filter.matchesClassNameOrWildCard(Activity::class.java))
+    }
+
+    private class FakeClass : Activity()
+
+    companion object {
+        private const val EMPTY: String = ""
+        private const val FAKE_PACKAGE: String = "fake.package"
+        private const val FAKE_PACKAGE_WILDCARD_INSIDE = "fake.*.package"
+        private const val FAKE_CLASS: String = "FakeClass"
+        private const val FAKE_CLASS_WILDCARD_INSIDE = "fake.*.FakeClass"
+        private const val FAKE_CLASS_WILDCARD_VALID = "fake.class.*"
+    }
+}
diff --git a/window/window/src/test/java/androidx/window/embedding/MatcherUtilsTest.kt b/window/window/src/test/java/androidx/window/embedding/MatcherUtilsTest.kt
new file mode 100644
index 0000000..325bcf4
--- /dev/null
+++ b/window/window/src/test/java/androidx/window/embedding/MatcherUtilsTest.kt
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.core.ActivityComponentInfo
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.embedding.MatcherUtils.areComponentsMatching
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+/**
+ * Unit tests for [MatcherUtils].
+ */
+@OptIn(ExperimentalWindowApi::class)
+class MatcherUtilsTest {
+
+    @Test
+    fun areComponentsMatching_wildcardTrue() {
+        assertTrue(areComponentsMatching(null, WILDCARD_ACTIVITY_COMPONENT_INFO))
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun areComponentsMatching_wildcardActivityComponentThrows() {
+        areComponentsMatching(WILDCARD_ACTIVITY_COMPONENT_INFO, FAKE_ACTIVITY_COMPONENT_INFO)
+    }
+
+    @Test
+    fun areComponentsMatching_samePackageWildcardClass() {
+        assertTrue(
+            areComponentsMatching(
+                FAKE_ACTIVITY_COMPONENT_INFO,
+                PACKAGE_WILDCARD_ACTIVITY_COMPONENT_INFO
+            )
+        )
+    }
+
+    @Test
+    fun areComponentsMatching_sameClassWildcardPackage() {
+        assertTrue(
+            areComponentsMatching(
+                FAKE_ACTIVITY_COMPONENT_INFO,
+                CLASS_WILDCARD_ACTIVITY_COMPONENT_INFO
+            )
+        )
+    }
+
+    @Test
+    fun areComponentsMatching_falseIfDifferent() {
+        val nonMatchingActivityComponentInfo = ActivityComponentInfo(
+            "other.$FAKE_PACKAGE",
+            "Other$FAKE_CLASS"
+        )
+        assertFalse(
+            areComponentsMatching(FAKE_ACTIVITY_COMPONENT_INFO, nonMatchingActivityComponentInfo)
+        )
+    }
+
+    companion object {
+        private const val FAKE_PACKAGE = "fake.package"
+        private const val FAKE_CLASS = "FakeClass"
+        private const val WILDCARD = "*"
+        private val WILDCARD_ACTIVITY_COMPONENT_INFO = ActivityComponentInfo(WILDCARD, WILDCARD)
+        private val FAKE_ACTIVITY_COMPONENT_INFO = ActivityComponentInfo(FAKE_PACKAGE, FAKE_CLASS)
+        private val PACKAGE_WILDCARD_ACTIVITY_COMPONENT_INFO = ActivityComponentInfo(
+            WILDCARD,
+            FAKE_CLASS
+        )
+        private val CLASS_WILDCARD_ACTIVITY_COMPONENT_INFO = ActivityComponentInfo(
+            FAKE_PACKAGE,
+            WILDCARD
+        )
+    }
+}
diff --git a/work/work-inspection/build.gradle b/work/work-inspection/build.gradle
index 2fd5382..5f2ca92 100644
--- a/work/work-inspection/build.gradle
+++ b/work/work-inspection/build.gradle
@@ -59,12 +59,3 @@
     }
     namespace "androidx.work.inspection"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += [
-                "-opt-in=kotlin.RequiresOptIn"
-        ]
-    }
-}
diff --git a/work/work-runtime-ktx/build.gradle b/work/work-runtime-ktx/build.gradle
index 31966ce..0eaaf9c 100644
--- a/work/work-runtime-ktx/build.gradle
+++ b/work/work-runtime-ktx/build.gradle
@@ -50,11 +50,3 @@
 android {
     namespace "androidx.work.ktx"
 }
-
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}